커뮤니티

수식에 오류가 없는지 점검부탁드립니다

프로필 이미지
디톡스
2019-02-20 17:40:59
3098
글번호 224737
답변완료
아래 식은 선물 10개 진입 주문후 1. 일부만 체결되고 나머지 미체결된 후 청산신호발생한 경우 미체결분량은 취소하고 체결된 것만 청산주문함 2. 청산주문 중 일부만 체결되고 나머지 미체결시 미체결부분은 30초 경과시 우선 2호가 주문함 을 작성한 것입니다. 1) 스팟이 처음이라 이것저것 예제보고 붙여넣기해서 작성해보았는데요... 잘 작성된 것인지 점검부탁드립니다.^^ 2) 그리고, 청산주문 중 일부만 체결되고 나머지 미체결시 미체결부분은 30초 경과시 시장가주문하려면 어떻게 작성해야하는지 좀 알려주세요.... 3) 그리고, 예를 들어, 10계약 매수진입 후 매도신호 발생시 20개 매도 주문(10개는 청산, 10개는 신규 매도)이 들어갔을때 그 중 15개만 매도 체결된 경우 스팟에서는 우선 10개는 signalkind == 2로 잡고 나머지 5개만 signalkind == 3으로 잡히는거 맞나요? var EntryVol = 10; //진입수량 var BEid,BEnum,SEid,SEnum,BEidx,SEidx,BEnumx,SEnumx; function Main_OnStart() { Main.MessageList("스팟시작"); } function Chart1_OnRiseSignal(Signal) { //Buy신호 발생하면 10개약 매수1호가로 매수 if (T == 0 && Signal.signalKind == 1) { T = 1; BEid = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Bid(1),0); } //Exitlong신호 발생하면 if (T == 1 && Signal.signalKind == 2) { T = 0; //매수진입의 주문번호로 미체결 객체 셋팅 Account1.SetUnfill(BEnum); //미체결이 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(BEnum) } //잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); //보유한 매수포지션이 있으면 매도1호가로 전량 매도(청산) if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BEidx = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Ask(1),0); } } //Sell신호 발생하면 10개약 매도1호가로 매도 if (T == 0 && Signal.signalKind == 3) { T = -1; SEid = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Ask(1),0); } if (T == -1 && Signal.signalKind == 4) { T = 0; //매도진입의 주문번호로 미체결 객체 셋팅 Account1.SetUnfill(SEnum); //미체결이 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(SEnum) } //잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); //보유한 매도포지션이 있으면 매수1호가로 전량 매수(청산) if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SEidx = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Bid(1),0); } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BEid) { BEnum = OrderResponse.orderNum; } if (OrderResponse.orderID == SEid) { SEnum = OrderResponse.orderNum; } if (OrderResponse.orderID == BEidx) { BEnumx = OrderResponse.orderNum; Main.SetTimer(1,30000); } if (OrderResponse.orderID == SEidx) { SEnumx = OrderResponse.orderNum; Main.SetTimer(2,30000); } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Account1.SetUnfill(BEnumx); //매수포지션 청산주문후 미체결이 있으면 잔고셋팅 if (Account1.Unfill.count > 0) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); } // 30초 경과시 매수2호가 정정주문 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderReplacePrice(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Bid(2),0); Main.KillTimer(1); } } if (nEventID == 2) { Account1.SetUnfill(SEnumx); //매도포지션 청산주문후 미체결이 있으면 잔고셋팅 if (Account1.Unfill.count > 0) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); } // 30초 경과시 매도2호가 정정주문 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderReplacePrice(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Ask(2),0); Main.KillTimer(2); } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2019-03-12 17:11:31

안녕하세요 예스스탁입니다. 1 예스스팟은 저희가 수식을 검증해 드리지 않습니다. 저희가 해당 게시판에 답변드리는 수식도 단순히 전체 흐름에 대한 가이드일 뿐입니다. 예스스팟은 자바스크립트로 코딩 가능한 분들께 제공해 드리는 프로그램입니다. 모든 수식은 사용자분 책임하에 작성하시고 테스트 완료후 사용하셔야 합니다. 2 청산주문후 정정주문 발생하는 부분만 수정해 드립니다 청산 주문후 주문번호를 BEnumx,SEnumx에 저장하므로 30초 후에 해당 주문번호로 미체결 셋팅하고 수량이 남아 있으면 주문번호와 가격만 지정해 정정하시면 됩니다. var EntryVol = 10; //진입수량 var BEid,BEnum,SEid,SEnum,BEidx,SEidx,BEnumx,SEnumx; function Main_OnStart() { Main.MessageList("스팟시작"); } function Chart1_OnRiseSignal(Signal) { //Buy신호 발생하면 10개약 매수1호가로 매수 if (T == 0 && Signal.signalKind == 1) { T = 1; BEid = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Bid(1),0); } //Exitlong신호 발생하면 if (T == 1 && Signal.signalKind == 2) { T = 0; //매수진입의 주문번호로 미체결 객체 셋팅 Account1.SetUnfill(BEnum); //미체결이 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(BEnum) } //잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); //보유한 매수포지션이 있으면 매도1호가로 전량 매도(청산) if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BEidx = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Ask(1),0); } } //Sell신호 발생하면 10개약 매도1호가로 매도 if (T == 0 && Signal.signalKind == 3) { T = -1; SEid = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Ask(1),0); } if (T == -1 && Signal.signalKind == 4) { T = 0; //매도진입의 주문번호로 미체결 객체 셋팅 Account1.SetUnfill(SEnum); //미체결이 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(SEnum) } //잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); //보유한 매도포지션이 있으면 매수1호가로 전량 매수(청산) if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SEidx = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Bid(1),0); } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BEid) { BEnum = OrderResponse.orderNum; } if (OrderResponse.orderID == SEid) { SEnum = OrderResponse.orderNum; } if (OrderResponse.orderID == BEidx) { BEnumx = OrderResponse.orderNum; Main.SetTimer(1,30000); } if (OrderResponse.orderID == SEidx) { SEnumx = OrderResponse.orderNum; Main.SetTimer(2,30000); } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.KillTimer(1); Account1.SetUnfill(BEnumx); if (Account1.Unfill.count > 0) { Account1.OrderReplacePrice(BEnumx, MarketData1.Bid(2)) } } if (nEventID == 2) { Main.KillTimer(2); Account1.SetUnfill(SEnumx); // 30초 경과시 매도2호가 정정주문 if (Account1.Unfill.count > 0) { Account1.OrderReplacePrice(SEnumx, MarketData1.Ask(2)) } } } 3 시장가로 주문하려면 주문을 취소하고 새로 주문 발생하야 합니다. var EntryVol = 10; //진입수량 var BEid,BEnum,SEid,SEnum,BEidx,SEidx,BEnumx,SEnumx,BX,SX; function Main_OnStart() { Main.MessageList("스팟시작"); } function Chart1_OnRiseSignal(Signal) { //Buy신호 발생하면 10개약 매수1호가로 매수 if (T == 0 && Signal.signalKind == 1) { T = 1; BEid = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Bid(1),0); } //Exitlong신호 발생하면 if (T == 1 && Signal.signalKind == 2) { T = 0; //매수진입의 주문번호로 미체결 객체 셋팅 Account1.SetUnfill(BEnum); //미체결이 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(BEnum) } //잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); //보유한 매수포지션이 있으면 매도1호가로 전량 매도(청산) if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BEidx = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Ask(1),0); } } //Sell신호 발생하면 10개약 매도1호가로 매도 if (T == 0 && Signal.signalKind == 3) { T = -1; SEid = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Ask(1),0); } if (T == -1 && Signal.signalKind == 4) { T = 0; //매도진입의 주문번호로 미체결 객체 셋팅 Account1.SetUnfill(SEnum); //미체결이 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(SEnum) } //잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); //보유한 매도포지션이 있으면 매수1호가로 전량 매수(청산) if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SEidx = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Bid(1),0); } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BEid) { BEnum = OrderResponse.orderNum; } if (OrderResponse.orderID == SEid) { SEnum = OrderResponse.orderNum; } if (OrderResponse.orderID == BEidx) { BEnumx = OrderResponse.orderNum; Main.SetTimer(1,30000); } if (OrderResponse.orderID == SEidx) { SEnumx = OrderResponse.orderNum; Main.SetTimer(2,30000); } if (OrderResponse.orderID == BX) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1) } } if (OrderResponse.orderID == SX) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1) } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.KillTimer(1); Account1.SetUnfill(BEnumx); if (Account1.Unfill.count > 0) { BX = Account1.OrderCancel(BEnumx); } } if (nEventID == 2) { Main.KillTimer(2); Account1.SetUnfill(SEnumx); // 30초 경과시 매도2호가 정정주문 if (Account1.Unfill.count > 0) { SX = Account1.OrderCancel(BEnumx); } } } 4 signalkind는 차트에서 발생한 신호의 종류입니다. 주문의 체결여부와는 관계없습니다. 계좌포지션을 리턴해 주는 함수가 아닙니다. 실제 계좌이면 10주 매수포지션 가진 상태에서 20개 매도주문 발생하고 15개만 체결되면 5개만 매도포지션으로 가지게 되고 미체결이 매도 5개가 남아있는 상태가 됩니다. 즐거운 하루되세요 > 디톡스 님이 쓴 글입니다. > 제목 : 수식에 오류가 없는지 점검부탁드립니다 > 아래 식은 선물 10개 진입 주문후 1. 일부만 체결되고 나머지 미체결된 후 청산신호발생한 경우 미체결분량은 취소하고 체결된 것만 청산주문함 2. 청산주문 중 일부만 체결되고 나머지 미체결시 미체결부분은 30초 경과시 우선 2호가 주문함 을 작성한 것입니다. 1) 스팟이 처음이라 이것저것 예제보고 붙여넣기해서 작성해보았는데요... 잘 작성된 것인지 점검부탁드립니다.^^ 2) 그리고, 청산주문 중 일부만 체결되고 나머지 미체결시 미체결부분은 30초 경과시 시장가주문하려면 어떻게 작성해야하는지 좀 알려주세요.... 3) 그리고, 예를 들어, 10계약 매수진입 후 매도신호 발생시 20개 매도 주문(10개는 청산, 10개는 신규 매도)이 들어갔을때 그 중 15개만 매도 체결된 경우 스팟에서는 우선 10개는 signalkind == 2로 잡고 나머지 5개만 signalkind == 3으로 잡히는거 맞나요? var EntryVol = 10; //진입수량 var BEid,BEnum,SEid,SEnum,BEidx,SEidx,BEnumx,SEnumx; function Main_OnStart() { Main.MessageList("스팟시작"); } function Chart1_OnRiseSignal(Signal) { //Buy신호 발생하면 10개약 매수1호가로 매수 if (T == 0 && Signal.signalKind == 1) { T = 1; BEid = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Bid(1),0); } //Exitlong신호 발생하면 if (T == 1 && Signal.signalKind == 2) { T = 0; //매수진입의 주문번호로 미체결 객체 셋팅 Account1.SetUnfill(BEnum); //미체결이 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(BEnum) } //잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); //보유한 매수포지션이 있으면 매도1호가로 전량 매도(청산) if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { BEidx = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Ask(1),0); } } //Sell신호 발생하면 10개약 매도1호가로 매도 if (T == 0 && Signal.signalKind == 3) { T = -1; SEid = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Ask(1),0); } if (T == -1 && Signal.signalKind == 4) { T = 0; //매도진입의 주문번호로 미체결 객체 셋팅 Account1.SetUnfill(SEnum); //미체결이 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(SEnum) } //잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); //보유한 매도포지션이 있으면 매수1호가로 전량 매수(청산) if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { SEidx = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Bid(1),0); } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BEid) { BEnum = OrderResponse.orderNum; } if (OrderResponse.orderID == SEid) { SEnum = OrderResponse.orderNum; } if (OrderResponse.orderID == BEidx) { BEnumx = OrderResponse.orderNum; Main.SetTimer(1,30000); } if (OrderResponse.orderID == SEidx) { SEnumx = OrderResponse.orderNum; Main.SetTimer(2,30000); } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Account1.SetUnfill(BEnumx); //매수포지션 청산주문후 미체결이 있으면 잔고셋팅 if (Account1.Unfill.count > 0) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); } // 30초 경과시 매수2호가 정정주문 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderReplacePrice(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Bid(2),0); Main.KillTimer(1); } } if (nEventID == 2) { Account1.SetUnfill(SEnumx); //매도포지션 청산주문후 미체결이 있으면 잔고셋팅 if (Account1.Unfill.count > 0) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); } // 30초 경과시 매도2호가 정정주문 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderReplacePrice(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Ask(2),0); Main.KillTimer(2); } } }