커뮤니티

미체결 조회

프로필 이미지
히말라야
2013-07-10 15:39:36
1276
글번호 222439
답변완료
예스 스팟에 나와있는 시간정정 주문을 선물로 주문을 내는 샘플로 변경한 예제 입니다. 1. 아래의 코딩에서 ID를 부여한후 미체결을 인지하는 코딩은 if(OrderResponse.orderID == ID) 로 보여지는데, 레퍼런스에서 보면 해당코딩은 ID에서 부여한 스팟고유의 번호와 응답에서 받은 고유 번호가 같은 주문 인지를 판단하는 로직으로 보여집니다. 스팟 설명부분에 C.주문응답 이벤트가 발생하면 타이머가 설정이 되고 지정한 60초가 경과한 후 미체결 이면 정정주문을 해야 합니다. 정정주문에 대한 주문응답을 받으면 다시 타이머가 작동되고60초 후에 다시 정정주문을 발생합니다. ==> 주문이 발생한후 해당주문이 체결되었는지, 미체결되었는지 구분하는 코딩셈플을 알고 싶습니다. (제가 이해가 짧은것인지...ㅠ.ㅠ) 2. Unfill 객체를 가지고 특정종목을 매수/매도 주문을 냈을때 , 특정종목의 체결 미체결 여부를 알 수 있는 샘플 코딩 부탁드리겠습니다. // < 시간 정정 주문> // 종목객체: Futures(연결선물) // 계좌객체: A1 var ID; // 전역변수의 선언 var Number; var timerCnt=0; // 전략이 예스스팟 전략에 실행될때 ==> 최초 실행시 넣어주어야할 값이나 계산이 있을 때 사용 function Main_OnStart() { // 시작과 동시에 선물매수5호가에 주문을 냄 ID=A1.OrderBuy(Futures.code, 1, Futures.Bid(5)-0.25, 0); Main.MessageLog(" 주문ID " + ID); Main.MessageLog(" 주무종목 " + Futures.code); Main.MessageLog(" 1차주문가격 " + Futures.Bid(5)-0.25); } //주문에 관한 응답을 받으면 function Main_OnOrderResponse(OrderResponse) { if(OrderResponse.orderID == ID) { Number = OrderResponse.orderNum; Main.SetTimer(1,10000); // 10초 동안 타이머를 작동시킴 //LOG Main.MessageLog(" 주문ID " + ID + " 주문번호 " + OrderResponse.orderNum + " 주문가격 " + OrderResponse.orderPrice ); } } function Main_OnTimer(nEventID) { if(nEventID == 1) { ID=A1.OrderReplace(Number,1, Futures.Bid(4)-0.25); Main.KillTimer(1); } // 타이머가 작동한 횟수 timerCnt +=1; Main.MessageLog(" Timer 작동회수 " + timerCnt ); } // 주문이 체결되면 타이머 중지 function Main_OnNotifyFill(NotifyFill) { if(NotifyFill.orderNum == Number) Main.KillTimer(1); }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2013-07-12 10:18:40

안녕하세요 예스스탁입니다. 기존 작성된 식이 아래 과정을 거치게 됩니다. 스팟이 처음실행되면 매수주문(주문한때 고유아이디 저장 ID) --> 주문응답 수신 (저장한 고유아이디와 응답의 고유번호가 같으면 주문번호저장) (10초 타이머 동작) --> 10초 후 Number주문에 대한 정정 (Number주문 체결이 되었으면 해당주문번호의 미체결이 없으므로 정정안함 --> 주문에러발생) --> 체결응답 수신(저장한 주문번호와 동일주문에 대한 체결인지 확인), 타이머 종료 아래는 미체결객체를 셋팅해서 체결여부를 확인하고 미체결시 정정주문을 내게 작성한 식입니다. 문의하신 1번 2번 모두 아래식 참고하시기 바랍니다. //계좌객체 A1 //종목객체 Futures var ID; var Number; var RePlaceCnt=0; function Main_OnStart() { Main.MessageList("----------------최초주문---------------------------"); // 시작과 동시에 선물매수5호가에 주문을 냄 ID=A1.OrderBuy(Futures.code, 1, Futures.Bid(5)-0.25, 0); Main.MessageList("1. 최초주문","/주문종목 :",Futures.code,"/주문가격 :",Futures.Bid(5)-0.25); RePlaceCnt = 0; } //주문에 관한 응답을 받으면 function Main_OnOrderResponse(OrderResponse) { Main.MessageList("----------------주문응답---------------------------"); Main.MessageList("2-1.주문응답수신","/주문ID :",ID,"/응답아이디:",OrderResponse.orderID); if(OrderResponse.orderID == ID) { Number = OrderResponse.orderNum; Main.SetTimer(1,10000); Main.MessageList("2-2. 주문번호 :",Number,"/타이셋팅 10초"); } Main.MessageList("2-3. 주문에러확인 : ",OrderResponse.error); } //타이머 이벤트 발생 function Main_OnTimer(nEventID) { Main.MessageList("----------------타이머동작---------------------------"); //1번 타이머 동작 if(nEventID == 1) { //Number에 저장된 주문번호에 대한 미체결객체 셋팅 A1.SetUnfillOrderNumber(Number) Main.MessageList("3 미체결확인 - 주문번호 :",Number,"미체결수량",A1.Unfill.count); //미체결 객체의 수량이 0이상이면(미체결상태) //매수4호가-0.25로 정정주문 if (A1.Unfill.count > 0) { RePlaceCnt= RePlaceCnt+1; Main.MessageList("----------------",RePlaceCnt,"차 정정주문---------------------------"); ID=A1.OrderReplacePrice(Number,Futures.Bid(4)-0.25); Main.MessageList("1. 정정주문- ID:",ID,"/주문종목 :",Futures.code,"/정정주문가격: ",Futures.Bid(4)-0.25); } else //아니면 타이머 종료(해당주문번호의 미체결객체가 없음 --> 체결) { Main.KillTimer(1); Main.MessageList("4.미체결객체 없음- 타이머 중지"); //정정주문의 주문가격이 기존 주문가격과 동일하면 에러가 발생하므로 마찬가지로 타이머가 종료됩니다. } } } 즐거운 하루되세요 > 히말라야 님이 쓴 글입니다. > 제목 : 미체결 조회 > 예스 스팟에 나와있는 시간정정 주문을 선물로 주문을 내는 샘플로 변경한 예제 입니다. 1. 아래의 코딩에서 ID를 부여한후 미체결을 인지하는 코딩은 if(OrderResponse.orderID == ID) 로 보여지는데, 레퍼런스에서 보면 해당코딩은 ID에서 부여한 스팟고유의 번호와 응답에서 받은 고유 번호가 같은 주문 인지를 판단하는 로직으로 보여집니다. 스팟 설명부분에 C.주문응답 이벤트가 발생하면 타이머가 설정이 되고 지정한 60초가 경과한 후 미체결 이면 정정주문을 해야 합니다. 정정주문에 대한 주문응답을 받으면 다시 타이머가 작동되고60초 후에 다시 정정주문을 발생합니다. ==> 주문이 발생한후 해당주문이 체결되었는지, 미체결되었는지 구분하는 코딩셈플을 알고 싶습니다. (제가 이해가 짧은것인지...ㅠ.ㅠ) 2. Unfill 객체를 가지고 특정종목을 매수/매도 주문을 냈을때 , 특정종목의 체결 미체결 여부를 알 수 있는 샘플 코딩 부탁드리겠습니다. // < 시간 정정 주문> // 종목객체: Futures(연결선물) // 계좌객체: A1 var ID; // 전역변수의 선언 var Number; var timerCnt=0; // 전략이 예스스팟 전략에 실행될때 ==> 최초 실행시 넣어주어야할 값이나 계산이 있을 때 사용 function Main_OnStart() { // 시작과 동시에 선물매수5호가에 주문을 냄 ID=A1.OrderBuy(Futures.code, 1, Futures.Bid(5)-0.25, 0); Main.MessageLog(" 주문ID " + ID); Main.MessageLog(" 주무종목 " + Futures.code); Main.MessageLog(" 1차주문가격 " + Futures.Bid(5)-0.25); } //주문에 관한 응답을 받으면 function Main_OnOrderResponse(OrderResponse) { if(OrderResponse.orderID == ID) { Number = OrderResponse.orderNum; Main.SetTimer(1,10000); // 10초 동안 타이머를 작동시킴 //LOG Main.MessageLog(" 주문ID " + ID + " 주문번호 " + OrderResponse.orderNum + " 주문가격 " + OrderResponse.orderPrice ); } } function Main_OnTimer(nEventID) { if(nEventID == 1) { ID=A1.OrderReplace(Number,1, Futures.Bid(4)-0.25); Main.KillTimer(1); } // 타이머가 작동한 횟수 timerCnt +=1; Main.MessageLog(" Timer 작동회수 " + timerCnt ); } // 주문이 체결되면 타이머 중지 function Main_OnNotifyFill(NotifyFill) { if(NotifyFill.orderNum == Number) Main.KillTimer(1); }