커뮤니티

예스자동정정 기능을 예스스팟에서 구현부탁드려요

프로필 이미지
anyhelp
2014-08-07 15:05:30
1107
글번호 223115
답변완료
안녕하세요. 예스스팟을 사용하다보니 디비깅 기능이 예스트레이더보다 미약해서 세부오류 확인 및 정정은 실전에서 밖에는 안되더라구요. 더더구나 계좌 및 거래와 연계된 부분은 실제 돈이 투입되어야 하구요. 몇차례 같은 어려움을 겪으면서, 실제투자금이 오류잡는데 줄어드는 것을 보니 기능구현을 하면서도 많이 망설여지더라구요. 다름이 아니라, 이번에는 예스자동정정기능을 예스스팟으로 구현하려고 하는데 앞에 말씀드린 부분때문에 접근이 쉽지 않습니다. 그래서 예스자동정정기능의 개념을 예스스팟 로직으로 구현 부탁드립니다. 구체적인 요청사항은 예스트레이더 차트 신호를 받아서 각각의 경우 주문을 할때 예스자동정정과 유사한 방법의 주문이 정정되도록 작성 부탁드립니다. 1. 예스차트의 매수주문 신호시 ㅇ상대호가잔량/우선호가잔량 30% 미만시 or 상대호가잔량 30주 미만시 상대1호가 자동정정, 제한가격은 상대5호가 ㅇ60초 후에 상대5호가로 강제 정정주문 2. 예스차트의 매수청산 주문신호시 ㅇ상대호가잔량/우선호가잔량 30% 미만시 or 상대호가잔량 30주 미만시 상대1호가 자동정정, 제한가격은 상대5호가 ㅇ60초 후에 상대5호가로 강제 정정주문 도움 항상 감사드립니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2014-08-14 11:50:09

안녕하세요 예스스탁입니다. 예스스팟 답변은 가이드입니다. 아래내용 참고하셔서 수정보완해 사용하시기 바랍니다. 게시판 금칙어가 있어 Up*date로 되어 있습니다 *제거 하시기 바랍니다. 스크립트 객체 차트객체 --> Chart1 종목객체 --> MarketData1,차트와 같은 종목 계좌객체 --> Account1 var BidAskRate = 30; //% 상대호가잔량/우선호가잔량 비율 var MinBidsAsks = 30; //주(계약) 상대호가 잔량 미만 var ReplaceLevel = 1; //정정가격 var Limit = 5; //제한가격(0으로 하면 상하한가) var BuyVol,BuyFillVol,BuyID, BuyStep = 0,BuyPrice ; var BuyLimitPrice,BuyLimitEnd = false, BuyResponse = false; var SellVol,SellFillVol,SellID, SellStep = 0,SellPrice ; var SellLimitPrice,SellLimitEnd = false, SellResponse = false; function Main_OnStart() { function Chart1_OnRiseSignal(Signal) { if (BuyStep == 0 && Signal.signalKind == 1) { //최초주문후 체결까지 단계값을 저장할 변수 BuyStep = 1 //정정제한가격 if (Limit > 0) BuyLimitPrice = MarketData1.Ask(Limit); else BuyLimitPrice = MarketData1.limitUp; BuyLimitEnd = false; //제한가격까지 도달하면 정정을 중지할 변수 BuyVol = Signal.count; //진입수량 BuyFillVol = 0; //진입수량에 대한 체결수량을 저장할 변수 BuyResponse = false; //주문응답 여부를 체크할 변수 var Askv1 = MarketData1.AskAmount(1); var Bidv1 = MarketData1.BidAmount(1); var AskP1 = MarketData1.Ask(1); var BidP1 = MarketData1.Bid(1); //최초 주문 상대1잔량이 우선1잔량대비 지정% 미만이거나 지정수량 미만이면 상대1호가로 주문 //아니면 우선1호가로 주문 if (Askv1 < Bidv1*(BidAskRate/100) || Askv1 < MinBidsAsks) { BuyPrice = AskP1; BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), BuyVol, BuyPrice, 0); Main.MessageList("매수주문1 - ","주문아이디",BuyID,"주문가격",BuyPrice, "매도1잔량",Askv1,"매도1호가",AskP1,"매수1잔량",Bidv1,"매수1호가",BidP1); Main.SetTimer(1, 60000)//60초 } else { BuyPrice = BidP1; BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), BuyVol, BuyPrice, 0); Main.MessageList("매수주문2 - ","주문아이디",BuyID,"주문가격",BuyPrice, "매도1잔량",Askv1,"매도1호가",AskP1,"매수1잔량",Bidv1,"매수1호가",BidP1); Main.SetTimer(1, 60000)//60초 } } if (SellStep == 0 && Signal.signalKind == 2) { //최초주문후 체결까지 단계값을 저장할 변수 SellStep = 1 //정정제한가격 if (Limit > 0) SellLimitPrice = MarketData1.Bid(Limit); else SellLimitPrice = MarketData1.limitDn; SellLimitEnd = false; //제한가격까지 도달하면 정정을 중지할 변수 SellVol = Signal.count; //진입수량 SellFillVol = 0; //진입수량에 대한 체결수량을 저장할 변수 SellResponse = false; //주문응답 여부를 체크할 변수 var Askv1 = MarketData1.AskAmount(1); var Bidv1 = MarketData1.BidAmount(1); var AskP1 = MarketData1.Ask(1); var BidP1 = MarketData1.Bid(1); //최초 주문 상대1잔량이 우선1잔량대비 지정% 미만이거나 지정수량 미만이면 상대1호가로 주문 //아니면 우선1호가로 주문 if (Bidv1 < Askv1*(BidAskRate/100) || Bidv1 < MinBidsAsks) { SellPrice = BidP1; SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), SellVol, SellPrice, 0); Main.MessageList("매도주문1","주문아이디",SellID,"주문가격",SellPrice, "매도1잔량",Askv1,"매도1호가",AskP1,"매수1잔량",Bidv1,"매수1호가",BidP1); Main.SetTimer(2, 60000)//60초 } else { SellPrice = AskP1; SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), SellVol, SellPrice, 0); Main.MessageList("매도주문2","주문아이디",SellID,"주문가격",SellPrice, "매도1잔량",Askv1,"매도1호가",AskP1,"매수1잔량",Bidv1,"매수1호가",BidP1); Main.SetTimer(2, 60000)//60초 } } } //시세수신 function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//Up*date에서 *제거 { //매수단계가 2일때 MarketData1에 대한 업데이트가 있으면 if (BuyStep == 2 && sItemCode == MarketData1.code) { var Askv1 = MarketData1.AskAmount(1); var Bidv1 = MarketData1.BidAmount(1); var AskP1 = MarketData1.Ask(1); var BidP1 = MarketData1.Bid(1); if(BuyStep == 2) { Main.MessageList("시세수신 - ","매도1잔량",Askv1,"매도1호가",AskP1,"매수잔량1",Bidv1,"매수호가1",BidP1); } //상대1호가 잔량이 우선1호가 잔량대비 지정된 %미만이거나 지정된 수량미만이고 //매수가격이 우선1호가 이하이고 제한가격까지 도달하지 않았고 직전 주문응답이 완료된 상태이면 if ((Askv1 < Bidv1*(BidAskRate/100) || Askv1 < MinBidsAsks) && BuyPrice <= BidP1 && BuyLimitEnd == false && BuyResponse == true) { Main.MessageList("매수정정조건만족 - ","매도1잔량",Askv1,"매도1호가",AskP1,"매수1잔량",Bidv1, "매수호가1",BidP1,"직전주문가 - ",BuyPrice,"제한",BuyLimitEnd,"직전주문응답",BuyResponse); //정정가격이 제한가격미만이면 정정가격으로 주문 //이상이면 제한가격으로 주문하고 더이상 정정하지 않게 LimitEnd는 true BuyPrice = MarketData1.Ask(ReplaceLevel); if (BuyPrice >= BuyLimitPrice ) { BuyPrice = BuyLimitPrice; BuyLimitEnd = true; } //지정한 주문가격으로 정정주문 BuyID = Account1.OrderReplacePrice(BuyNum, BuyPrice); BuyResponse = false; Main.MessageList("매수정정주문 - ",BuyID,"주문가격",BuyPrice,"주문응답",BuyResponse); } } //매도단계가 2일때 MarketData1에 대한 업데이트가 있으면 if (SellStep == 2 && sItemCode == MarketData1.code) { var Askv1 = MarketData1.AskAmount(1); var Bidv1 = MarketData1.BidAmount(1); var AskP1 = MarketData1.Ask(1); var BidP1 = MarketData1.Bid(1); if(SellStep == 2) { Main.MessageList("시세수신 - ","매도1잔량",Askv1,"매도1호가",AskP1,"매수잔량1",Askv1,"매수호가1",BidP1); } //상대1호가 잔량이 우선1호가 잔량대비 지정된 %미만이거나 지정된 수량미만이고 //매수가격이 우선1호가 이하이고 제한가격까지 도달하지 않았고 직전 주문응답이 완료된 상태이면 if ((Bidv1 < Askv1*(BidAskRate/100) || Bidv1 < MinBidsAsks) && SellPrice >= AskP1 && SellLimitEnd == false && SellResponse == true) { Main.MessageList("매도정정조건만족 - ","매도1잔량",Askv1,"매도1호가",AskP1,"매수1잔량",Bidv1, "매수호가1",BidP1,"직전주문가",SellPrice,"제한",SellLimitEnd,"직전주문응답",SellResponse); //정정가격이 제한가격보다 크면 정정가격으로 주문 //이하이면 제한가격으로 주문하고 더이상 정정하지 않게 LimitEnd는 true SellPrice = MarketData1.Bid(ReplaceLevel); if (SellPrice <= SellLimitPrice ) { SellPrice = SellLimitPrice; SellLimitEnd = true; } //지정한 주문가격으로 정정주문 SellID = Account1.OrderReplacePrice(SellNum, SellPrice); SellResponse = false; Main.MessageList("매도정정주문- ",SellID,"주문가격",SellPrice,"주문응답",SellResponse); } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //주문후 BuyID와 같은 아이디의 응답이 오면 if (BuyStep >= 1 && OrderResponse.orderID == BuyID) { //주문번호 저장 BuyNum = OrderResponse.orderNum; //매수주문단계는 2 BuyStep = 2; //응답여부는 true BuyResponse = true; Main.MessageList("매수주문응답-","매수주문아이디",OrderResponse.orderID, "매수주문번호",BuyNum,"매수단계",BuyStep,"매수주문응답",BuyResponse) } //주문후 BuyID와 같은 아이디의 응답이 오면 if (SellStep >= 1 && OrderResponse.orderID == SellID) { //주문번호 저장 SellNum = OrderResponse.orderNum; //매수주문단계는 2 SellStep = 2; //응답여부는 true SellResponse = true; Main.MessageList("매도주문응답-","매도주문아이디",OrderResponse.orderID, "매도주문번호",SellNum,"매도단계",SellStep,"매도주문응답",SellResponse) } } //체결응답 function Main_OnNotifyFill(NotifyFill) { //매수주문단계가 2인상태에서 매수주문번호와 같은 주문번호의 체결응답이 수신되면 if (BuyStep == 2 && BuyNum == NotifyFill.orderNum) { //체결수량 누적 BuyFillVol = BuyFillVol+NotifyFill.fillCount; //체결수량이 주문수량과 같으면 매수단계는 0 if (BuyFillVol == BuyVol) { BuyStep = 0; Main.KillTimer(1); } Main.MessageList("매수체결응답-","주문번호",NotifyFill.orderNum, "누적체결",BuyFillVol,"주문수량",BuyVol,"매수단계",BuyStep); } //매수주문단계가 2인상태에서 매수주문번호와 같은 주문번호의 체결응답이 수신되면 if (SellStep == 2 && SellNum == NotifyFill.orderNum) { //체결수량 누적 SellFillVol = SellFillVol+NotifyFill.fillCount; //체결수량이 주문수량과 같으면 매수단계는 0 if (SellFillVol == SellVol) { SellStep = 0; Main.KillTimer(2); } Main.MessageList("매도체결응답-","주문번호",NotifyFill.orderNum, "누적체결",SellFillVol,"주문수량",SellVol,"매도단계",SellStep); } } //주문 후 60초 후 function Main_OnTimer(nEventID) { //1번타이동작 매수단계는 2 if (nEventID == 1 && BuyStep == 2) { //더이상 호가보고 정정이 되지 않도록 BuyLimitEnd는 true BuyLimitEnd = true; //타이머 종료 Main.KillTimer(1); //매도5호가로 정정 BuyID = Account1.OrderReplacePrice(BuyNum, MarketData1.Ask(5)); } //2번타이머 동작 매도단계는 2 if (nEventID == 2 && SellStep == 2) { //더이상 호가보고 정정이 되지 않도록 SellLimitEnd는 true SellLimitEnd = true; //2번타이머 종료 Main.KillTimer(2); //매수5호가로 정정 SellID = Account1.OrderReplacePrice(BuyNum, MarketData1.Bid(5)); } } 즐거운 하루되세요 > anyhelp 님이 쓴 글입니다. > 제목 : 예스자동정정 기능을 예스스팟에서 구현부탁드려요 > 안녕하세요. 예스스팟을 사용하다보니 디비깅 기능이 예스트레이더보다 미약해서 세부오류 확인 및 정정은 실전에서 밖에는 안되더라구요. 더더구나 계좌 및 거래와 연계된 부분은 실제 돈이 투입되어야 하구요. 몇차례 같은 어려움을 겪으면서, 실제투자금이 오류잡는데 줄어드는 것을 보니 기능구현을 하면서도 많이 망설여지더라구요. 다름이 아니라, 이번에는 예스자동정정기능을 예스스팟으로 구현하려고 하는데 앞에 말씀드린 부분때문에 접근이 쉽지 않습니다. 그래서 예스자동정정기능의 개념을 예스스팟 로직으로 구현 부탁드립니다. 구체적인 요청사항은 예스트레이더 차트 신호를 받아서 각각의 경우 주문을 할때 예스자동정정과 유사한 방법의 주문이 정정되도록 작성 부탁드립니다. 1. 예스차트의 매수주문 신호시 ㅇ상대호가잔량/우선호가잔량 30% 미만시 or 상대호가잔량 30주 미만시 상대1호가 자동정정, 제한가격은 상대5호가 ㅇ60초 후에 상대5호가로 강제 정정주문 2. 예스차트의 매수청산 주문신호시 ㅇ상대호가잔량/우선호가잔량 30% 미만시 or 상대호가잔량 30주 미만시 상대1호가 자동정정, 제한가격은 상대5호가 ㅇ60초 후에 상대5호가로 강제 정정주문 도움 항상 감사드립니다.