커뮤니티

질문드립니다.

프로필 이미지
지나리
2026-06-05 22:51:38
59
글번호 232288
답변완료

안녕하세요.


아래 식은 현재가격 1.0 이하의 콜/풋 옵션 중 가장 높은 가격의 종목을 선정하는 식입니다.


그런데, 현재가격 1.0이하가 아니라 매도호가 1.0이하의 콜/풋 옵션 중에 가장 높은 가격의 종목을 선정하는 식도 가능한가요?


매번 큰 도움 주셔서 감사드립니다.





/*스크립트시작-----------------------------------------------------*/

var UNum; var LNum;

var CallCode; var CallPrice;

var PutCode; var PutPrice;

var CC; var PP;

var CallOrderCode; var PutOrderCode;


//차트에서 신호가 발생하면

function Chart1_OnRiseSignal(Signal)

{

//해당 신호가 매수신호이면

if (Signal.signalKind == 1)

{

Main.MessageList("--------------------------------------------");

Main.MessageList("매수신호 발생");

//1.0이하 중 가장 큰 가격을 가지는 종목을 찾음

//ATM위 행사가 갯수

UNum = Option.uppersATM;

//ATM아래 행사가 갯수

LNum = Option.lowersATM;

//각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언

CallCode = new Array(UNum+LNum+1);

//각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언

CallPrice = new Array(UNum+LNum+1);

//각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언

PutCode = new Array(UNum+LNum+1);

//각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언

PutPrice = new Array(UNum+LNum+1);


//콜종목 찾기

//콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로

//for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함

for (var i = -LNum; i <= UNum; i++)

{

//값이 1.0이하이면

if (Option.GetCurrent(0, i) <= 1.0)

{

//해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장

CallPrice[i+LNum] = Option.GetCurrent(0, i);

//해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장

CallCode[i+LNum] = Option.GetATMCallRecent(i);

//주의

//배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터

//저장하도록 작성해야 함

}

else//1.0보다 크면

{

//배열변수 CallPrice의 방번호 i+LNum에 -1 저장

CallPrice[i+LNum] = -1;

//배열변수 CallCode의 방번호 i+LNum에 -1 저장

CallCode[i+LNum] = -1;

}

}


//풋종목 찾기

//풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로

//for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함

for (var ii = -UNum; ii <= LNum; ii++)

{

//ii단계 풋종목이 1.0이하이면

if (Option.GetCurrent(1, ii) <= 1.0 )

{

//해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장

PutPrice[ii+UNum] = Option.GetCurrent(1, ii);

//해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장

PutCode[ii+UNum] = Option.GetATMPutRecent(ii);

}

else //1.0보다 크면

{

//배열변수 PutPrice의 방번호 ii+LNum에 -1 저장

PutPrice[ii+UNum] = -1;

//배열변수 PutCode의 방번호 ii+LNum에 -1 저장

PutCode[ii+UNum] = -1;

}

}

//배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고

//CallCode의 동일 방번호의 값을 CallOrderCode에 저장

CC = -1;

CallOrderCode = -1;

for (var iii = -LNum; iii <= UNum; iii++)

{

if (CallPrice[iii+LNum] > CC)

{

CC = CallPrice[iii+LNum];

CallOrderCode = CallCode[iii+LNum]

}

}

//배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고

//PutCode의 동일 방번호의 값을 PutOrderCode에 저장

PP = -1;

PutOrderCode = -1;

for (var iiii = -UNum; iiii <= LNum; iiii++)

{

if (PutPrice[iiii+UNum] > PP)

{

PP = PutPrice[iiii+UNum];

PutOrderCode = PutCode[iiii+UNum];

}

}

Main.MessageList("--------------------------------------------");

Main.MessageList("콜종목코드:",CallOrderCode,"/콜현재가 :",CC);

Main.MessageList("풋종목코드:",PutOrderCode,"/풋현재가 :",PP);

//콜옵션종목 매수

Account1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 2), 1);

//콜옵션종목 매수

Account1.OrderBuy(PutOrderCode, 1, Option.GetAskByCode(PutOrderCode, 2), 1);

}

}



답변 1
프로필 이미지

예스스탁 예스스탁 답변

2026-06-09 13:35:02

안녕하세요 예스스탁입니다. 1 현재가가 아닌 매도1호가를 기준으로 종목을 찾게 변경해 드립니다. 2 //콜옵션종목 매수 Account1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 2), 1); //콜옵션종목 매수 Account1.OrderBuy(PutOrderCode, 1, Option.GetAskByCode(PutOrderCode, 2), 1); 주문부분은 매도2호가로 주문하게 되어 있는데 그대로 유지해 드립니다. 3 /*스크립트시작-----------------------------------------------------*/ var UNum; var LNum; var CallCode; var CallPrice; var PutCode; var PutPrice; var CC; var PP; var CallOrderCode; var PutOrderCode; //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //해당 신호가 매수신호이면 if (Signal.signalKind == 1) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수신호 발생"); //1.0이하 중 가장 큰 가격을 가지는 종목을 찾음 //ATM위 행사가 갯수 UNum = Option.uppersATM; //ATM아래 행사가 갯수 LNum = Option.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 CallPrice = new Array(UNum+LNum+1); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 PutPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 1.0이하이면 if (Option1.GetAsk(0,i,1) <= 1.0) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option1.GetAsk(0,i,1); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//1.0보다 크면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var ii = -UNum; ii <= LNum; ii++) { //ii단계 풋종목이 1.0이하이면 if (Option1.GetAsk(0,i,1)) <= 1.0 ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[ii+UNum] = Option1.GetAsk(0,i,1); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[ii+UNum] = Option.GetATMPutRecent(ii); } else //1.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[ii+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[ii+UNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 CC = -1; CallOrderCode = -1; for (var iii = -LNum; iii <= UNum; iii++) { if (CallPrice[iii+LNum] > CC) { CC = CallPrice[iii+LNum]; CallOrderCode = CallCode[iii+LNum] } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 PP = -1; PutOrderCode = -1; for (var iiii = -UNum; iiii <= LNum; iiii++) { if (PutPrice[iiii+UNum] > PP) { PP = PutPrice[iiii+UNum]; PutOrderCode = PutCode[iiii+UNum]; } } Main.MessageList("--------------------------------------------"); Main.MessageList("콜종목코드:",CallOrderCode,"/콜현재가 :",CC); Main.MessageList("풋종목코드:",PutOrderCode,"/풋현재가 :",PP); //콜옵션종목 매수 Account1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 2), 1); //콜옵션종목 매수 Account1.OrderBuy(PutOrderCode, 1, Option.GetAskByCode(PutOrderCode, 2), 1); } } 즐거운 하루되세요