예스스탁
예스스탁 답변
2025-06-13 14:47:06.0
안녕하세요
예스스탁입니다.
아래식 참고하시기 바랍니다.
스크립트객체설정
옵션객체 추가 --> 객체명 Option1, KP200지수옵션
계좌객체 추가 --> 객체명 Account1, 주문낼 계좌지정
var 양매수시간 = 90100;
var 당일청산시간 = 153000;
var 양매수기준값 = 2.5;
var 양매수기준절반값 = 양매수기준값/2;
var 매수수량 = 10;
var 양합목표1 = 3.00;
var 양합목표2 = 4.00;
var 양합목표3 = 5.00;
var step,양합;
var CallCode,PutCode;
function Main_OnStart()
{
Main.SetTimer(1, 1000);
//T는 초기값 0
step = 0;
Main.MessageList("Start");
Main.MessageList("양매수기준값:",양매수기준값,"양합목표1:",양합목표1,"양합목표2:",양합목표2,"양합목표3:",양합목표3);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//양매수시간이 되면
if (step == 0 && HHMMSS >= 양매수시간)
{
//T는 1로 변경
step = 1;
//종목선정시작
var CD = -1;
var CP = 0;
var CC = 0;
var PD = -1;
var PP = 0;
var PC = 0;
//양매수기준절반값에 가장 가까운 콜,풋 종목 선정
for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++)
{
if (CD == -1 || (CD >= 0 && Math.abs(Option1.GetCurrent(0,i)-양매수기준절반값) < CD))
{
CP = Option1.GetCurrent(0,i);
CD = Math.abs(Option1.GetCurrent(0,i)-양매수기준절반값);
CC = Option1.GetATMCallRecent(i);
}
if (PD == -1 || (PD >= 0 && Math.abs(Option1.GetCurrent(1,-i)-양매수기준절반값) < PD))
{
PD = Math.abs(Option1.GetCurrent(1,-i)-양매수기준절반값);
PP = Option1.GetCurrent(1,-i);
PC = Option1.GetATMPutRecent(-i);
}
}
Main.MessageList(HHMMSS,CC,CP,PC,PP);
//양매수기준절반값에 가장 가까운 콜과 풋을 기준으로 각각 양매수기준값에 가장 가까운 반대 종목을 다시 체크
var CDm = -1;
var CPm = 0;
var CCm = 0;
var PDm = -1;
var PPm = 0;
var PCm = 0;
for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++)
{
if (CDm == -1 || (CDm >= 0 && Math.abs((Option1.GetCurrent(0,i)+PP)-양매수기준값) < CDm))
{
CDm = Math.abs((Option1.GetCurrent(0,i)+PP)-양매수기준값);
CPm = Option1.GetCurrent(0,i);
CCm = Option1.GetATMCallRecent(i);
}
if (PDm == -1 || (PDm >= 0 && Math.abs((Option1.GetCurrent(1,-i)+CP)-양매수기준값) < PDm))
{
PDm = Math.abs((Option1.GetCurrent(1,-i)+CP)-양매수기준값);
PPm = Option1.GetCurrent(1,-i);
PCm = Option1.GetATMPutRecent(-i);
}
}
//차이가 3.0 미만에서 양매수기준값에 더 가까운 조합으로 주문
if (CDm <= PDm && Option1.GetCurrent(CC)+Option1.GetCurrent(PCm) < 양합목표1 )
{
CallCode = CC;
PutCode = PCm;
Account1.OrderBuy(CallCode, 매수수량, Option1.GetAsk(CallCode, 5), 0);
Account1.OrderBuy(PutCode, 매수수량, Option1.GetAsk(PutCode, 5), 0);
//양매수되면 T는 2
step = 2;
Main.MessageList(HHMMSS,"step:",step,"콜종목:",CallCode,"풋종목:",PutCode,"양합:",Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode) );
}
if (CDm > PDm && Option1.GetCurrent(CCm)+Option1.GetCurrent(PC) < 양합목표1 )
{
CallCode = CCm;
PutCode = PC;
Account1.OrderBuy(CallCode, 매수수량, Option1.GetAsk(CallCode, 5), 0);
Account1.OrderBuy(PutCode, 매수수량, Option1.GetAsk(PutCode, 5), 0);
//양매수되면 T는 2
step = 2;
Main.MessageList(HHMMSS,"step:",step,"콜종목:",CallCode,"풋종목:",PutCode,"양합:",Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode) );
}
}
if (step >= 2)
{
양합 = Math.round((Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode))*100)/100;
Main.MessageList(HHMMSS,"step:",step,"현재 양합:",양합);
}
//양합이 3 되면 25% 청산
if (step == 2 && 양합 >= 양합목표1 )
{
step = 3;
Main.MessageList(HHMMSS,"step:",step,양합목표1,"도달");
Account1.SetBalance(CallCode, 0);
//콜청산수량 : 매수수량의 25%와 잔고보유수량 중 작은값
var Xvol1 = Math.min(Math.floor(매수수량*0.25),Account1.Balance.count);
if (Account1.Balance.position == 2 && Xvol1 > 0)
{
Account1.OrderSell(CallCode, Xvol1, Option1.GetBid(CallCode, 1), 0);
}
//풋청산수량 : 매수수량의 25%와 잔고보유수량 중 작은값
Account1.SetBalance(PutCode, 0);
var Xvol2 = Math.min(Math.floor(매수수량*0.25),Account1.Balance.count);
if (Account1.Balance.position == 2 && Xvol2 > 0)
{
Account1.OrderSell(PutCode, Xvol2, Option1.GetBid(PutCode, 1), 0);
}
}
//양합이 4 되면 25% 청산
if (step == 3 && 양합 >= 양합목표2 )
{
step = 4;
Main.MessageList(HHMMSS,"step:",step,양합목표2,"도달");
//콜청산수량 : 매수수량의 25%와 잔고보유수량 중 작은값
Account1.SetBalance(CallCode, 0);
var Xvol1 = Math.min(Math.ceil(매수수량*0.25),Account1.Balance.count);
if (Account1.Balance.position == 2 && Xvol1 > 0)
{
Account1.OrderSell(CallCode, Xvol1, Option1.GetBid(CallCode, 1), 0);
}
//풋청산수량 : 매수수량의 25%와 잔고보유수량 중 작은값
Account1.SetBalance(PutCode, 0);
var Xvol2 = Math.min(Math.ceil(매수수량*0.25),Account1.Balance.count);
if (Account1.Balance.position == 2 && Xvol2 > 0)
{
Account1.OrderSell(PutCode, Xvol2, Option1.GetBid(PutCode, 1), 0);
}
}
//양합이 5 이 되면 25% 청산
if (step == 4 && 양합 >= 양합목표3 )
{
Main.MessageList(HHMMSS,"step:",step,양합목표3,"도달");
step = 5;
//콜청산수량 : 매수수량의 25%와 잔고보유수량 중 작은값
Account1.SetBalance(CallCode, 0);
var Xvol1 = Math.min(Math.ceil(매수수량*0.25),Account1.Balance.count);
if (Account1.Balance.position == 2 && Xvol1 > 0)
{
Account1.OrderSell(CallCode, Xvol1, Option1.GetBid(CallCode, 1), 0);
}
//풋청산수량 : 매수수량의 25%와 잔고보유수량 중 작은값
Account1.SetBalance(PutCode, 0);
var Xvol2 = Math.min(Math.ceil(매수수량*0.25),Account1.Balance.count);
if (Account1.Balance.position == 2 && Xvol2 > 0)
{
Account1.OrderSell(PutCode, Xvol2, Option1.GetBid(PutCode, 1), 0);
}
}
if (step >= 2 && HHMMSS >= 당일청산시간)
{
Main.MessageList(HHMMSS,"step:",step,"당일청산:전량청산");
step = 6;
//콜청산수량 : 전량청산
Account1.SetBalance(CallCode, 0);
var Xvol1 = Account1.Balance.count;
if (Account1.Balance.position == 2 && Xvol1 > 0)
{
Account1.OrderSell(CallCode, Xvol1, Option1.GetBid(CallCode, 1), 0);
}
//풋청산수량 : 전량청산
Account1.SetBalance(PutCode, 0);
var Xvol2 = Account1.Balance.count;
if (Account1.Balance.position == 2 && Xvol2 > 0)
{
Account1.OrderSell(PutCode, Xvol2, Option1.GetBid(PutCode, 1), 0);
}
//타이머종료
Main.KillTimer(1);
}
}
즐거운 하루되세요
> 제우스 님이 쓴 글입니다.
> 제목 : 매일 아침 9시에 옵션 양매수 하는 스팟수식 부탁드립니다.
> 1. 매일 아침 9시에(=9시가 안되면 9시 1분에..1분도 안되면 아무튼 가능한 가장 빠른 시간에) 옵션 콜풋 양합이 2.5가 되도록 양매수 진입하되.. 콜풋은 최대한 비슷한 가격으로 선택함.
2. 양합이 3 이 되면 25% 청산
3. 양합이 4가되면 25% 청산
4. 양합이 5가 되면 25% 청산
5. 나머지는 종가청산
6.양합이 위 가격에 안오면 모두 종가청산
위 조건이 구현되는 스팟 수식 부탁드립니다.