Search
📝

예제6. 차트연동 주문(다른 종목 주문)

차트에서 신호발생시 스팟으로 주문을 내는 수식입니다. 예제5와 다른 부분은 예제5는 차트에서 신호가 발생하면 차트의 기본종목으로 주문을 집행하게 됩니다. 아래는 차트에서 신호가 발생하면 다른 종목으로 주문을 내는 수식입니다.
1.
전략내용
신호가 발생하면 종목객체에서 지정한 종목을 주문을 하는데 진입신호가 발생하면 현재가로 주문 후 30초 후에 미체결이 있으면 취소를 하고 청산신호가 발생하면 미체결된 수량은 취소하고 체결된 수량으로 상대5호가 주문을 집행하게 됩니다.
2.
스크립트 객체화면 설정
차트객체 : 객체명 Chart1 → 속성에서 차트와 동일 아이디 지정 계좌객체 : 객체명 Account1 → 속성에서 계좌번호 선택 종목객체 : 객체명 MarketData1 → 속성에서 주문종목을 지정
3.
스팟수식
var OC, MK, pst; var BV,SV; var BID, SID, BNUM, SNUM; var 취소주문시간 = 30;//30초 function Main_OnStart() { Main.MessageList("Start"); //주문종목 종목코드 OC = Main.GetOrderCode(MarketData1.code); pst = 0; } function Chart1_OnRiseSignal(Signal) { //매수진입신호 발생 if (Signal.signalKind == 1) { //신호수량 저장 BV = Signal.count; //매수주문 집행(신호수량, 현재가 지정가) BID = Account1.OrderBuy(OC, BV, MarketData1.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, MarketData1.Bid(5), 0); } } //매도진입신호 발생 if (Signal.signalKind == 3) { //신호수량 저장 SV = Signal.count; //매도주문 집행(신호수량, 현재가 지정가) SID = Account1.OrderSell(OC, SV,MarketData1.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, MarketData1.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
복사