Search
📝

예제5. 차트연동 주문

차트에서 신호발생시 스팟으로 주문을 내는 수식입니다.
1.
전략내용
차트에서 진입신호가 발생하면 현재가로 주문 후 30초 후에 미체결이 있으면 취소를 하고 청산신호가 발생하면 미체결된 수량을 제외하고 상대5호가로 주문을 집행하게 됩니다.
2.
스크립트 객체화면 설정
차트객체 : 객체명 Chart1 → 속성에서 차트와 동일 아이디 지정
계좌객체 : 객체명 Account1 → 속성에서 계좌번호 선택
3.
스팟수식
var OC, MK, pst; var BID, SID, BNUM, SNUM; var 취소주문시간 = 30;//30초 function Main_OnStart() { Main.MessageList("Start"); //차트종목 종목코드 OC = Main.GetOrderCode(Chart1.GetCode(1)); //종목객체 요청 Main.ReqMarketData(OC); pst = 0; } function Main_OnRcvMarketData(MarketData) { if (MarketData.code == OC) { MK = MarketData; } } function Chart1_OnRiseSignal(Signal) { //매수진입신호 발생 if (Signal.signalKind == 1) { //신호수량 저장 BV = Signal.count; //매수주문 집행(신호수량, 현재가 지정가) BID = Account1.OrderBuy(OC, BV, MK.current,0); //포지션은 1 pst = 1; //1번 300초 타이머 셋팅 Main.SetTimer(1, 취소주문시간*1000); Main.MessageList("매수진입신호:",BV); } //스팟에서 매수진입 이후에 매수청산 신호 발생 if (pst == 1 && Signal.signalKind == 2) { //1번 타이머 종료 Main.KillTimer(1); //진입매수주문 미체결 객체 셋팅 Account1.SetUnfillOrderNumber(BNUM); //미체결이 있으면 if ( Account1.Unfill.count > 0 ) { //진입수량에서 미체결수량 차감 BV = BV-Account1.Unfill.count; //미체결 주문 취소 Account1.OrderCancel(BNUM); } Main.MessageList("매수청산:",BV); //매수진입수량에서 미체결수량 차감후 0이 아니면(진입전량 체결이나 일부체결) if (BV > 0) { //청산을 위해 매도주문 집행(수량은 BV, 매수5호가 지정가) Account1.OrderSell(OC, BV, MK.Bid(5), 0); } } //매도진입신호 발생 if (Signal.signalKind == 3) { //신호수량 저장 SV = Signal.count; //매도주문 집행(신호수량, 현재가 지정가) SID = Account1.OrderSell(OC, SV,MK.current,0); //포지션은 -1 pst = -1; //3번 300초 타이머 셋팅 Main.SetTimer(3, 취소주문시간*1000); Main.MessageList("매도진입신호:",SV); } //스팟에서 매도진입 이후에 매도청산 신호 발생 if (pst == -1 && Signal.signalKind == 4) { //3번 타이머 종료 Main.KillTimer(3); //진입매도주문 미체결 객체 셋팅 Account1.SetUnfillOrderNumber(SNUM); //미체결이 있으면 if ( Account1.Unfill.count > 0 ) { //진입수량에서 미체결수량 차감 SV = SV-Account1.Unfill.count; //미체결 주문 취소 Account1.OrderCancel(SNUM); } Main.MessageList("매도청산:",SV); //매도진입수량에서 미체결수량 차감후 0이 아니면(진입전량 체결이나 일부체결) if (SV > 0) { //청산을 위해 매수주문 집행(수량은 SV, 매도5호가 지정가) Account1.OrderBuy(OC, SV, MK.Ask(5), 0); } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //매수진입주문에 대한 응답이 오면 if (OrderResponse.orderID == BID) { //주문번호 저장 BNUM = OrderResponse.orderNum; } //매도진입주문에 대한 응답이 오면 if (OrderResponse.orderID == SID) { //주문번호 저장 SNUM = OrderResponse.orderNum; } } //타이머 실행 function Main_OnTimer(nEventID) { //1번타이머 if (nEventID == 1) { //타이머 종료 Main.KillTimer(1); //매수진입주문에 대해 미체결 셋팅 Account1.SetUnfillOrderNumber(BNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { //매수진입수량에서 미체결수량 차감 BV = BV-Account1.Unfill.count; Main.MessageList("매수진입취소:",BV); //미체결주문 취소 Account1.OrderCancel(BNUM); } } //3번타이머 if (nEventID == 3) { //타이머 종료 Main.KillTimer(3); //매도진입주문에 대해 미체결 셋팅 Account1.SetUnfillOrderNumber(SNUM); //미체결이 있으면 if (Account1.Unfill.count > 0) { //매수진입수량에서 미체결수량 차감 SV = SV-Account1.Unfill.count; Main.MessageList("매도진입취소:",SV); //미체결주문 취소 Account1.OrderCancel(SNUM); } } }
JavaScript
복사