커뮤니티

수식 수정 요청드립니다.

프로필 이미지
종호
2017-11-04 16:54:38
2887
글번호 224236
답변완료
아래수식은 무포지션일 때 최초 매수가 들어가고 그 이후에 최초 매수가격에 상방으로 첫진입 체결후 3틱 상승시 마다 매수주문이 들어 가고 있습니다. 그런데 최초 진입이나 중간에서 진입이나 1개가 될 때도 있지만 동시에 여러개가 될 때가 많다는 것을 확인했습니다. 특히 거래량이 많고 순간적인 작은 1틱의 변화에 수 많은 복수 동시 진입이 되는 것을 확인했습니다. 1개의 진입이 체결돨 때까지 복수 진입신호를 허용하지 않아 1개의 수량만 진입이 되도록 부탁드립니다. 그리고 청산후에 다시 무포지션이 되어 재진입이 될 때가 있고 안될 때가 있습니다. 이것도 수정해 주시면 감사하겠습니다. Account1.Refresh() 기능도 추가 되었으면 좋겠습니다. //종목객체 MarketData1 --> 속성에서 주문낼 종목으로 지정 //계좌객체 Account1 --> 주문낼 계좌 var BuyID,BuyNum,FPrice; //스팟시작 function Main_OnStart() { //MarketData1종목 잔고셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //내부파일에 FPrice에 적어놓은 값을 가져와 다시 변수에 저장 var aa = Main.GetUserValue("FPrice"); if (aa == "" || Account1.Balance.count == 0) FPrice = 0; else FPrice = aa; } function Main_OnUp*dateMarket(sItemCode, lUp*dateID) { if (lUp*dateID == 20001) { //무포지션에서 첫진입 if (Account1.Balance.count == 0 && FPrice == 0) { BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0,1); } //첫진입 체결후 3틱 상승시 마다 매수주문 if (Account1.Balance.count > 0 && FPrice > 0 && MarketData1.current >= FPrice + MarketData1.GetTickSize()*3) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0,1); FPrice = FPrice + MarketData1.GetTickSize()*3; Main.SetUserValue("FPrice",FPrice); } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //주문번호저장 if (OrderResponse.orderID == BuyID ) { BuyNum = OrderResponse.orderNum; } } //체결응답 function Main_OnNotifyFill(NotifyFill) { //첫진입 체결가 저장 if (NotifyFill.orderNum == BuyNum) { FPrice = NotifyFill.fillPrice; Main.SetUserValue("FPrice",FPrice); } } //계좌잔고에서 MarketData1이 완전청산되면 FPrice 변수 0으로 셋팅 function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) { if (sItemCode == Main.GetOrderCode(MarketData1.code) && lUp*dateID == 30002) { FPrice = 0; Main.SetUserValue("FPrice",FPrice); } }
답변 2
프로필 이미지

예스스탁 예스스탁 답변

2017-11-21 18:02:53

안녕하세요 예스스탁입니다. 스팟 수식에 대한 답변은 전반적인 수식작성의 가이드정도 입니다. 세부적인 부분은 테스트하셔서 직접 수정보완하셔야 합니다. 이용에 참고하시기 바랍니다. 1 function Main_OnUp*dateMarket(sItemCode, lUp*dateID) { if (lUp*dateID == 20001) { if (Account1.Balance.count == 0 && FPrice == 0) { BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0,1); } 위 내용이면 현재 잔고가 없고 FPrice가 0이면 체결전까지 실시간으로 시세가 들어올때마다 계속 주문이 집행됩니다. 잔고가 없고 FPrice가 0이면 한번만 주문이 집행되게 하셔야 합니다. 2 추가진입도 체결확인하고 다음주문 발생하게 처리했습니다. 3 계좌리프레쉬는 1분마다 한번씩 작동하게 작성해 드립니다. 4 var BuyID,BuyNum,FPrice,Order,BBID,BBnum,RF; //스팟시작 function Main_OnStart() { //MarketData1종목 잔고셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //내부파일에 FPrice에 적어놓은 값을 가져와 다시 변수에 저장 var aa = Main.GetUserValue("FPrice"); if (aa == "" || Account1.Balance.count == 0) FPrice = 0; else FPrice = aa; Order = true; Main.SetTimer(1, 60000);//60초, 1000이 1초 } function Main_OnUp*dateMarket(sItemCode, lUp*dateID) { if (lUp*dateID == 20001) { //무포지션에서 첫진입 if (Order == true && RF == false && Account1.Balance.count == 0 && FPrice == 0) { BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0,1); FPrice = MarketData1.current; Order = false; } //첫진입 체결후 3틱 상승시 마다 매수주문 if (Order == true && && RF == false Account1.Balance.count > 0 && FPrice > 0 && MarketData1.current >= FPrice + MarketData1.GetTickSize()*3) { Order = false; BBID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0,1); FPrice = FPrice + MarketData1.GetTickSize()*3; Main.SetUserValue("FPrice",FPrice); } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //주문번호저장 if (OrderResponse.orderID == BuyID ) { BuyNum = OrderResponse.orderNum; } if (OrderResponse.orderID == BBID ) { BBNum = OrderResponse.orderNum; } } //체결응답 function Main_OnNotifyFill(NotifyFill) { //첫진입 체결가 저장 if (NotifyFill.orderNum == BuyNum) { FPrice = NotifyFill.fillPrice; Order = true; Main.SetUserValue("FPrice",FPrice); } if (NotifyFill.orderNum == BBNum) { Order = true; } } //계좌잔고에서 MarketData1이 완전청산되면 FPrice 변수 0으로 셋팅 function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) { if (sItemCode == Main.GetOrderCode(MarketData1.code) && lUp*dateID == 30002) { FPrice = 0; Main.SetUserValue("FPrice",FPrice); Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); } if (lUp*dateID == 30000) { Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); RF = false; } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Account1.Refresh(); RF = true; } } 즐거운 하루되세요 > 종호 님이 쓴 글입니다. > 제목 : 수식 수정 요청드립니다. > 아래수식은 무포지션일 때 최초 매수가 들어가고 그 이후에 최초 매수가격에 상방으로 첫진입 체결후 3틱 상승시 마다 매수주문이 들어 가고 있습니다. 그런데 최초 진입이나 중간에서 진입이나 1개가 될 때도 있지만 동시에 여러개가 될 때가 많다는 것을 확인했습니다. 특히 거래량이 많고 순간적인 작은 1틱의 변화에 수 많은 복수 동시 진입이 되는 것을 확인했습니다. 1개의 진입이 체결돨 때까지 복수 진입신호를 허용하지 않아 1개의 수량만 진입이 되도록 부탁드립니다. 그리고 청산후에 다시 무포지션이 되어 재진입이 될 때가 있고 안될 때가 있습니다. 이것도 수정해 주시면 감사하겠습니다. Account1.Refresh() 기능도 추가 되었으면 좋겠습니다. //종목객체 MarketData1 --> 속성에서 주문낼 종목으로 지정 //계좌객체 Account1 --> 주문낼 계좌 var BuyID,BuyNum,FPrice; //스팟시작 function Main_OnStart() { //MarketData1종목 잔고셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //내부파일에 FPrice에 적어놓은 값을 가져와 다시 변수에 저장 var aa = Main.GetUserValue("FPrice"); if (aa == "" || Account1.Balance.count == 0) FPrice = 0; else FPrice = aa; } function Main_OnUp*dateMarket(sItemCode, lUp*dateID) { if (lUp*dateID == 20001) { //무포지션에서 첫진입 if (Account1.Balance.count == 0 && FPrice == 0) { BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0,1); } //첫진입 체결후 3틱 상승시 마다 매수주문 if (Account1.Balance.count > 0 && FPrice > 0 && MarketData1.current >= FPrice + MarketData1.GetTickSize()*3) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1,0,1); FPrice = FPrice + MarketData1.GetTickSize()*3; Main.SetUserValue("FPrice",FPrice); } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //주문번호저장 if (OrderResponse.orderID == BuyID ) { BuyNum = OrderResponse.orderNum; } } //체결응답 function Main_OnNotifyFill(NotifyFill) { //첫진입 체결가 저장 if (NotifyFill.orderNum == BuyNum) { FPrice = NotifyFill.fillPrice; Main.SetUserValue("FPrice",FPrice); } } //계좌잔고에서 MarketData1이 완전청산되면 FPrice 변수 0으로 셋팅 function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) { if (sItemCode == Main.GetOrderCode(MarketData1.code) && lUp*dateID == 30002) { FPrice = 0; Main.SetUserValue("FPrice",FPrice); } }
프로필 이미지

종호

2017-11-28 16:36:41

종호 님에 의해 삭제된 답변입니다.