커뮤니티

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

프로필 이미지
좌오비우오비
2026-10-02 19:53:29
76
글번호 233796
답변완료

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


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 CallCode; var CallPrice;

var CC;

var CallOrderCode;

var CallExit;


function Main_OnStart()

{

      CallExit = false;

    

    Main.SetTimer(1, 5000);

}


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

function Chart1_OnRiseSignal(Signal)

{

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

      if (Signal.signalKind == 1)

      {

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

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

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

            //ATM위 행사가 갯수

            UNum = Option1.uppersATM;

            //ATM아래 행사가 갯수

            LNum = Option1.lowersATM;

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

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

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

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

            

            //콜종목 찾기

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

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

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

            {

                  //값이 0.50 이하이면

                  if (Option1.GetCurrent(0, i) <= 0.50)

                  {

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

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

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

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

                  //주의

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

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

                  }

                  else// 0.50 보다 크면

                  {

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

                  CallPrice[i+LNum] = -1;

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

                  CallCode[i+LNum] = -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]

                  }

            }

      

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

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


            


            //콜옵션종목 매수

            if (CallExit == false)

            {      

                       

                  //지정가

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


                  //시장가

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

            }

      }


if (Signal.signalKind == 2)

{

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

}


}


답변 1
프로필 이미지

예스스탁 예스스탁 답변

2026-10-14 11:20:29

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