커뮤니티
자동매매 수식 부탁합니다.
2026-09-16 17:58:53
131
글번호 233669
코스피 선물지수
아침 8시52분 선물가격 =A, 8시53분25초 선물가격=B 라 하면,
1) A > B 면, 8시54분에 풋옵션 매수
2) A < B면, 8시54분에 콜옵션 매수
3) A = B면, 매수 안함.
4) 당일 8시59분20초에 전량 매도(청산)
5) 프리미엄 1.00에 가장 가까운 걸로 매수하되, 옵션 만기일이 7일이하로 남은건 배제.
6) 매수금액 한도 = 500만원
7) 모든 매매는 시장가로
이상입니다.
답변 1
예스스탁 예스스탁 답변
2026-09-23 17:08:38
안녕하세요
예스스탁입니다.
스팟은 식작성 가이드입니다.
수식 내용 숙지하시고 모의투자등으로 테스트하고 사용하시기 바랍니다.
스크립트 객체 설정
종목객체 추가 -> 속성에서 객체명 MarketData1, 종목은 KP200 연결선물로 지정
옵션객체 추가 -> 속성에서 객체명 Option1, KP200옵션지정
계좌객체 추가 -> 속성에서 객체명 Account1, 주문낼 계좌번호 지정
var A기준시간 = 85200;
var B기준시간 = 85325;
var 매수시간 = 85400;
var 청산시간 = 85920;
var 매수금 = 5000000;
var T,A,B,BID,NUM,VV,FV;
function Main_OnStart()
{
var d = new Date();
var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
Main.MessageList(HHMMSS,"|Start - 옵션잔존일:",Option1.GetRemainDays(0, 0));
T = 0;
if (Option1.GetRemainDays(0, 0) > 7 )
{
if (HHMMSS < A기준시간)
{
Main.SetTimer(1, 1000);
T = 1;
}
else
{
T = -1;
Main.MessageList("A기준시간 이후 -> 시간지정확인필요");
}
}
else
{
T = -1;
Main.MessageList(HHMMSS,"|잔존일 7일이하 거래안함");
}
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
if (T == 1 && HHMMSS >= A기준시간)
{
T = 2;
A = MarketData1.current;
Main.MessageList(HHMMSS,"|A값:",A);
}
if (T == 2 && HHMMSS >= B기준시간)
{
T = 3;
B = MarketData1.current;
Main.MessageList(HHMMSS,"|B값:",B);
}
if (T == 3 && HHMMSS >= 매수시간)
{
T = 4;
if (A > B)
{
Main.MessageList(HHMMSS,"|A값이 B값보다 큼");
var diff;
var Code = "";
for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++)
{
if (Code == "" || (Code != "" && Math.abs(Option1.GetCurrent(0,i)- 1.0) < diff))
{
Code = Option1.GetATMCallRecent(i);
diff = Math.abs(Option1.GetCurrent(0,i)- 1.0);
}
}
if (Code != "")
{
VV = Math.floor(매수금/(Option1.GetCurrent(Code)*250000));
if (VV > 0)
{
BID = Account1.OrderBuy(Code, VV, 0,1);
FV = 0;
Main.MessageList(HHMMSS,"|매수:",Code);
}
else
{
Main.MessageList(HHMMSS,"|금액부족" -> 실행중지");
T = 5;
}
}
else
{
Main.MessageList(HHMMSS,"|종목없음");
Main.KillTimer(1);
T = 5;
}
}
else if (A < B)
{
Main.MessageList(HHMMSS,"|A값이 B값보다 작음");
var diff;
var Code = "";
for (var i = -Option1.uppersATM; i <= Option1.lowersATM; i++)
{
if (Code == "" || (Code != "" && Math.abs(Option1.GetCurrent(1,i)- 1.0) < diff))
{
Code = Option1.GetATMPutRecent(i);
diff = Math.abs(Option1.GetCurrent(1,i)- 1.0);
}
}
if (Code != "")
{
VV = Math.floor(매수금/(Option1.GetCurrent(Code)*250000));
if (VV > 0)
{
BID = Account1.OrderBuy(Code, VV, 0,1);
FV = 0;
Main.MessageList(HHMMSS,"|매수:",Code);
}
else
{
Main.MessageList(HHMMSS,"|금액부족" -> 실행중지");
T = 5;
}
}
else
{
Main.MessageList(HHMMSS,"|종목없음");
Main.KillTimer(1);
T = 5;
}
}
else
{
T = 5;
Main.MessageList(HHMMSS,"|A값과 B값이 같음 : 매수안함");
Main.KillTimer(1);
}
}
if (T == 4 && HHMMSS >= 청산시간)
{
T = 5;
Main.KillTimer(1);
if (FV < VV)
{
Account1.SetUnfill(NUM);
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(NUM);
}
}
if (FV > 0)
{
Account1.OrderSell(Code, FV, 0, 1);
}
else
{
Main.MessageList(HHMMSS,"|매수진입 체결수량없음 -> 청산주문안함");
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
var d = new Date();
var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
if (OrderResponse.orderID == BID)
{
if (OrderResponse.isNormal == true)
{
NUM = OrderResponse.orderNum;
}
else
{
Main.MessageList(HHMMSS,"|진입주문오류 --> 실행중지");
Main.KillTimer(1);
T = 5;
}
}
}
function Main_OnNotifyFill(NotifyFill)
{
if (NotifyFill.orderNum == NUM)
{
FV = FV + NotifyFill.fillCount;
}
}
즐거운 하루되세요