커뮤니티

야간옵션

프로필 이미지
좌오비우오비
2026-01-03 09:03:22
59
글번호 229548
답변완료

아래수식은

국내 옵션  주간 거래수식입니다.

   - 수식 내용

       084500에 15분간 변동성 체크하고 090000 거래시작

       익절,손절,151500에 endofday 작동

       

야간거래에 사용할 수 있도록 수정바랍니다.


  1. 첫번째 요청수식

       오후6시에 15분간 변동성 체크하고 오후6시15분 거래시작

       익절,손절, 새벽2시 endofday 작동


  2.  두번째 요청수식

      오후10시에 15분간 변동성 체크하고 오후10시15분 거래시작

       익절,손절, 새벽5시 endofday 작동


항상 고맙습니다.



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


var ID1, ID2, num1, num2;

var Entry, CallCode, PutCode;

var Xv1, Xv2;

var HasExited;  // 청산 후 재진입을 방지하는 변수

var VolatilityCheckPassed;  // 변동성 필터 확인 변수

var InitialSum, FinalSum;  // 양합 체크용 변수

var a, b;  // 양합

var FilterTimePassed;  // 필터 시간이 지났는지 여부

var HasSoldCall = false; // 콜 옵션 매도 여부

var HasSoldPut = false;  // 풋 옵션 매도 여부


function Main_OnStart() {

    Main.MessageList("Start");

    Main.SetTimer(1, 5000);  // 기존 타이머 설정 (5초 간격)

    Main.SetTimer(2, 1000);  // 청산을 위한 타이머 설정 (1초 간격)

    Main.SetTimer(3, 1000);  // 변동성 필터용 타이머 설정 (1초 간격)

    Entry = 0;  // 초기 Entry 값 설정

    HasExited = false;  // 초기 재진입 가능 상태

    VolatilityCheckPassed = false;  // 변동성 필터 초기화

    InitialSum = null;  // 초기 양합값 초기화

    FinalSum = null;  // 최종 양합값 초기화

    a = null;  //  a양합 초기화

    b = null;  //  b양합 초기화

    FilterTimePassed = false;  // 필터 시간이 지났는지 여부

}


function Main_OnTimer(nEventID) {

    var d = new Date();

    var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds();


    if (nEventID == 3) {

        // 변동성 필터 확인 타이머 설정

        if (HHMMSS == 084500) {

            // 084500 양합값 기록

            a = Option1.GetCurrent(0, 0) + Option1.GetCurrent(1, 0);

        } else if (HHMMSS == 085959) {

            // 085959 양합값 기록

            b = Option1.GetCurrent(0, 0) + Option1.GetCurrent(1, 0);


            if (a !== null && b !== null) {

                // 양합 차이 계산

                var sumDifference = a - b;


                // 변동성 high 시장으로 판단

                if (sumDifference >= 999) {

                    Main.MessageList("Market volatility is low. Skipping trading.");

                    VolatilityCheckPassed = true;  // 변동성 필터 통과

                }

            }

        }


        // 필터 시간이 지났는지 체크

        if (HHMMSS >= 090000) {  // 09시 00분부터 거래 가능

            FilterTimePassed = true;

        }

    }


    if (nEventID == 1 && !HasExited) {  // 재진입 방지 조건 추가

        if (HHMMSS >= 084500 && HHMMSS < 150000) { // 0845부터 1500까지

            if (FilterTimePassed) {

                var callPrice = Option1.GetCurrent(0, 0);

                var putPrice = Option1.GetCurrent(1, 0);

                var sum = callPrice + putPrice;

                var diff = Math.abs(callPrice - putPrice);


                // 진입 조건

                if (Entry == 0 && sum <= 999 && diff <= 2.00 && !VolatilityCheckPassed) {

                    Entry = sum;

                    CallCode = Option1.GetATMCallRecent(0);

                    PutCode = Option1.GetATMPutRecent(0);


                    ID1 = Account1.OrderBuy(CallCode, 1, Option1.GetAsk(CallCode, 5), 0);

                    ID2 = Account1.OrderBuy(PutCode, 1, Option1.GetAsk(PutCode, 5), 0);

                    Xv1 = 1;

                    Xv2 = 1;


                    // 진입 성공 시 메시지

                    Main.MessageList("Trade entry successful. Market volatility is high. Trading ON.");

                }

            }


            if (Entry > 0 && HHMMSS < 151500 &&

                  (Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode) >= Entry+999) ||

                  (Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode) <= Entry-1.00)) {

                // 청산 로직

                if (Xv1 > 0 && !HasSoldCall) {

                    Account1.SetUnfill(num1);

                    if (Account1.Unfill.count > 0) {

                        Xv1 = Xv1 - Account1.Unfill.count;

                        Account1.OrderCancel(num1);

                    }


                    Account1.OrderSell(CallCode, Xv1, Option1.GetBid(CallCode, 5), 0);

                    HasSoldCall = true;  // 콜 옵션 매도 완료

                    Main.MessageList("Call option sold.");

                }


                if (Xv2 > 0 && !HasSoldPut) {

                    Account1.SetUnfill(num2);

                    if (Account1.Unfill.count > 0) {

                        Xv2 = Xv2 - Account1.Unfill.count;

                        Account1.OrderCancel(num2);

                    }


                    Account1.OrderSell(PutCode, Xv2, Option1.GetBid(PutCode, 5), 0);

                    HasSoldPut = true;  // 풋 옵션 매도 완료

                    Main.MessageList("Put option sold.");

                }


                // Entry = 0;  // 필요한 경우에만 주석 해제

                Main.KillTimer(1);

            }

        }

    }


    // 1515에 청산 로직 추가

    if (Entry > 0 && HHMMSS >= 151500) {

        Main.MessageList("Clearing orders");

        if (Xv1 > 0 && !HasSoldCall) {

            Account1.SetUnfill(num1);

            if (Account1.Unfill.count > 0) {

                Xv1 = Xv1 - Account1.Unfill.count;

                Account1.OrderCancel(num1);

            }


            Account1.OrderSell(CallCode, Xv1, Option1.GetBid(CallCode, 5), 0);

            HasSoldCall = true;  // 콜 옵션 매도 완료

            Main.MessageList("Call option sold.");

        }


        if (Xv2 > 0 && !HasSoldPut) {

            Account1.SetUnfill(num2);

            if (Account1.Unfill.count > 0) {

                Xv2 = Xv2 - Account1.Unfill.count;

                Account1.OrderCancel(num2);

            }


            Account1.OrderSell(PutCode, Xv2, Option1.GetBid(PutCode, 5), 0);

            HasSoldPut = true;  // 풋 옵션 매도 완료

            Main.MessageList("Put option sold.");

        }


        Main.KillTimer(1);

    }

}


function Main_OnOrderResponse(OrderResponse) {

    if (OrderResponse.orderID == ID1) {

        num1 = OrderResponse.orderNum;

    }


    if (OrderResponse.orderID == ID2) {

        num2 = OrderResponse.orderNum;

    }

}


답변 1
프로필 이미지

예스스탁 예스스탁 답변

2026-01-13 12:59:00

안녕하세요 예스스탁입니다. 시작시간, 필터체크시간, 종료시간을 변수처리해 원하시는 시간으로 지정하실 수 있게 수정해 드립니다. var 시작시간 = 180000; var 필터체크시간 = 181500; var 종료시간 = 20000; var ID1, ID2, num1, num2; var Entry, CallCode, PutCode; var Xv1, Xv2; var HasExited; // 청산 후 재진입을 방지하는 변수 var VolatilityCheckPassed; // 변동성 필터 확인 변수 var InitialSum, FinalSum; // 양합 체크용 변수 var a, b; // 양합 var FilterTimePassed; // 필터 시간이 지났는지 여부 var HasSoldCall = false; // 콜 옵션 매도 여부 var HasSoldPut = false; // 풋 옵션 매도 여부 var HHMMSS,HHMMSS1,TimeStep; function Main_OnStart() { Main.MessageList("Start"); Main.SetTimer(1, 5000); // 기존 타이머 설정 (5초 간격) Main.SetTimer(2, 1000); // 청산을 위한 타이머 설정 (1초 간격) Main.SetTimer(3, 1000); // 변동성 필터용 타이머 설정 (1초 간격) Entry = 0; // 초기 Entry 값 설정 HasExited = false; // 초기 재진입 가능 상태 VolatilityCheckPassed = false; // 변동성 필터 초기화 InitialSum = null; // 초기 양합값 초기화 FinalSum = null; // 최종 양합값 초기화 a = null; // a양합 초기화 b = null; // b양합 초기화 //시작시 0 TimeStep = 0; } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS1 = HHMMSS; HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds(); if (nEventID == 3) { // 변동성 필터 확인 타이머 설정 if (HHMMSS >= 시작시간 && HHMMSS1 < 시작시간) { // 084500 양합값 기록 a = Option1.GetCurrent(0, 0) + Option1.GetCurrent(1, 0); //시작시간이 되면 1 TimeStep = 1; } if (HHMMSS >= 시작시간 && HHMMSS < 필터체크시간) { //시작시간이후 필터체크시간이전에 값저장 b = Option1.GetCurrent(0, 0) + Option1.GetCurrent(1, 0); if (a !== null && b !== null) { // 양합 차이 계산 var sumDifference = a - b; // 변동성 high 시장으로 판단 if (sumDifference >= 999) { Main.MessageList("Market volatility is low. Skipping trading."); VolatilityCheckPassed = true; // 변동성 필터 통과 } } } // 필터 시간이 지났는지 체크 if (HHMMSS >= 필터체크시간 && HHMMSS1 < 필터체크시간) { //필터시간 지나면 2 TimeStep = 2; } } if (nEventID == 1 && !HasExited) // 재진입 방지 조건 추가 { if (TimeStep == 2) //필터체크시간~종료시간 { var callPrice = Option1.GetCurrent(0, 0); var putPrice = Option1.GetCurrent(1, 0); var sum = callPrice + putPrice; var diff = Math.abs(callPrice - putPrice); // 진입 조건 if (Entry == 0 && sum <= 999 && diff <= 2.00 && !VolatilityCheckPassed) { Entry = sum; CallCode = Option1.GetATMCallRecent(0); PutCode = Option1.GetATMPutRecent(0); ID1 = Account1.OrderBuy(CallCode, 1, Option1.GetAsk(CallCode, 5), 0); ID2 = Account1.OrderBuy(PutCode, 1, Option1.GetAsk(PutCode, 5), 0); Xv1 = 1; Xv2 = 1; // 진입 성공 시 메시지 Main.MessageList("Trade entry successful. Market volatility is high. Trading ON."); } if (Entry > 0 && (Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode) >= Entry+999) || (Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode) <= Entry-1.00)) { // 청산 로직 if (Xv1 > 0 && !HasSoldCall) { Account1.SetUnfill(num1); if (Account1.Unfill.count > 0) { Xv1 = Xv1 - Account1.Unfill.count; Account1.OrderCancel(num1); } Account1.OrderSell(CallCode, Xv1, Option1.GetBid(CallCode, 5), 0); HasSoldCall = true; // 콜 옵션 매도 완료 Main.MessageList("Call option sold."); } if (Xv2 > 0 && !HasSoldPut) { Account1.SetUnfill(num2); if (Account1.Unfill.count > 0) { Xv2 = Xv2 - Account1.Unfill.count; Account1.OrderCancel(num2); } Account1.OrderSell(PutCode, Xv2, Option1.GetBid(PutCode, 5), 0); HasSoldPut = true; // 풋 옵션 매도 완료 Main.MessageList("Put option sold."); } // Entry = 0; // 필요한 경우에만 주석 해제 Main.KillTimer(1); } } } // 02시에 청산 로직 추가 if (Entry > 0 && HHMMSS >= 종료시간 && HHMMSS < 종료시간) { //종료시간이 되면 3 TimeStep = 3; Main.MessageList("Clearing orders"); if (Xv1 > 0 && !HasSoldCall) { Account1.SetUnfill(num1); if (Account1.Unfill.count > 0) { Xv1 = Xv1 - Account1.Unfill.count; Account1.OrderCancel(num1); } Account1.OrderSell(CallCode, Xv1, Option1.GetBid(CallCode, 5), 0); HasSoldCall = true; // 콜 옵션 매도 완료 Main.MessageList("Call option sold."); } if (Xv2 > 0 && !HasSoldPut) { Account1.SetUnfill(num2); if (Account1.Unfill.count > 0) { Xv2 = Xv2 - Account1.Unfill.count; Account1.OrderCancel(num2); } Account1.OrderSell(PutCode, Xv2, Option1.GetBid(PutCode, 5), 0); HasSoldPut = true; // 풋 옵션 매도 완료 Main.MessageList("Put option sold."); } Main.KillTimer(1); } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == ID1) { num1 = OrderResponse.orderNum; } if (OrderResponse.orderID == ID2) { num2 = OrderResponse.orderNum; } } 즐거운 하루 되세요