커뮤니티

문의 드립니다.

프로필 이미지
무결점
2014-06-24 09:55:48
1147
글번호 223042
답변완료
이동평균선 골든크로스 매수.(만약 급격한 시세 변동으로 주문거부가 될 경우 계속 시도) 이동평균선 데드크로스 매도.(만약 급격한 시세 변동으로 주문거부가 될 경우 계속 시도) * 매수하기전에 잔고를 확인해서 미결제가 있는지 없는지 확인해서 미결제가 있으면 청산한후 매수하고, 미결제가 없으면 바로 매수. * 매도하기전에 잔고를 확인해서 미결제가 있는지 없는지 확인해서 미결제가 있으면 청산한후 매도하고, 미결제가 없으면 바로 매도. ★ CME 거래소 같은 경우에는 프로텍션 보호법에 의해서 급격한 시세 변동시에 주문거부가 되는 경우가 있습니다... 그러면 진입신호가 거부가 될 경우 청산신호를 진입을 해버리는 문제가 발생하는데요. 그래서 신호가 거부되면 재차 다시 그 신호를 쏴주는걸 원합니다. 즉 매수신호→매수청산→매도신호→매도청산 여기서 매수신호가 거부되면 매수청산을 진입해 버리는 문제가 발생합니다. 그러므로 매수신호가 거부가 되면 계속 신호를 쏴서 매수를 체결시킨후에 그 다음으로 넘어가야 문제가 안생깁니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2014-07-03 16:17:11

안녕하세요 예스스탁입니다. 아래 내용 수정보완해 사용하시기 바랍니다. 기본개념은 진입신호에서 주문발생 --> 주문응답시 에러 --> 다시 주문입니다. 청산은 진입주문에 대해 체결이 발생해야 청산신호시 주문을 내게 됩니다. 이평골든데드는 시스템으로 작성후 차트에 적용하고 차트에서 신호발생하면 주문을 내게 하셔야 합니다. 스크립트 객체화면에서 차트객체 추가 --> 속성에서 객체명 Chart1, 아이디 지정후 차트에도 아이디 지정 종목객체 추가 --> 속성에서 객체명 MarketData1, 차트종목과 같은 종목으로 지정 계좌객체 추가 --> 속성에서 객체명 Account1, 계좌번호 지정 var BuyID,BuyNum,BuyStep; var SellID,SellNum,SellStep; function Main_OnStart() { BuySetp = 0; SellStep = 0; Start = 0; } function Chart1_OnRiseSignal(Signal) { if (Signal.signalKind == 1) { Start = 1; //차트에 해당 종목 잔고가 있으면 시장가로 청산 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0) { if (Account1.Balance.position == 1) Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); if (Account1.Balance.position == 2) Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,0,1); } //매수주문(매도5호가) BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5),0); BuyStep = 1; } if (Start == 1 && Signal.signalKind == 2) { if (BuyStep == 3) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5),0); BuyStep = 0; } } if (Signal.signalKind == 3) { Start = 1; //차트에 해당 종목 잔고가 있으면 시장가로 청산 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0) { if (Account1.Balance.position == 1) Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); if (Account1.Balance.position == 2) Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,0,1); } //매도주문(매수5호가) SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5),0); SellStep = 1; } if (Start == 1 && Signal.signalKind == 4) { if (SellStep == 3) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5),0); SellStep = 0; } } } //주문응답수신 function Main_OnOrderResponse(OrderResponse) { //매수주문에 대한 응답 if (BuyID == OrderResponse.orderID) { //에러메세지가 있으면 if (OrderResponse.error.length >= 1) { //에러메세지 출력 Main.MessageList(OrderResponse.error.length,OrderResponse.error) //다시 매수주문 BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5),0); } //에러메세지가 없으면 if (OrderResponse.error.length == 0) { BuyNum = OrderResponse.orderNum; BuyStep = 2; } } //매도주문에 대한 응답 if (SellID == OrderResponse.orderID) { //에러메세지가 있으면 if (OrderResponse.error.length >= 1) { //에러메세지 출력 Main.MessageList(OrderResponse.error.length,OrderResponse.error) //다시 매도주문 SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5),0); } //에러메세지가 없으면 if (OrderResponse.error.length == 0) { SellNum = OrderResponse.orderNum; SellStep = 2; } } } function Main_OnNotifyFill(NotifyFill) { if (BuyNum == NotifyFill.orderNum) { BuyStep = 3; } if (SellNum == NotifyFill.orderNum) { SellStep = 3; } } 즐거운 하루되세요 > 무결점 님이 쓴 글입니다. > 제목 : 문의 드립니다. > 이동평균선 골든크로스 매수.(만약 급격한 시세 변동으로 주문거부가 될 경우 계속 시도) 이동평균선 데드크로스 매도.(만약 급격한 시세 변동으로 주문거부가 될 경우 계속 시도) * 매수하기전에 잔고를 확인해서 미결제가 있는지 없는지 확인해서 미결제가 있으면 청산한후 매수하고, 미결제가 없으면 바로 매수. * 매도하기전에 잔고를 확인해서 미결제가 있는지 없는지 확인해서 미결제가 있으면 청산한후 매도하고, 미결제가 없으면 바로 매도. ★ CME 거래소 같은 경우에는 프로텍션 보호법에 의해서 급격한 시세 변동시에 주문거부가 되는 경우가 있습니다... 그러면 진입신호가 거부가 될 경우 청산신호를 진입을 해버리는 문제가 발생하는데요. 그래서 신호가 거부되면 재차 다시 그 신호를 쏴주는걸 원합니다. 즉 매수신호→매수청산→매도신호→매도청산 여기서 매수신호가 거부되면 매수청산을 진입해 버리는 문제가 발생합니다. 그러므로 매수신호가 거부가 되면 계속 신호를 쏴서 매수를 체결시킨후에 그 다음으로 넘어가야 문제가 안생깁니다.