답변완료
시간정정주문 문의드립니다
항상수고 많으십니다
선물챠트의 시그널을 이용해 옵션 등가 양매도 전략을 구사 할려고 합니다
진입 및 청산로직은 최초 우선1호가 -> 1차정정 우선1호가 -> 2차정정 현재가 -> 3차정정 상대2호가 체결입니다.
최초주문은 우선1호가에 잘들어가나 진입시 1차정정 청산시 2차정정주문이 들어 가지 않습니다. 틀린부분 지적 부탁드립니다.
var Start;
var BuyCallCode;
var BuyPutCode;
var SellCallCode;
var SellPutCode;
var SellCallPrice;
var SellPutPrice;
var BxCallPrice;
var BxPutPrice;
var ExCallNum;
var ExPutNum;
var SellCallNum;
var SellPutNum;
var CallInID;
var PutExID;
var CallExID;
var PutInID;
function Main_OnStart()
{
Main.MessageLog("시작");
Start = 0;
}
function C1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1 )
{
Start = 1;
SellPutCode = Option.GetATMPutRecent(0);
SellPutPrice = Option.GetAskByCode(SellPutCode,1);
PutInID = A1.OrderSell(SellPutCode, 1, SellPutPrice, 0);
Main.SetTimer(21, 10000);
Main.SetTimer(22, 20000);
Main.SetTimer(23, 30000);
}
if (Start == 1 && Signal.signalKind == 2 )
{
BxPutPrice = Option.GetBidByCode(SellCallCode,1);
PutExID = A1.OrderBuy(SellPutCode, 1, BxPutPrice, 0);
Main.SetTimer(31, 60000);
Main.SetTimer(32, 120000);
Main.SetTimer(33, 170000);
}
if (Signal.signalKind == 3 )
{
Start = 1;
SellCallCode = Option.GetATMCallRecent(0);
SellCallPrice = Option.GetAskByCode(SellCallCode,1);
CallInID = A1.OrderSell(SellCallCode, 1, SellCallPrice, 0);
Main.SetTimer(1, 10000);
Main.SetTimer(2, 20000);
Main.SetTimer(3, 30000);
}
if (Start == 1 && Signal.signalKind == 4 )
{
BxCallPrice = Option.GetBidByCode(SellCallCode,1);
CallExID = A1.OrderBuy(SellCallCode, 1, BxCallPrice, 0);
Main.SetTimer(11, 60000);
Main.SetTimer(12, 120000);
Main.SetTimer(13, 170000);
}
}
//PUT매도진입
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == PutInID)
{
SellPutNum = OrderResponse.orderNum;
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 21)
{
Main.KillTimer(21);
A1.SetUnfillOrderNumber(SellPutNum);
if (A1.Unfill.count > 0)
{
PutInID = A1.OrderReplacePrice(SellPutNum,Option.GetAskByCode(SellPutCode,1));
}
}
if (nEventID == 22)
{
Main.KillTimer(22);
A1.SetUnfillOrderNumber(SellPutNum);
if (A1.Unfill.count > 0)
{
PutInID = A1.OrderReplacePrice(SellPutNum,Option.GetCurrentByCode(SellPutCode));
}
}
if (nEventID == 23)
{
Main.KillTimer(23);
A1.SetUnfillOrderNumber(SellPutNum);
if (A1.Unfill.count > 0)
{
PutInID = A1.OrderReplacePrice(SellPutNum,Option.GetBidByCode(SellPutCode,2));
}
}
}
//PUT 매도청산
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == PutExID)
{
ExPutNum = OrderResponse.orderNum;
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 31)
{
Main.KillTimer(31);
A1.SetUnfillOrderNumber(ExPutNum);
if (A1.Unfill.count > 0)
{
PutExID = A1.OrderReplacePrice(ExPutNum,Option.GetBidByCode(SellPutCode,1));
}
}
if (nEventID == 32)
{
Main.KillTimer(32);
A1.SetUnfillOrderNumber(ExPutNum);
if (A1.Unfill.count > 0)
{
PutExID = A1.OrderReplacePrice(ExPutNum,Option.GetCurrentByCode(SellPutCode));
}
}
if (nEventID == 33)
{
Main.KillTimer(33);
A1.SetUnfillOrderNumber(ExPutNum);
if (A1.Unfill.count > 0)
{
PutExID = A1.OrderReplacePrice(ExPutNum,Option.GetAskByCode(SellPutCode,2));
}
}
}
//CALL 매도
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == CallInID)
{
SellCallNum = OrderResponse.orderNum;
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Main.KillTimer(1);
A1.SetUnfillOrderNumber(SellCallNum);
if (A1.Unfill.count > 0)
{
CallInID = A1.OrderReplacePrice(SellCallNum,Option.GetAskByCode(SellCallCode,1));
}
}
if (nEventID == 2)
{
Main.KillTimer(2);
A1.SetUnfillOrderNumber(SellCallNum);
if (A1.Unfill.count > 0)
{
CallInID = A1.OrderReplacePrice(SellCallNum,Option.GetCurrentByCode(SellCallCode));
}
}
if (nEventID == 3)
{
Main.KillTimer(3);
A1.SetUnfillOrderNumber(SellCallNum);
if (A1.Unfill.count > 0)
{
CallInID = A1.OrderReplacePrice(SellCallNum,Option.GetBidByCode(SellCallCode,2));
}
}
}
//CALL 매도청산
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == CallExID)
{
ExCallNum = OrderResponse.orderNum;
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 11)
{
Main.KillTimer(11);
A1.SetUnfillOrderNumber(ExCallNum);
if (A1.Unfill.count > 0)
{
CallExID = A1.OrderReplacePrice(ExCallNum,Option.GetBidByCode(SellCallCode,1));
}
}
if (nEventID == 12)
{
Main.KillTimer(12);
A1.SetUnfillOrderNumber(ExCallNum);
if (A1.Unfill.count > 0)
{
CallExID = A1.OrderReplacePrice(ExCallNum,Option.GetCurrentByCode(SellCallCode));
}
}
if (nEventID == 13)
{
Main.KillTimer(13);
A1.SetUnfillOrderNumber(ExCallNum);
if (A1.Unfill.count > 0)
{
CallExID = A1.OrderReplacePrice(ExCallNum,Option.GetAskByCode(SellCallCode,2));
}
}
}
2013-07-17
1358
글번호 222454
답변완료
수식 문의드립니다.
안녕하세요. 예스스팟 수식을 부탁드립니다.
진입은 이미 들어가 있는 상태이고 예스스팟으로 청산주문을 내고 싶습니다.
1. 계좌에 있는 옵션(콜, 풋)를 조회해서 청산주문을 낸다. 옵션잔고는 매도만 있음.
(단, 계좌에는 선물도 있지만, 선물에 대해서는 건드리지 않음)
2. 매도청산 주문가격은 매수 1호가로 처음 낸 후
3. 콜, 풋가운데 한 쪽이 먼저 체결되면 반대쪽 콜, 풋의 주문가격을 매도 5호가로 정정한다.
** 콜, 풋 종목이 하나 씩이 아니라 여러 행사가가 계좌잔고에 있을 수 있는 경우에 대해 수식을 부탁드립니다.
혹시, 하나 씩만 있어야 수식작성이 가능하다면, 하는 수 없지만 하나 씩 있는 경우라도 수식을 만들어 주시면 감사하겠습니다.
수고하세요. 감사합니다.
2013-07-13
1326
글번호 222443
답변완료
미체결 조회
예스 스팟에 나와있는 시간정정 주문을 선물로 주문을 내는 샘플로 변경한 예제 입니다.
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);
}
2013-07-10
1299
글번호 222439