커뮤니티
P(0900 ATM-4 ~ ATM-13)
2026-09-04 09:58:04
114
글번호 233493
PUT 옵션 매수(행사가별로 매수가격 별도 적용)
1. 전략 세부 내용
- 행사가 그룹 찾기
등가격(ATM)에서 외가격(OTM)쪽으로 10포인트 떨어진 행사가 부터 총 10개
ex) 등가격 1000 이면
990 987.5 985 982.5 980 977.5 975 972.5 970 967.5
- 진입 방식: 오전9시에 10개 행사가를 추출하여 프리미엄이 높은 순서대로 가격을 차등화하여 매수(매수1호가) 1계약씩 지정가 주문
* 진입 지정가 차등: 0.05 (1개) -> 0.04 (2개) -> 0.03 (3개) -> 0.02 (4개)
- 익절 방식: 매수 체결 발생 즉시 행사가별 지정된 목표 익절가로 매도 지정가 주문하기_매수 체결전 매도주문이 나가지 않도록 주의
* 목표 익절가: 프리미엄 높은 순서대로 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
- endofday : 오후 3시 미결제 잔량을 1차(매도1호가) -> 60초 후 2차(매수1호가)로 나누어 강제 청산
청산 이후 재주문은 없음.(진입과 청산 1set)
항상 고맙습니다.
답변 1
예스스탁 예스스탁 답변
2026-09-15 09:30:31
안녕하세요
예스스탁입니다.
계좌객체 Account1, 옵션객체 Option1입니다.
var BuyTime = 90000;
var ExitTime = 150000;
var ATMLevel = [4,5,6,7,8,9,10,11,12,13];
var BuyPrice = [0.05,0.04,0.04,0.03,0.03,0.03,0.02,0.02,0.02,0.02];
var Target = [10,9,8,7,6,5,4,3,2,1];
var Vol = 1;
var Code = [];
var BID = [],SID = [];
var BNUM = [],SNUM = [];
var FV = [];
var B;
function Main_OnStart()
{
var d = new Date();
var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
B = 0;
//9시 전
if (HHMMSS < BuyTime)
{
//1초 타이머 셋팅
Main.SetTimer(1,1000);
Main.MessageList("BuyTime이전 -> 수행")
}
else
{
Main.MessageList("BuyTime이후 -> 수행 안함")
}
//Main.SetTimer(1,1000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
if (nEventID == 1)
{
if (HHMMSS >= BuyTime && HHMMSS < ExitTime)
{
//매수실행
if (B == 0)
{
B = 1;
for (var i = 0; i < ATMLevel.length; i++)
{
Code[i] = Option1.GetATMPutRecent(ATMLevel[i]);
BID[i] = Account1.OrderBuy(Code[i],Vol,BuyPrice[i],0);
FV[i] = 0;
Main.MessageList(ATMLevel[i],BID[i],Code[i],Vol,BuyPrice[i])
}
}
}
if (B == 1 && HHMMSS >= ExitTime)
{
Main.KillTimer(1);
B = 2;
//Code에 저장된 종목코드 미체결 모두 취소
var UF = Account1.GetTheNumberOfUnfills();
if (UF > 0)
{
for (var i = UF - 1; i >= 0; i--)
{
Account1.SetUnfill(i);
for (var x = 0; x < Code.length; x++)
{
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Code[x])
{
Account1.OrderCancel(Account1.Unfill.orderNum);
break;
}
}
}
}
//Code에 저장된 종목코드 보유 종목 매도 청산
var F = Account1.GetTheNumberOfBalances();
if (F > 0)
{
Main.MessageList("보유종목수:",F);
for (var i = 0; i < F; i++)
{
Account1.SetBalance(i)
for (var x = 0; x < Code.length; x++)
{
if (Account1.Balance.count > 0 &&
Account1.Balance.position == 2 &&
Account1.Balance.code == Code[x])
{
SID[x] = Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Option1.GetAsk(Account1.Balance.code, 1),0);
break;
}
}
}
//60초 타이머
Main.SetTimer(2,60000);
}
}
}
if (nEventID == 2)
{
for (var i = 0; i < ATMLevel.length; i++)
{
//SNUM주문 미체결체크
Account1.SetUnfill(SNUM[i]);
//미체결 있으면
if (Account1.Unfill.count > 0)
{
//매수1호가로 정정
var OP = Option1.GetBid(Account1.Unfill.code, 1)
if (OP != Account1.Unfill.price)
{
Account1.OrderReplacePrice(SNUM[i],OP)
}
}
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (B == 1 && OrderResponse.isNormal == true )
{
for (var i = 0; i < ATMLevel.length; i++)
{
if (OrderResponse.orderID == BID[i])
{
BNUM[i] = OrderResponse.orderNum;
Main.MessageList("Main_OnOrderResponse",i,OrderResponse.orderID,BNUM[i]);
return;
}
}
}
if (B == 2 && OrderResponse.isNormal == true )
{
for (var i = 0; i < ATMLevel.length; i++)
{
if (OrderResponse.orderID == SID[i])
{
SNUM[i] = OrderResponse.orderNum;
Main.MessageList("Main_OnOrderResponse",i,OrderResponse.orderID,SNUM[i]);
return;
}
}
}
}
function Main_OnNotifyFill(NotifyFill)
{
for (var i = 0; i < ATMLevel.length; i++)
{
if (NotifyFill.orderNum == BNUM[i] && NotifyFill.orderKind == 2)
{
FV[i] = FV[i]+1;
Main.MessageList("Main_OnNotifyFill",i,FV[i]);
if (FV[i] == Vol)
{
Account1.OrderSell(Code[i],Vol,Target[i],0);
Main.MessageList("익절매도",i,Code[i],Target[i]);
}
}
}
}
즐거운 하루되세요