커뮤니티

차트시그널로 진입시 두번째 이상의 거래를 할 수 있는 수식

프로필 이미지
좌오비우오비
2026-01-26 18:37:46
48
글번호 230097

아래 수식은 차트 신호로 진입하고 청산하는 수식입니다.

차트가 1회 진입, 1회 청산할 때는 문제가 없는데...


최근 차트신호를 2회 이상의 진입과 청산으로 바꾼 후 사용해보니

2회차부터는 진입하지 않습니다.

차트신호에 따라 두번째 이상의 거래를 할 수 있게 수정해 주십시요.


차트 진입명칭은 아래처럼 사용합니다.

     1회차 진입명  "b1"

     2회차부터 진입명 "b2"


1회차 b1 진입, 2회차 이상은 b2 가 반복해서 진입합니다.

     ex) 5회 거래면 진입명이 b1,b2,b2,b2,b2 입니다.


청산은 진입명과 연계되어 청산하고 있습니다.



항상 고맙습니다.


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


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.12 이하 중 가장 큰 가격을 가지는 종목을 찾음

            //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.12 이하이면

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

                  {

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

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

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

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

                  //주의

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

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

                  }

                  else//0.12 보다 크면

                  {

                  //배열변수 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.OrderBuy(CallOrderCode, 1, 0, 1);

            }

      }


//해당 신호가 청산신호면

if (Signal.signalKind == 2)

{

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

}


}


답변 0