매수와 매도를 모두 종목검색으로 하는 경우에 이용하는 식입니다.
1.
전략내용
매수조건 만족한 종목과 매도조건 만족한 종목을 동시에 검색을 해서
보유수량이 없고 오늘 처음 매수조건에 만족해 검색되면 매수
보유수량이 있고 오늘 처음 매도조건에 만족해 검색되면 매도하는 식입니다.
2.
예스랭귀지 종목검색식
if 조건 then
find(1);
일반적으로 종목검색은 위와 같이 특정조건이 만족하면 검색을 하고 결과값으로 1을 주게 작성합니다.
if 매수조건 then
find(1);
if 매도조건 then
find(-1);
매수조건과 매도조건을 동시에 찾고 어떤 조건에 만족해서 검색되었는지 구분해야 하므로
매수조건이 만족하면 1, 매도조건이 만족하면 -1을 결과값으로 리턴하게 해서
종목검색식을 작성하고 사용자검색조건으로 등록해 이용하면 됩니다.
3.
스크립트 객체화면 설정
계좌객체를 추가한 후 속성에서 객체명은 Account1으로 지정하고 계좌번호로 지정합니다.
4.
사용자검색조건 설정
스팟에서는 Main.ReqPowerSearch(”사용자검색조건명”); 함수로 종목검색을 수행하게 되는데
이때 지정하는 사용자검색조건명은 예스랭귀지로 작성한 종목검색식의 이름이 아닙니다.
종목검색식 자체는 아이디어를 코딩한 내용뿐이고 주기등 세부설정이 있지 않습니다.
좌측의 리스트에서 작성한 종목검색식이나 시장검색등을 선택해서
우측 조건리스트에 추가하고 주기등 필요한 설정을 완료한 후에
조건저장 버튼을 클릭하면 이름을 지정해서 사용자검색조건으로 저장이 되고
스팟수식에는 이렇게 저장한 사용자검색조건명을 지정해 주셔야 합니다.
※예 스랭귀지로 작성한 종목검색식은 문법검증이 완료되면
파워종목검색화면의 좌측 리스트의 기술적지표에 추가가 됩니다.
5.
스팟수식
var SearchName = "사용자검색조건명";
var 검색주기 = 10;
var 매수금액 = 1000000;
var MKList = [],MKvalue = [];
var MK = [];
var req;
function Main_OnStart()
{
//1번 타이머, 60초
Main.SetTimer(1, 검색주기*1000);
}
//타이머 동작
function Main_OnTimer(nEventID)
{
var d = new Date();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//1번 타이머 동작하고 9시 이후
if (nEventID == 1 && HHMMSS >= 90000 && HHMMSS <= 150000)
{
//타이머 종료
Main.KillTimer(1);
//종목검색 수행
Main.ReqPowerSearch(SearchName);
}
if (nEventID == 2)
{
Main.KillTimer(2);
//재요청
Main.ReqMarketData(MKList[req]);
}
}
//종목검색완료
function Main_OnRcvItemList(aItemList, nCount, aValues)
{
Main.MessageList("검색된종목수",nCount);
//검색된 종목이 한종목 이상
if (nCount >= 1)
{
MKList = [];
MKvalue = [];
if (MK.length == 0)
{
for (var i = 0; i < nCount; i++)
{
Account1.SetBalance(aItemList[i], 0);
if ((aValues[i] == 1 && Account1.Balance.count == 0) ||
(aValues[i] == -1 && Account1.Balance.count > 0))
{
MKList.push(aItemList[i]);
MKvalue.push(aValues[i]);
}
}
}
else
{
for (var i = 0; i < nCount; i++)
{
var Add = true;
//기존 매수나 매도주문 종목 제외
for (var x = 0; x < MK.length; x++)
{
if (MK[x].code == aItemList[i])
{
Add = false;
}
}
if (Add == true)
{
Account1.SetBalance(aItemList[i], 0);
if ((aValues[i] == 1 && Account1.Balance.count == 0) ||
(aValues[i] == -1 && Account1.Balance.count > 0))
{
MKList.push(aItemList[i]);
MKvalue.push(aValues[i]);
}
}
}
}
Main.MessageList("주문할 종목수:",MKList.length);
if (MKList.length == 0)
{
Main.SetTimer(1, 검색주기*1000);
}
else
{
req = 0;
Main.MessageList(req,"종목객체요청",MKList[req]);
Main.ReqMarketData(MKList[req]);
}
}
}
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == MKList[req])
{
Main.MessageList(req,"종목객체생성",MarketData.code);
MK.push(MarketData);
//결고값이 1인 종목이면(매수)
if (MKvalue[req] == 1)
{
//매수주문가격 매도3호가
var OP = MarketData.Ask(3);
//수량
var OV = Math.floor(매수금액/OP);
Account1.OrderBuy(MarketData.code,OV,OP,0);
Main.MessageList(req,"매수주문",MarketData.code,OV,OP);
}
//결고값이 -1인 종목이면(매도)
if (MKvalue[req] == -1)
{
Account1.SetBalance(MarketData.code, 0);
if (Account1.Balance.count > 0)
{
//매도주문가격 매수3호가
var OP = MarketData.Bid(3);
Account1.OrderSell(MarketData.code,Account1.Balance.count,OP,0);
Main.MessageList(req,"매도주문",MarketData.code,Account1.Balance.count,OP);
}
}
req = req+1;
if (req < MKList.length)
{
Main.MessageList(req,"종목객체요청",MKList[req]);
var XX = Main.ReqMarketData(MKList[req]);
//종목객체 생성제한
if (XX == -1)
{
//2번 타이머 15초
Main.SetTimer(2,15000);
}
}
else
{
Main.MessageList(req,"종목객체생성끝");
Main.SetTimer(1,검색주기*1000);
}
}
}
JavaScript
복사
