예스스탁
예스스탁 답변
2018-07-26 14:35:07
안녕하세요
예스스탁입니다.
일부 잘못된 부분이 있어 수정했습니다.
참고하셔서 수정보완해 사용하시기 바랍니다.
var HHMMSS,HHMMSS1;
var count1, count2, count3, count4, count5;
var M1;
function Main_OnStart()
{
//1번 타이머 5초간격, 지정한 간격으로 시간체크하기 위한 용도
Main.SetTimer(1, 5000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
HHMMSS1 = HHMMSS;
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//종목1(MarketData1)
// 첫매수
if (nEventID == 1 && HHMMSS >= 매수시간1 && HHMMSS1 < 매수시간1)
{
//지정한 금액만큼 매도3호가로 매수주문
var BuyPrice1 = MarketData1.Ask(3);
var Bvol1 = Math.floor(매수금액1/BuyPrice1);
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Bvol1,BuyPrice1,0);
if (분할매수횟수1 >= 2)
{
//2번 타이머(종목1 추가매수 간격)
Main.SetTimer(2, 분할매수시간간격1*1000);
count2 = 1;
}
}
//2번타이머 동작
//종목1(MarketData1) 추가매수(첫매수 후 N초 단위로)
if (nEventID == 2)
{
//지정한 분할횟수보다 작으면
if (count2 < 분할매수횟수1)
{
//타이머 동작횟수 카운트
count2 = count2+1;
//추가 매수 실행
var BuyPrice1 = MarketData1.Ask(3);
var Bvol1 = Math.floor(매수금액1/BuyPrice1);
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Bvol1,BuyPrice1,0);
}
//지정한 분할횟수에 도달하면
if (count2 == 분할매수횟수1)
{
//2번 타이머 종료
Main.KillTimer(2);
}
}
//종목1(MarketData1) 첫매도
if (nEventID == 1 && HHMMSS >= 매도시간1 && HHMMSS1 < 매도시간1)
{
//종목1에 대한 매수 미체결 모두 취소
var num1 = Account1.GetTheNumberOfUnfills()
for(var i = 1 ; i < num1 ; i++)
{
Account1.SetUnfill(i);
if (Account1.Unfill.orderKind == 2 && Account1.Unfill.count > 0 &&
Account1.Unfill.code == MarketData1.code)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
//종목1 잔고셋팅
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
//잔고수량
Xvol1 = Account1.Balance.count;
if (분할매도횟수1 >= 2)
{
var V1 = Math.floor(Xvol1/분할매도횟수1);
Xvol11 = Xvol1 - V1*(분할매도횟수1-1);
Xvol12 = V1;
}
else
{
Xvol11 = Xvol1;
}
var SellPrice1 = MarketData1.Bid(3);
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Xvol11,SellPrice1,0);
if (분할매도횟수1 >= 2)
{
//3번 타이머,10초 타이머(분할매도 간격)
Main.SetTimer(3, 10000);
count3 = 1;
}
}
//종목1(MarketData1) 추가매수(첫매수 후 N초 단위로)
if (nEventID == 3)
{
if (count3 < 분할매도횟수1)
{
count3 = count3+1;
var SellPrice = MarketData1.Bid(3);
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Xvol12,SellPrice,0);
}
if (count3 == 분할매도횟수1)
{
Main.KillTimer(2);
}
}
//종목2(MarketData2)
// 첫매수
if (nEventID == 1 && HHMMSS >= 매수시간2 && HHMMSS1 < 매수시간2)
{
//지정한 금액만큼 매도3호가로 매수주문
var BuyPrice2 = MarketData2.Ask(3);
var Bvol2 = Math.floor(매수금액2/BuyPrice2);
Account1.OrderBuy(Main.GetOrderCode(MarketData2.code),Bvol2,BuyPrice2,0);
if (분할매수횟수2 >= 2)
{
//2번 타이머(종목1 추가매수 간격)
Main.SetTimer(4, 분할매수시간간격2*1000);
count4 = 1;
}
}
//2번타이머 동작
//종목2(MarketData2) 추가매수(첫매수 후 N초 단위로)
if (nEventID == 4)
{
//카운트 값이 지정한 분할횟수 미만이면
if (count4 < 분할매수횟수2)
{
//타이머 동작횟수 카운트
count4 = count4+1;
//추가 매수 실행
var BuyPrice2 = MarketData2.Ask(3);
var Bvol2 = Math.floor(매수금액2/BuyPrice2);
Account1.OrderBuy(Main.GetOrderCode(MarketData2.code),Bvol2,BuyPrice2,0);
}
//지정한 분할횟수에 도달하면
if (count4 == 분할매수횟수1)
{
//4번 타이머 종료
Main.KillTimer(4);
}
}
//종목2(MarketData2) 첫매도
if (nEventID == 1 && HHMMSS >= 매도시간2 && HHMMSS1 < 매도시간2)
{
//종목2에 대한 매수 미체결 모두 취소
var num1 = Account1.GetTheNumberOfUnfills()
for(var i = 1 ; i < num1 ; i++)
{
Account1.SetUnfill(i);
if (Account1.Unfill.orderKind == 2 && Account1.Unfill.count > 0 &&
Account1.Unfill.code == MarketData2.code)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
//종목2 잔고셋팅
Account1.SetBalance(Main.GetOrderCode(MarketData2.code), 0);
//잔고수량
Xvol2 = Account1.Balance.count;
//분할매도횟수가 2이상일때
if (분할매도횟수2 >= 2)
{
//잔고수량을 지정한 횟수로 나누어 1회 주문할 수량 계산
var V2 = Math.floor(Xvol2/분할매도횟수2);
Xvol21 = Xvol2 - V2*(분할매도횟수2-1);
Xvol22 = V2;
}
else
{
Xvol21 = Xvol2;
}
var SellPrice2 = MarketData2.Bid(3);
Account1.OrderSell(Main.GetOrderCode(MarketData2.code),Xvol21,SellPrice2,0);
if (분할매도횟수2 >= 2)
{
//3번 타이머,10초 타이머(분할매도 간격)
Main.SetTimer(5, 10000);
//횟수 카운트 변수는 초기값 1
count5 = 1;
}
}
//종목1(MarketData2) 추가매수(첫매수 후 N초 단위로)
if (nEventID == 5)
{
//카운트 값이 분할매도횟수2 미만이면
if (count5 < 분할매도횟수2)
{
//타이저 동작할때 마다 1씩 증가
count5 = count5+1;
//추가매도 실행
var SellPrice2 = MarketData2.Bid(3);
Account1.OrderSell(Main.GetOrderCode(MarketData2.code),Xvol22,SellPrice2,0);
}
//카운트 값이 분할매도횟수와 같이면
if (count5 == 분할매도횟수2)
{
//5번타이머 종
Main.KillTimer(5);
}
}
}
즐거운 하루되세요
> 택군아 님이 쓴 글입니다.
> 제목 : 수식에 오류가 발생했습니다. 수정 부탁합니다.
> 안녕하세요.
고생이 많습니다.
문의번호 1722번 문의 관련입니다.
보내주신 수식을 예스트레이드로 돌려보니
아래와 같은 에러가 발생되네요.
수정부탁 드립니다.
<에러발생내역>
1. 줄번호 193 ReferenceError: count5 is not defined ->첨부파일1
2. 종목1(코스닥150인버스)첫매도시간을 외부변수에 지정된 시간(15:00시)에 매도가 되어야 하는데 매도가 되지않고 매수가됨 -> 첨부파일 2
3. 분활매수 횟수 및 매도횟수는 외부변로 지정하여 초기값이 3회분할매수 및 분할매도
하게끔되어 있으나 1또는 2회만 분할 매수 및 분할매도가 실행됨 -> 첨부파일2, 3
4. 첨부파일4는 보내주신 스팟코딩 자료입니다.
수정부탁합니다
<전략>
1. 장시작과 동시에 코덱스코스닥150선물 인버스 매수(251340) --> 인버스매수시간 외부변수로 지정, 인버스 분할매수횟수 외부변수로 지정
2. 매수한 코스닥150선물인버스를 15:00 에 매도 -> 매도시간 외부변수로 지정, 매도시 분할매도횟수 외부변수로 지정
3. 코덱스코스닥150레버리지(233740) 15:01에 매수 -> 코덱스코스닥150레버리지 매수시간 외부 변수로 지정, 분할매수횟수 외부변수로 지정
4. 매수한 코스닥150 레버리지 익일 시가에 매도 -> 매도시간 외부변수로 지정, 분할매도횟수 외부변수로 지정
5. 주식계좌에서 etf 매매비중(%)을 외부변수로 지정-> 예) 주식계좌에 1000만원 있을 때 500만원만 etf로 매매시의 비중