커뮤니티
개장전 주문
2026-09-08 05:49:11
107
글번호 233539
개장전 주문을 하고 싶습니다.
콜옵션 수식 1개, 풋옵션 수식 1개
전략 내용은 같습니다.
1. 주문시간 : 083000 (개장전)
2. 옵션 행사가선택
- 야간선물 종가기준 외가격 행사가 20개 선정
- 야간선물 사용안되면 어제 주간선물 종가기준 외가격 행사가 40개 선정
3. 행사가별 가격 및 수량 세팅
- 20개 행사가 전부 같음
- 0.01 / 수량 4개
4. 익절
- 20개 행사가 전부 같음
- 당일 하이로우 50포인트 보다 크면
4.9(1개), 3.9(1개), 2.9(1개), 1.9(1개)
- 당일 하이로우 50포인트 보다 작으면
3.4(1개), 2.4(1개), 1.4(1개), 0.4(1개)
5. Endofday
- 150000에 모든 미결제 청산
- 매도1호가 주문 , 60초 후 매수1호가 주문
고맙습니다
답변 1
예스스탁 예스스탁 답변
2026-09-18 13:41:08
안녕하세요
예스스탁입니다.
아래식 참고하시기 바랍니다.
계좌객체 Account1, 옵션객체 Option1입니다.
1 . 콜
var BuyTime = 83000;
var ExitTime = 150000;
var ATMLevel = 20;
var BuyPrice = 0.01;
var Vol = 4;
var Target = [];
var TP = [];
var Code = [];
var BID = [],SID = [];
var BNUM = [],SNUM = [];
var FV = [];
var B,FNC,FNR = 0;
function Main_OnStart()
{
var d = new Date();
var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
//9시 전
if (HHMMSS < BuyTime)
{
B = 0;
Main.MessageList("BuyTime이전 -> 차트객체 요청");
//기본종목셋팅({연결선물 야간장},일봉 300개, 갭보정안함, 수정주가처리 안함)
var item = {code:"00000000", marketKind:CHART_MARKET_NIGHT}
var ChartSet = new ReqChartItem(item,0,CHART_PERIOD_DAILY,300, CHART_REQCOUNT_BAR, false, false);
Main.ReqChartEx(ChartSet);
}
else
{
Main.MessageList("BuyTime이후 -> 수행 안함");
}
}
function Main_OnRcvChartEx(ChartEx)
{
if (ChartEx.GetCode(1) == "00000000")
{
Main.MessageList("차트객체 생성완료:",ChartEx.GetCode(1));
CT = ChartEx;
FNC = CT.GetClose(1,0);
FNR = CT.GetHigh(1,0)-CT.GetLow(1,0);
if (FNR < 50)
{
Target = [0.4,1.4,2.4,3.4];
}
else
{
Target = [1.9,2.9,3.9,4.9];
}
Main.MessageList("야간선물가격:",FNC," 야간선물폭:",CT.GetHigh(1,0),CT.GetLow(1,0),FNR);
B = 1;
//1초 타이머 셋팅
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 == 1)
{
B = 2;
var A1 = FNC;
var A2 = Math.floor(A1/2.5)*2.5;
var ATM = A2;
if (A1-A2 >= 1.25)
{
ATM = A2+2.5;
}
Main.MessageList(HHMMSS,"|선물가격기준 ATM:",ATM);
for (var i = 1; i <= ATMLevel; i++)
{
var ItemCode = Option1.GetCodeByExercisePrice(0,ATM+2.5*i);
var Current = Option1.GetCurrent(ItemCode);
Main.MessageList(HHMMSS,"|행사가:",ATM+2.5*i,"|종목:",ItemCode,"현재가:",Current);
if (Current > 0)
{
Code[i] = ItemCode;
BID[i] = Account1.OrderBuy(ItemCode,Vol,BuyPrice,0);
FV[i] = 0;
TP[i] = 0;
Main.MessageList(HHMMSS,"|매수:",BID[i],ItemCode,Vol,BuyPrice);
}
else
{
Main.MessageList(HHMMSS,"|해당 행사가 없음");
}
}
Main.MessageList(HHMMSS,"|매수:",Code.length,Code);
}
else
{
if (B == 2 && HHMMSS >= 84500)
{
for (var i = 1; i < Code.length; i++)
{
var a = TP[i];
if (a < Target.length && Option1.GetCurrent(Code[i]) >= Target[a])
{
Main.MessageList(HHMMSS,"|익절조건 충족",a,"단계:",Code[i],Option1.GetCurrent(Code[i]),Target[a]);
if (FV[i] > a)
{
Account1.OrderSell(Code[i], 1, Target[a], 0);
Main.MessageList(HHMMSS,"|익절실행:",a,"단계 매도:",Code[i],1,Target[a]);
TP[i] = TP[i]+1;
}
else
{
Main.MessageList(HHMMSS,"|익절불가-체결수량부족:",a,"단계 매도:",Code[i],1,Target[a]);
}
}
}
}
}
}
if (B == 2 && HHMMSS >= ExitTime)
{
Main.KillTimer(1);
B = 3;
//Code에 저장된 종목코드 미체결 모두 취소
var UF = Account1.GetTheNumberOfUnfills();
Main.MessageList(HHMMSS,"|전체미체결 취소:",UF);
if (UF > 0)
{
for (var i = UF - 1; i >= 0; i--)
{
Account1.SetUnfill(i);
for (var x = 1; 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(HHMMSS,"|보유종목:",F);
for (var i = 0; i < F; i++)
{
Account1.SetBalance(i)
for (var x = 1; x < Code.length; x++)
{
if (Account1.Balance.count > 0 &&
Account1.Balance.position == 2 &&
Account1.Balance.code == Code[x])
{
Main.MessageList(HHMMSS,"|청산:",Account1.Balance.code, Account1.Balance.count);
SID[x] = Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Option1.GetBid(Account1.Balance.code, 1),0);
break;
}
}
}
//60초 타이머
Main.SetTimer(2,60000);
}
}
}
if (nEventID == 2)
{
Main.KillTimer(2);
Main.MessageList(HHMMSS,"|청산 정정주문");
for (var i = 1; i < Code.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)
{
var d = new Date();
var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
if (B == 2 && OrderResponse.isNormal == true )
{
for (var i = 1; i <= ATMLevel; i++)
{
if (OrderResponse.orderID == BID[i])
{
BNUM[i] = OrderResponse.orderNum;
Main.MessageList(HHMMSS,"|OnOrderResponse",i,OrderResponse.orderID,BNUM[i]);
return;
}
}
}
if (B == 3 && OrderResponse.isNormal == true )
{
for (var i = 1; i <= ATMLevel; i++)
{
if (OrderResponse.orderID == SID[i])
{
SNUM[i] = OrderResponse.orderNum;
Main.MessageList(HHMMSS,"|OnOrderResponse",i,OrderResponse.orderID,SNUM[i]);
return;
}
}
}
}
function Main_OnNotifyFill(NotifyFill)
{
var d = new Date();
var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
for (var i = 1; i <= ATMLevel; i++)
{
if (NotifyFill.orderNum == BNUM[i] && NotifyFill.orderKind == 2)
{
FV[i] = FV[i]+1;
Main.MessageList(HHMMSS,"|OnNotifyFill",i,FV[i]);
}
}
}
2 풋
var BuyTime = 83000;
var ExitTime = 150000;
var ATMLevel = 20;
var BuyPrice = 0.01;
var Vol = 4;
var Target = [];
var TP = [];
var Code = [];
var BID = [],SID = [];
var BNUM = [],SNUM = [];
var FV = [];
var B,FNC,FNR = 0;
function Main_OnStart()
{
var d = new Date();
var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
//9시 전
if (HHMMSS < BuyTime)
{
B = 0;
Main.MessageList("BuyTime이전 -> 차트객체 요청");
//기본종목셋팅({연결선물 야간장},일봉 300개, 갭보정안함, 수정주가처리 안함)
var item = {code:"00000000", marketKind:CHART_MARKET_NIGHT}
var ChartSet = new ReqChartItem(item,0,CHART_PERIOD_DAILY,300, CHART_REQCOUNT_BAR, false, false);
Main.ReqChartEx(ChartSet);
}
else
{
Main.MessageList("BuyTime이후 -> 수행 안함");
}
}
function Main_OnRcvChartEx(ChartEx)
{
if (ChartEx.GetCode(1) == "00000000")
{
Main.MessageList("차트객체 생성완료:",ChartEx.GetCode(1));
CT = ChartEx;
FNC = CT.GetClose(1,0);
FNR = CT.GetHigh(1,0)-CT.GetLow(1,0);
if (FNR < 50)
{
Target = [0.4,1.4,2.4,3.4];
}
else
{
Target = [1.9,2.9,3.9,4.9];
}
Main.MessageList("야간선물가격:",FNC," 야간선물폭:",CT.GetHigh(1,0),CT.GetLow(1,0),FNR);
B = 1;
//1초 타이머 셋팅
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 == 1)
{
B = 2;
var A1 = FNC;
var A2 = Math.floor(A1/2.5)*2.5;
var ATM = A2;
if (A1-A2 >= 1.25)
{
ATM = A2+2.5;
}
Main.MessageList(HHMMSS,"|선물가격기준 ATM:",ATM);
for (var i = 1; i <= ATMLevel; i++)
{
var ItemCode = Option1.GetCodeByExercisePrice(1,ATM-2.5*i);
var Current = Option1.GetCurrent(ItemCode);
Main.MessageList(HHMMSS,"|행사가:",ATM+2.5*i,"|종목:",ItemCode,"현재가:",Current);
if (Current > 0)
{
Code[i] = ItemCode;
BID[i] = Account1.OrderBuy(ItemCode,Vol,BuyPrice,0);
FV[i] = 0;
TP[i] = 0;
Main.MessageList(HHMMSS,"|매수:",BID[i],ItemCode,Vol,BuyPrice);
}
else
{
Main.MessageList(HHMMSS,"|해당 행사가 없음");
}
}
Main.MessageList(HHMMSS,"|매수:",Code.length,Code);
}
else
{
if (B == 2 && HHMMSS >= 84500)
{
for (var i = 1; i < Code.length; i++)
{
var a = TP[i];
if (a < Target.length && Option1.GetCurrent(Code[i]) >= Target[a])
{
Main.MessageList(HHMMSS,"|익절조건 충족",a,"단계:",Code[i],Option1.GetCurrent(Code[i]),Target[a]);
if (FV[i] > a)
{
Account1.OrderSell(Code[i], 1, Target[a], 0);
Main.MessageList(HHMMSS,"|익절실행:",a,"단계 매도:",Code[i],1,Target[a]);
TP[i] = TP[i]+1;
}
else
{
Main.MessageList(HHMMSS,"|익절불가-체결수량부족:",a,"단계 매도:",Code[i],1,Target[a]);
}
}
}
}
}
}
if (B == 2 && HHMMSS >= ExitTime)
{
Main.KillTimer(1);
B = 3;
//Code에 저장된 종목코드 미체결 모두 취소
var UF = Account1.GetTheNumberOfUnfills();
Main.MessageList(HHMMSS,"|전체미체결 취소:",UF);
if (UF > 0)
{
for (var i = UF - 1; i >= 0; i--)
{
Account1.SetUnfill(i);
for (var x = 1; 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(HHMMSS,"|보유종목:",F);
for (var i = 0; i < F; i++)
{
Account1.SetBalance(i)
for (var x = 1; x < Code.length; x++)
{
if (Account1.Balance.count > 0 &&
Account1.Balance.position == 2 &&
Account1.Balance.code == Code[x])
{
Main.MessageList(HHMMSS,"|청산:",Account1.Balance.code, Account1.Balance.count);
SID[x] = Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Option1.GetBid(Account1.Balance.code, 1),0);
break;
}
}
}
//60초 타이머
Main.SetTimer(2,60000);
}
}
}
if (nEventID == 2)
{
Main.KillTimer(2);
Main.MessageList(HHMMSS,"|청산 정정주문");
for (var i = 1; i < Code.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)
{
var d = new Date();
var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
if (B == 2 && OrderResponse.isNormal == true )
{
for (var i = 1; i <= ATMLevel; i++)
{
if (OrderResponse.orderID == BID[i])
{
BNUM[i] = OrderResponse.orderNum;
Main.MessageList(HHMMSS,"|OnOrderResponse",i,OrderResponse.orderID,BNUM[i]);
return;
}
}
}
if (B == 3 && OrderResponse.isNormal == true )
{
for (var i = 1; i <= ATMLevel; i++)
{
if (OrderResponse.orderID == SID[i])
{
SNUM[i] = OrderResponse.orderNum;
Main.MessageList(HHMMSS,"|OnOrderResponse",i,OrderResponse.orderID,SNUM[i]);
return;
}
}
}
}
function Main_OnNotifyFill(NotifyFill)
{
var d = new Date();
var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();
for (var i = 1; i <= ATMLevel; i++)
{
if (NotifyFill.orderNum == BNUM[i] && NotifyFill.orderKind == 2)
{
FV[i] = FV[i]+1;
Main.MessageList(HHMMSS,"|OnNotifyFill",i,FV[i]);
}
}
}
즐거운 하루되세요