커뮤니티

차트 신호 연동 PUT 옵션 매수 수식에 조건 개선

프로필 이미지
좌오비우오비
2026-10-02 19:54:13
71
글번호 233797
답변완료

차트 신호 연동 PUT 옵션 매수 수식의 진입조건을 개선하고 싶습니다.


1. 개선 내용


체결 조건이 0.50pt 이하지만 가끔 추세가 분출할 때는 0.50pt 을 넘는 체결이 발생합니다.


2.체결가격 상승(0.50pt 초과) 시 행사가 변경 로직 추가


주문 발주 직전 또는 시세 체크 시 해당 행사가의 현재가(또는 매도1호가)가 0.50pt를 초과하여 상승한 경우,

해당 행사가 진입을 취소/제외하고 다시 현재가(또는 매도1호가)가 0.50 이하인 한 단계 아래(더 외가) 풋옵션 행사가를 찾아 매수 주문 발주.

다만, 현재가(또는 매도1호가)가 체결 조건 0.50pt에서 10%까지의 상승은 허용함(0.55이하면 최초 선택한 행사가에서 주문 집행)


항상 고맙습니다.


*******************************************************************************************************************************************


var UNum; var LNum;

var PutCode; var PutPrice;

var PP;

var PutOrderCode;

var PutExit;



function Main_OnStart()

{

      PutExit = false;


    Main.SetTimer(1, 5000);

}


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

function Chart1_OnRiseSignal(Signal)

{

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

      if (Signal.signalKind == 3)

      {

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

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

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

            //ATM위 행사가 갯수

            UNum = Option1.uppersATM;

            //ATM아래 행사가 갯수

            LNum = Option1.lowersATM;

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

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

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

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

            

         

            

            //풋종목 찾기

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

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

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

            {

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

                  if (Option1.GetCurrent(1, ii) <= 0.50)

                  {

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

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

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

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

                  }

                  else // 0.50 보다 크면

                  {

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

                        PutPrice[ii+UNum] = -1;

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

                        PutCode[ii+UNum] = -1;

                  }

            }

           

            //배열변수 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("풋종목코드:",PutOrderCode,"/풋현재가 :",PP);

            


          

            //풋옵션종목 매수

            if (PutExit == false)

            {

                  //지정가

                  Account1.OrderBuy(PutOrderCode, 1, Option1.GetAskByCode(PutOrderCode, 5), 0);

                  //시장가

                  //Account1.OrderSell(PutOrderCode, 1, 0, 1);

            }

      }


if (Signal.signalKind == 4)


{

Account1.OrderSell(PutOrderCode, 1, Option1.GetBidByCode(PutOrderCode, 5), 0);

}

  

}


답변 1
프로필 이미지

예스스탁 예스스탁 답변

2026-10-14 11:20:55

안녕하세요
예스스탁입니다. var PutCode, PutPrice, Putidx; var PutExit; var 기준값 = 0.5; var 허용률 = 10;//% function Main_OnStart() { PutExit = false; Main.SetTimer(1, 5000); } //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //해당 신호가 매도신호이면 if (Signal.signalKind == 3) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수신호 발생"); //매도1호가 기준 0.50 이하 중 가장 큰 가격을 가지는 종목을 찾음 PutCode = ""; PutPrice = 0; Putidx = 0; for (var i = -Option1.uppersATM; i <= Option1.lowersATM; i++) { var Price = Option1.GetAsk(1,i,1); if (Price <= 0.50 && (PutPrice == 0 || (PutPrice > 0 && Price > PutPrice))) { PutCode = Option1.GetATMPutRecent(i); PutPrice = Price; Putidx = i+1; } } Main.MessageList("풋종목코드:",PutCode,"/매도1호가 :",PutPrice); //풋옵션종목 매수 if (PutExit == false && PutPrice > 0) { //매도1호가가 0.5 이하 if (Option1.GetAsk(PutCode, 1) <= 기준값) { //지정가 매수 Account1.OrderBuy(PutCode, 1, Option1.GetAsk(PutCode, 5), 0); } else //매도1호가가 0.5보다 큼 { //기존종목기준 더 외가로 재선정 PutCode = ""; PutPrice = 0; for (var i = Putidx; i <= Option1.lowersATM; i++) { var Price = Option1.GetAsk(1,i,1); if (Price <= 0.50 && (PutPrice == 0 || (PutPrice > 0 && Price > PutPrice))) { PutCode = Option1.GetATMPutRecent(i); PutPrice = Price; } } Main.MessageList("재지정 풋종목코드:",PutCode,"/매도1호가 :",PutPrice); if (PutPrice > 0) { Account1.OrderBuy(PutCode, 1, Option1.GetAsk(PutCode, 5), 0); } } } } if (Signal.signalKind == 4) { Account1.OrderSell(PutCode, 1, Option1.GetBid(PutCode, 5), 0); } }

즐거운 하루되세요