예스스탁
예스스탁 답변
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);
}