답변완료
비정상종료후 재접속시 옵션 잔고 청산 / 옵션 잔고 마감청산
안녕하세요
선물잔고 마감청산 수식 잘 사용하고 있습니다.
다름이 아니고 옵션 역시 마감청산이 필요하여 다시 문의드립니다.
다음 내용 작성해주시면 예전 수식을 참고하여 응용하여 사용하겠습니다.
< 비정상종료후 재접속시 옵션 잔고 청산 >
1) 계좌는 1계좌
2) 09시~15시 사이에 YT가 비정상적 또는 임의로 일시 종료된 후,
재접속했을 때 계좌잔고중 K200 옵션관련 종목 전체 청산 (선물은 제외)
- 접속후 거래비밀번호 입력 등 여유시간 5분정도 필요
3) 나머지 사항은 아래와 동일
< 옵션 잔고 마감청산 >
1) 계좌는 1계좌
2) 15시에 계좌잔고중 K200 옵션관련 종목 전체 청산 (선물은 제외)
- 콜,풋이 섞여 있을 수 있고, 각각의 행사 종목이 여러개일 수 있음
- 수량 역시 다양함
3) 청산가격은 각각 5호가 청산
위의 두가지를 하나로 묶어서 수식 작성해주시면 제일 좋고
따로 분리해서 두개로 작성해주셔도 무방합니다.
이상입니다.
감사합니다 !!
2018-06-26
1913
글번호 224489
답변완료
문의 드립니다.^.^
안녕하세요?
작성해 주심 전략 감사합니다...
아래 전략에 오일거래를 할수 있도록 수정 부탁드리겠습니다.
감사합니다...^.^
var CallCode,CallID,CallNum,CallFill;
var PutCode,PutID,PutNum,PutFill;
var entry;
var vol = 1;//진입수량
function Main_OnStart()
{
//타이머 5초단위
Main.SetTimer(1, 5000);
step = 0;
CallFill = false;
PutFill = false;
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (step == 0 && HHHMMSS > 110000)
{
//step은 1로 변경
step = 1;
//ATM콜 종목코드
CallCode = Option1.GetATMCallRecent(0);
//ATM풋 종목코드
PutCode = Option1.GetATMPutRecent(0);
//Call종목 매수3호가로 매도주문하고 주문아이디는 CallID에 저장
CallID = Account1.OrderSell(CallCode,vol,Option1.GetBid(CallCode,3),0);
//Put종목 매수3호가로 매도주문하고 주문아이디는 PutID에 저장
PutID = Account1.OrderSell(PutCode,vol,Option1.GetBid(PutCode,3),0);
}
//양매도 후 콜/풋 모두 체결이 되었으면
if (HHHMMSS > 110000 && step == 1 && CallFill == true && PutCall == true )
{
//손익저장할 변수(초기값0)
var sumPL = 0;
//CallCode 잔고셋팅
Account1.SetBalance(CallCode,0);
//수량이 1이상이고 매도포지션이면 손익을 sumPL에 합산저장
if (Account1.Balance.count >= 1 && Account1.Balance.position == 1)
{
sumPL = SumPL + (Account1.Balance.avgUnitCost - Account1.Balance.current);
}
//PutlCode 잔고셋팅
Account1.SetBalance(CallCode,0);
//수량이 1이상이고 매도포지션이면 손익을 sumPL에 합산저장
if (Account1.Balance.count >= 1 && Account1.Balance.position == 1)
{
sumPL = SumPL + (Account1.Balance.avgUnitCost - Account1.Balance.current);
}
//합산손익이 +0.5 이상이면
if (sumPL >= 0.5)
{
//step은 2로 변경
step = 2;
//콜풋 모두 매도3호가로 매수주문
Account1.OrderBuy(CallCode, vol, Option1.GetAsk(CallCode, 3), 0);
Account1.OrderBuy(PutCode, vol, Option1.GetAsk(PutCode, 3), 0);
}
}
//수익청산되지 않고 15시가 되면
if (step == 1 && HHHMMSS >= 150000)
{
//step은 2로 변경
step = 2;
Main.KillTimer(1);
//콜풋 모두 매도3호가로 매수주문
Account1.OrderBuy(CallCode, vol, Option1.GetAsk(CallCode, 3), 0);
Account1.OrderBuy(PutCode, vol, Option1.GetAsk(PutCode, 3), 0);
}
}
//주문응답수신
function Main_OnOrderResponse(OrderResponse)
{
//수신된 주문응답의 아이디가 CallID와 같으면
if (OrderResponse.orderID == CallID)
{
//CallNum에 주문번호저장
CallNum = OrderResponse.orderNum;
}
//수신된 주문응답의 아이디가 PutID와 같으면
if (OrderResponse.orderID == PutID)
{
//PutNum에 주문번호저장
PutNum = OrderResponse.orderNum;
}
}
//체결응답수신
function Main_OnNotifyFill(NotifyFill)
{
//CallNum에 대한 체결응답이면
if (NotifyFill.orderNum == CallNum)
{
//CallNum에 대한 미체결객체 세팅하고
Account1.SetUnfill(CallNum);
//미체결수량이 없으면(주문전량체결)
if (Account1.Unfill.count == 0)
{
//CallFill에 true 저장
CallFill = true;
}
}
//PutNum에 대한 체결응답이면
if (NotifyFill.orderNum == PutNum)
{
//PutNum에 대한 미체결객체 세팅하고
Account1.SetUnfill(PutNum);
//미체결수량이 없으면(주문전량체결)
if (Account1.Unfill.count == 0)
{
//PutFill에 true 저장
PutFill = true;
}
}
}
2018-06-17
2164
글번호 224476