커뮤니티

스팟수식 부탁드립니다.

프로필 이미지
swhinc
2020-06-29 07:17:08
3164
글번호 225257
답변완료
예스랭귀지 차트 신호대로 매매를 하려고 하는데 스팟을 이용하면 주문 체결 여부나 오류발생 때 대응할 수 있다고 해서 공부해보려고 했으나 너무 어렵네요.. 1. 미니나스닥 신호대로 마이크로 나스닥 4계약 매매 2. 접수된 주문이 없고, 포지션이 없을 때, -진입 미완성 신호 = 무시 -진입 완성신호 = 현재가로 주문. 접수된 주문이 없고, 포지션이 있을 때, -청산 미완성/완성 신호 = 시장가 주문. 3. 주문 후 5초안에 오류가 발생하거나 체결이 안되면 기존 주문 취소 후 체결 될 때까지 5초마다 시장가로 재주문 1번은 차트객체 추가해서 미니나스닥 차트아이디 적용하고, 종목객체 추가해서 마이크로 나스닥 지정했고 계약수를 4로 어디서 바꾸죠? 2번은 도움말, 답변보면서 눈치껏 적었는데 의도한대로 작성됬는지 모르겠네요 3번은 어떻게 추가해야할지 잘 모르겠어요 -------------스크립트 시작------------- var Position; var BID; var SID; var Snum; var Bnum; function Main_OnStart() { Main.MessageList("Start"); Position = 0; } //(ExitLong)(ExitShort) //시스템미완성 신호 발생 function Chart1_OnRiseIncompleteSignal(IncompleteSignal) { // Position = 1일때 ExitLong 미완성 신호 발생하면 if (IncompleteSignal.signalKind == 2 && Position == 1) { //포지션 설정 Position = 0 ; //BNum 매수주문번호에 대해 미체결된 숫자설정 Account1.SetUnfillOrderNumber(BNum); //미체결된 매수수량이 0 이상이면 취소주문 if(Account1.Unfill.Count > 0) Account1.OrderCancel(BNum); //잔고 셋팅 Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code)); //잔고수량 0 이상, 매수포지션일때 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //잔고 수량 모두 시장가 청산(매도주문) Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1); Main.MessageList("----------------"); Main.MessageList("매수청산",Position) } } // Position = -1일때 ExitShort 미완성 신호 발생하면 if (IncompleteSignal.signalKind == 4 && Position == -1) { //포지션 설정 Position = 0 ; // SNum 매도주문번호에 대해 미체결된 숫자설정 Account1.SetUnfillOrderNumber(SNum); //미체결된 매도수량이 0 이상이면 취소주문 if (Account1.Unfill.count > 0) Account1.OrderCancel(SNum); //잔고 셋팅 Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code)); //잔고수량 0 이상, 매도포지션일때 if (Account1.Unfill.count > 0 && Account1.Balance.position == -1) { //잔고 수량 모두 시장가 청산(매수주문) Account1.OrderBuy(Main.GetOrderCode(MarketData1.code)); Main.MessageList("----------------"); Main.MessageList("매도청산",Position) } } } //(Buy)(Sell) //완성 신호 발생 function Chart1_OnRiseSignal(Signal) { //Position = 0일때 buy 완성 신호 최초발생하면 if (Signal.signalKind == 1 && Position == 0 ) { BID = Account1.OrderBuy(Main.GetOrderCode(MarketData11.code), Math.abs(Signal.count), 0, 1 ); Position = 1 ; Main.MessageList("----------------"); Main.MessageList("매수진입", Position); } //Position = 0일때 Sell 완성 신호 최초발생하면 if (Signal.signalKind == 3 && Position == 0) { SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Math.abs(Signal.count), 0, 1 ); Position = -1 ; Main.MessageList("----------------"); Main.MessageList("매도진입", Position); } // Position = 1일때 ExitLong 완성 신호 발생하면 if (Signal.signalKind == 2 && Position == 1) { //포지션 설정 Position = 0 ; //BNum 매수주문번호에 대해 미체결된 숫자설정 Account1.SetUnfillOrderNumber(BNum); //미체결된 매수수량이 0 이상이면 취소주문 if(Account1.Unfill.Count > 0) Account1.OrderCancel(BNum); //잔고 셋팅 Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code)); //잔고수량 0 이상, 매수포지션일때 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //잔고 수량 모두 시장가 청산(매도주문) Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1); Main.MessageList("----------------"); Main.MessageList("매수청산",Position) } } // Position = -1일때 ExitShort 완성 신호 발생하면 if (Signal.signalKind == 4 && Position == -1) { //포지션 설정 Position = 0 ; // SNum 매도주문번호에 대해 미체결된 숫자설정 Account1.SetUnfillOrderNumber(SNum); //미체결된 매도수량이 0 이상이면 취소주문 if (Account1.Unfill.count > 0) Account1.OrderCancel(SNum); //잔고 셋팅 Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code)); //잔고수량 0 이상, 매도포지션일때 if (Account1.Unfill.count > 0 && Account1.Balance.position == -1) { //잔고 수량 모두 시장가 청산(매수주문) Account1.OrderBuy(Main.GetOrderCode(MarketData1.code)); Main.MessageList("----------------"); Main.MessageList("매도청산",Position) } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //Position이 1인 상태에서 주문응답아이디와 BID가 같으면 //BNum에 주문번호 저장 if (Position == 1 && OrderResponse.orderID == BID) { BNum = OrderResponse.orderNum; } //Position이 -1인 상태에서 주문응답아이디와 SID가 같으면 //SNum에 주문번호 저장 if (Position == -1 && OrderResponse.orderID == SID) { SNum = OrderResponse.orderNum; } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2020-07-21 15:10:54

안녕하세요 예스스탁입니다. 1 올리신 글에 진입이 현재가인데 시장가로 되어 있어 현재가로 수정했습니다. 2 매도청산에 종목코드만 지정되어 있어 잔고수량과 시장가 옵션을 추가했습니다. 3 주문함수의 2번쨰 매개변수가 수량을 지정하는 부분입니다 진입에 잔고수량으로 수량이 설정되어 있어 변수 계약수로 처리했습니다. 4 Account1.SetBalanceIndex는 계좌의 리스트의 순서로 종목잔고를 지정하는 함수입니다 종목코드로 지정할 때는 Account1.SetBalanceItem함수를 이용하셔야 합니다. 5 Account1.Balance.position 잔고의 포지션은 매도면 1, 매수면 2입니다. -1은 존재하지 않습니다. 6 시장가 주문을 접수가 되었는데 취소 후에 재주문하는 것은 의미가 없습니다. 주문 접수에 에러가 난 경우에만 재주문하게 작성해 드립니다. 7 스팟의 수식답변은 식작성의 가이드 입니다. 테스트해보시고 수정보완해 완성하시기 바랍니다. 8 var 계약수 = 4; var Position; var BEID,BECID,BXID,BV,SV; var SEID,SECID,SXID; var Snum; var Bnum; function Main_OnStart() { Main.MessageList("Start"); Position = 0; } //(ExitLong)(ExitShort) //시스템미완성 신호 발생 function Chart1_OnRiseIncompleteSignal(IncompleteSignal) { // Position = 1일때 ExitLong 미완성 신호 발생하면 if (IncompleteSignal.signalKind == 2 && Position == 1) { //포지션 설정 Position = 0 ; //Bnum 매수주문번호에 대해 미체결된 숫자설정 Account1.SetUnfillOrderNumber(Bnum); //미체결된 매수수량이 0 이상이면 취소주문 if(Account1.Unfill.Count > 0) { Account1.OrderCancel(Bnum); } //잔고 셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code),0); //잔고수량 0 이상, 매수포지션일때 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //잔고 수량 모두 시장가 청산(매도주문) BXID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1); Main.MessageList("----------------"); Main.MessageList("매수청산",Position) } } // Position = -1일때 ExitShort 미완성 신호 발생하면 if (IncompleteSignal.signalKind == 4 && Position == -1) { //포지션 설정 Position = 0 ; // Snum 매도주문번호에 대해 미체결된 숫자설정 Account1.SetUnfillOrderNumber(Snum); //미체결된 매도수량이 0 이상이면 취소주문 if (Account1.Unfill.count > 0) { Account1.OrderCancel(Snum); } //잔고 셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code),0); //잔고수량 0 이상, 매도포지션일때 if (Account1.Unfill.count > 0 && Account1.Balance.position == 1) { //잔고 수량 모두 시장가 청산(매수주문) SXID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1); Main.MessageList("----------------"); Main.MessageList("매도청산",Position) } } } //(Buy)(Sell) //완성 신호 발생 function Chart1_OnRiseSignal(Signal) { //Position = 0일때 buy 완성 신호 최초발생하면 if (Signal.signalKind == 1 && Position == 0 ) { BV = 계약수; BEID = Account1.OrderBuy(Main.GetOrderCode(MarketData11.code), BV, MarketData1.current, 2 ); //매수진입주문번호 초기값 -1 Bnum = -1; Position = 1 ; Main.MessageList("----------------"); Main.MessageList("매수진입", Position); } //Position = 0일때 Sell 완성 신호 최초발생하면 if (Signal.signalKind == 3 && Position == 0) { SV = 계약수; SEID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), SV, MarketData1.current, 2 ); //매도진입주문번호 초기값 -1 Snum = -1; Position = -1 ; Main.MessageList("----------------"); Main.MessageList("매도진입", Position); } // Position = 1일때 ExitLong 완성 신호 발생하면 if (Signal.signalKind == 2 && Position == 1) { //포지션 설정 Position = 0 ; //Bnum 매수주문번호에 대해 미체결된 숫자설정 Account1.SetUnfillOrderNumber(Bnum); //미체결된 매수수량이 0 이상이면 취소주문 if(Account1.Unfill.Count > 0) { Account1.OrderCancel(Bnum); } //잔고 셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code),0); //잔고수량 0 이상, 매수포지션일때 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //잔고 수량 모두 시장가 청산(매도주문) BXID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1); Main.MessageList("----------------"); Main.MessageList("매수청산",Position) } } // Position = -1일때 ExitShort 완성 신호 발생하면 if (Signal.signalKind == 4 && Position == -1) { //포지션 설정 Position = 0 ; // Snum 매도주문번호에 대해 미체결된 숫자설정 Account1.SetUnfillOrderNumber(Snum); //미체결된 매도수량이 0 이상이면 취소주문 if (Account1.Unfill.count > 0) { Account1.OrderCancel(Snum); } //잔고 셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code),0); //잔고수량 0 이상, 매도포지션일때 if (Account1.Unfill.count > 0 && Account1.Balance.position == 1) { //잔고 수량 모두 시장가 청산(매수주문) SXID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1); Main.MessageList("----------------"); Main.MessageList("매도청산",Position) } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //Position이 1인 상태에서 주문응답아이디와 BEID가 같으면 if (Position == 1 && OrderResponse.orderID == BEID) { //주문이 정상접수이면 Bnum에 주문번호 저장 if (OrderResponse.isNormal == true) { Bnum = OrderResponse.orderNum; //지정가 주문일 경우 1번타이머 5초(시장가정상접수이면 타이머 동작안함) if (OrderResponse.priceKind == 2) { Main.SetTimer(1, 5000); } } else { //주문거부일 경우 1번타이머 5초 Main.SetTimer(1, 5000); } } //매수진입주문 취소주문이 발생하면 나머지 수량을 시장가로 주문 if (Position == 1 && OrderResponse.orderID == BECID) { //매수주문번호는 -1로 초기화 Bnum = -1; BEID = Account1.OrderBuy(Main.GetOrderCode(MarketData11.code), BV,0, 1); } //매수청산 주문이 접수거부 if (OrderResponse.orderID == BXID) { if (OrderResponse.isNormal == false) { Main.SetTimer(2, 5000); } } //Position이 -1인 상태에서 주문응답아이디와 SEID가 같으면 if (Position == -1 && OrderResponse.orderID == SEID) { //주문이 정상접수이면 Bnum에 주문번호 저장 if (OrderResponse.isNormal == true) { Bnum = OrderResponse.orderNum; //지정가 주문일 경우 3타이머 5초(시장가정상접수이면 타이머 동작안함) if (OrderResponse.priceKind == 2) { Main.SetTimer(3, 5000); } } else { //주문거부일 경우 3번타이머 5초 Main.SetTimer(3, 5000); } } //매도진입주문 취소주문이 발생하면 나머지 수량을 시장가로 주문 if (Position == 1 && OrderResponse.orderID == SECID) { //매수주문번호는 -1로 초기화 Snum = -1; SEID = Account1.OrderSell(Main.GetOrderCode(MarketData11.code), SV,0, 1); } //매도청산 주문이 접수거부 if (OrderResponse.orderID == SXID) { if (OrderResponse.isNormal == false) { Main.SetTimer(4, 5000); } } } function Main_OnTimer(nEventID) { //1번 타이머 동작 if (nEventID == 1) { //타이머 종료 Main.KillTimer(1); //지정가 주문이 정상접수되어 번호가 저장된 상태이면 if (Bnum >= 0) { //미체결셋팅 Account1.SetUnfillOrderNumber(Bnum); //미체결이 있으면 if (Account1.Unfill.count > 0) { //미체결 수량 저장하고 BV = Account1.Unfill.count; //주문취소 하고 취소주문 응답시에 시장가로 주문 BECID = Account1.OrderCancel(Bnum); } } else //주문접수가 거부이면 { //시장가로 주문 BID = Account1.OrderBuy(Main.GetOrderCode(MarketData11.code),BV,0,1); } } if (nEventID == 2) { Main.KillTimer(2); //잔고 셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code),0); //잔고수량 0 이상, 매수포지션일때 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //잔고 수량 모두 시장가 청산(매도주문) BXID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1); } } //3번 타이머 동작 if (nEventID == 1) { //타이머 종료 Main.KillTimer(3); //지정가 주문이 정상접수되어 번호가 저장된 상태이면 if (Snum >= 0) { //미체결셋팅 Account1.SetUnfillOrderNumber(Snum); //미체결이 있으면 if (Account1.Unfill.count > 0) { //미체결 수량 저장하고 SV = Account1.Unfill.count; //주문취소 하고 취소주문 응답시에 시장가로 주문 SECID = Account1.OrderCancel(Snum); } } else //주문접수가 거부이면 { //시장가로 주문 SEID = Account1.OrderSell(Main.GetOrderCode(MarketData11.code),SV,0,1); } } if (nEventID == 4) { Main.KillTimer(4); //잔고 셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code),0); //잔고수량 0 이상, 매수포지션일때 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { //잔고 수량 모두 시장가 청산(매수주문) SXID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1); } } } 즐거운 하루되세요 > swhinc 님이 쓴 글입니다. > 제목 : 스팟수식 부탁드립니다. > 예스랭귀지 차트 신호대로 매매를 하려고 하는데 스팟을 이용하면 주문 체결 여부나 오류발생 때 대응할 수 있다고 해서 공부해보려고 했으나 너무 어렵네요.. 1. 미니나스닥 신호대로 마이크로 나스닥 4계약 매매 2. 접수된 주문이 없고, 포지션이 없을 때, -진입 미완성 신호 = 무시 -진입 완성신호 = 현재가로 주문. 접수된 주문이 없고, 포지션이 있을 때, -청산 미완성/완성 신호 = 시장가 주문. 3. 주문 후 5초안에 오류가 발생하거나 체결이 안되면 기존 주문 취소 후 체결 될 때까지 5초마다 시장가로 재주문 1번은 차트객체 추가해서 미니나스닥 차트아이디 적용하고, 종목객체 추가해서 마이크로 나스닥 지정했고 계약수를 4로 어디서 바꾸죠? 2번은 도움말, 답변보면서 눈치껏 적었는데 의도한대로 작성됬는지 모르겠네요 3번은 어떻게 추가해야할지 잘 모르겠어요 -------------스크립트 시작------------- var Position; var BID; var SID; var Snum; var Bnum; function Main_OnStart() { Main.MessageList("Start"); Position = 0; } //(ExitLong)(ExitShort) //시스템미완성 신호 발생 function Chart1_OnRiseIncompleteSignal(IncompleteSignal) { // Position = 1일때 ExitLong 미완성 신호 발생하면 if (IncompleteSignal.signalKind == 2 && Position == 1) { //포지션 설정 Position = 0 ; //BNum 매수주문번호에 대해 미체결된 숫자설정 Account1.SetUnfillOrderNumber(BNum); //미체결된 매수수량이 0 이상이면 취소주문 if(Account1.Unfill.Count > 0) Account1.OrderCancel(BNum); //잔고 셋팅 Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code)); //잔고수량 0 이상, 매수포지션일때 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //잔고 수량 모두 시장가 청산(매도주문) Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1); Main.MessageList("----------------"); Main.MessageList("매수청산",Position) } } // Position = -1일때 ExitShort 미완성 신호 발생하면 if (IncompleteSignal.signalKind == 4 && Position == -1) { //포지션 설정 Position = 0 ; // SNum 매도주문번호에 대해 미체결된 숫자설정 Account1.SetUnfillOrderNumber(SNum); //미체결된 매도수량이 0 이상이면 취소주문 if (Account1.Unfill.count > 0) Account1.OrderCancel(SNum); //잔고 셋팅 Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code)); //잔고수량 0 이상, 매도포지션일때 if (Account1.Unfill.count > 0 && Account1.Balance.position == -1) { //잔고 수량 모두 시장가 청산(매수주문) Account1.OrderBuy(Main.GetOrderCode(MarketData1.code)); Main.MessageList("----------------"); Main.MessageList("매도청산",Position) } } } //(Buy)(Sell) //완성 신호 발생 function Chart1_OnRiseSignal(Signal) { //Position = 0일때 buy 완성 신호 최초발생하면 if (Signal.signalKind == 1 && Position == 0 ) { BID = Account1.OrderBuy(Main.GetOrderCode(MarketData11.code), Math.abs(Signal.count), 0, 1 ); Position = 1 ; Main.MessageList("----------------"); Main.MessageList("매수진입", Position); } //Position = 0일때 Sell 완성 신호 최초발생하면 if (Signal.signalKind == 3 && Position == 0) { SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Math.abs(Signal.count), 0, 1 ); Position = -1 ; Main.MessageList("----------------"); Main.MessageList("매도진입", Position); } // Position = 1일때 ExitLong 완성 신호 발생하면 if (Signal.signalKind == 2 && Position == 1) { //포지션 설정 Position = 0 ; //BNum 매수주문번호에 대해 미체결된 숫자설정 Account1.SetUnfillOrderNumber(BNum); //미체결된 매수수량이 0 이상이면 취소주문 if(Account1.Unfill.Count > 0) Account1.OrderCancel(BNum); //잔고 셋팅 Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code)); //잔고수량 0 이상, 매수포지션일때 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //잔고 수량 모두 시장가 청산(매도주문) Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, 0, 1); Main.MessageList("----------------"); Main.MessageList("매수청산",Position) } } // Position = -1일때 ExitShort 완성 신호 발생하면 if (Signal.signalKind == 4 && Position == -1) { //포지션 설정 Position = 0 ; // SNum 매도주문번호에 대해 미체결된 숫자설정 Account1.SetUnfillOrderNumber(SNum); //미체결된 매도수량이 0 이상이면 취소주문 if (Account1.Unfill.count > 0) Account1.OrderCancel(SNum); //잔고 셋팅 Account1.SetBalanceIndex(Main.GetOrderCode(MarketData1.code)); //잔고수량 0 이상, 매도포지션일때 if (Account1.Unfill.count > 0 && Account1.Balance.position == -1) { //잔고 수량 모두 시장가 청산(매수주문) Account1.OrderBuy(Main.GetOrderCode(MarketData1.code)); Main.MessageList("----------------"); Main.MessageList("매도청산",Position) } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //Position이 1인 상태에서 주문응답아이디와 BID가 같으면 //BNum에 주문번호 저장 if (Position == 1 && OrderResponse.orderID == BID) { BNum = OrderResponse.orderNum; } //Position이 -1인 상태에서 주문응답아이디와 SID가 같으면 //SNum에 주문번호 저장 if (Position == -1 && OrderResponse.orderID == SID) { SNum = OrderResponse.orderNum; } }