커뮤니티

시스템

프로필 이미지
달마7
2025-10-21 13:33:09
62
글번호 227110
답변완료

안녕하세요 아래식을 수정완료해주시면 정말정말 감사하겠습나다
Inputs:
    MarketType(1),            // 1 = ES, 2 = NQ
    Length(10),
    ATRlen(14),
    ATRmultForStop(2.0),
    ATRmultForTrail(1.2),     // 트레일링 스톱 배수
    ADXlen(14),
    ADXth(25),
    RSIlen(14),
    RiskPct(0.01),
    AccountSize(100000),
    PvalMinTicks(3),
    PvalATRScale(0.5),
    MaxContracts(10),
    MaxTradesPerDay(3),
    DayProfitTicks(600),
    DayLossTicks(160);

Vars:
    Mom(0),
    ATRv(0),
    ADXv(0),
    RSIv(0),
    PvalTicks(0),
    PvalPrice(0),
    StopTicks(0),
    StopDistance(0),
    RiskPerContract(0),
    ContractsToTrade(0),
    N1(0),
    DayPl(0),
    Xcond(False),
    TradesToday(0),
    HTF_MA(0),
    TickSize(0),
    TickValue(0),
    DayProfitAmt(0),
    DayLossAmt(0),
    TrailStopPrice(0);

/*---------------------------------------------------------------
  상품별 기본 파라미터 설정 (숫자형 MarketType 사용)
---------------------------------------------------------------*/
If MarketType = 1 Then   // ES (E-mini S&P 500)
Begin
    TickSize = 0.25;
    TickValue = 12.5;
    ADXth = 25;
    ATRmultForStop = 2.0;
End
Else If MarketType = 2 Then   // NQ (E-mini NASDAQ)
Begin
    TickSize = 0.25;
    TickValue = 5.0;
    ADXth = 28;
    ATRmultForStop = 2.2;
End;

/*---------------------------------------------------------------
  기본 지표 계산 (호환성: Average(TrueRange, n) 사용)
---------------------------------------------------------------*/
Mom = Close - Close[Length];
If CurrentBar > ATRlen Then
    ATRv = Average(TrueRange, ATRlen)
Else
    ATRv = TrueRange;  // 초기 바 처리용(극초기에는 TrueRange로 대체)

ADXv = ADX(ADXlen);
RSIv = RSI(Close, RSIlen);

PvalTicks = MaxList(PvalMinTicks, IntPortion((ATRv * PvalATRScale) / TickSize + 0.5));
PvalPrice = PvalTicks * TickSize;

StopDistance = ATRv * ATRmultForStop;
StopTicks = MaxList(1, IntPortion(StopDistance / TickSize + 0.5));
RiskPerContract = StopTicks * TickValue;

If RiskPerContract > 0 Then
    ContractsToTrade = IntPortion((AccountSize * RiskPct) / RiskPerContract)
Else
    ContractsToTrade = 1;

If ContractsToTrade < 1 Then ContractsToTrade = 1;
If ContractsToTrade > MaxContracts Then ContractsToTrade = MaxContracts;

/*---------------------------------------------------------------
  일별 손익 관리
---------------------------------------------------------------*/
If BDate <> BDate[1] Then
Begin
    Xcond = False;
    N1 = NetProfit;
    TradesToday = 0;
End;

DayPl = NetProfit - N1;
If TotalTrades > TotalTrades[1] Then TradesToday = TradesToday + 1;

DayProfitAmt = DayProfitTicks * TickValue;
DayLossAmt   = DayLossTicks  * TickValue;

If DayPl >= DayProfitAmt Or DayPl <= -DayLossAmt Then
    Xcond = True;

/*---------------------------------------------------------------
  상위 타임프레임(HTF) 필터 (Data2 = 4H)
  차트에 Data2(240분)를 추가해야 HTF_MA가 계산됩니다.
---------------------------------------------------------------*/
If NumDataStreams > 1 Then
    HTF_MA = AverageFC(Close of Data2, 50)
Else
    HTF_MA = 0;

/*---------------------------------------------------------------
  진입 조건
---------------------------------------------------------------*/
If Xcond = False And TradesToday < MaxTradesPerDay Then
Begin
    // Long Entry
    If Mom > 0 And Mom >= Mom[1] And ADXv > ADXth And RSIv > 50 Then
    Begin
        If (NumDataStreams < 2) Or (Close > HTF_MA) Then
            Buy ("Mom_LE") ContractsToTrade contracts next bar at High - PvalPrice limit;
    End;

    // Short Entry
    If Mom < 0 And Mom <= Mom[1] And ADXv > ADXth And RSIv < 50 Then
    Begin
        If (NumDataStreams < 2) Or (Close < HTF_MA) Then
            SellShort ("Mom_SE") ContractsToTrade contracts next bar at Low + PvalPrice limit;
    End;
End;

/*---------------------------------------------------------------
  포지션 청산: ATR 스톱 + 트레일링 스톱 + 일별 손익 기반
---------------------------------------------------------------*/
If MarketPosition = 1 Then
Begin
    // 기본 ATR 스톱
    ExitLong("ATR_Stop") AtStop EntryPrice - StopTicks * TickSize;

    // 트레일링 스톱: 최근 5봉 최고가 - ATR * ATRmultForTrail
    TrailStopPrice = Highest(High, 5) - ATRv * ATRmultForTrail;
    If TrailStopPrice > EntryPrice - StopTicks * TickSize Then
        ExitLong("TrailStop") AtStop TrailStopPrice;

    // 일별 익절/손절 분배 (기존 방식 유지)
    If CurrentContracts > 0 Then
    Begin
        ExitLong("DayProfit") AtLimit EntryPrice + ((DayProfitAmt - DayPl) / CurrentContracts) / TickValue * TickSize;
        ExitLong("DayLoss")   AtStop  EntryPrice - ((DayLossAmt + DayPl) / CurrentContracts) / TickValue * TickSize;
    End;
End;

If MarketPosition = -1 Then
Begin
    ExitShort("ATR_StopS") AtStop EntryPrice + StopTicks * TickSize;

    TrailStopPrice = Lowest(Low, 5) + ATRv * ATRmultForTrail;
    If TrailStopPrice < EntryPrice + StopTicks * TickSize Then
        ExitShort("TrailStopS") AtStop TrailStopPrice;

    If CurrentContracts > 0 Then
    Begin
        ExitShort("DayProfitS") AtLimit EntryPrice - ((DayProfitAmt - DayPl) / CurrentContracts) / TickValue * TickSize;
        ExitShort("DayLossS")   AtStop  EntryPrice + ((DayLossAmt + DayPl) / CurrentContracts) / TickValue * TickSize;
    End;
End;
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-10-21 14:19:29

안녕하세요 예스스탁입니다. Inputs: MarketType(1), // 1 = ES, 2 = NQ Length(10), ATRlen(14), ATRmultForStop(2.0), ATRmultForTrail(1.2), // 트레일링 스톱 배수 ADXlen(14), ADXth(25), RSIlen(14), RiskPct(0.01), AccountSize(100000), PvalMinTicks(3), PvalATRScale(0.5), MaxContract(10), MaxTradesPerDay(3), DayProfitTicks(600), DayLossTicks(160),NumDataStreams(2); Vars: Mom(0), ATRv(0), ADXv(0), RSIv(0), PvalTicks(0), PvalPrice(0), StopTicks(0), StopDistance(0), RiskPerContract(0), ContractsToTrade(0), N1(0), DayPl(0), Xcond(False), TradesToday(0), HTF_MA(0), TickSize(0), TickValue(0), DayProfitAmt(0), DayLossAmt(0), TrailStopPrice(0); /*--------------------------------------------------------------- 상품별 기본 파라미터 설정 (숫자형 MarketType 사용) ---------------------------------------------------------------*/ If MarketType == 1 Then // ES (E-mini S&P 500) Begin TickSize = 0.25; TickValue = 12.5; End Else If MarketType == 2 Then // NQ (E-mini NASDAQ) Begin TickSize = 0.25; TickValue = 5.0; End; /*--------------------------------------------------------------- 기본 지표 계산 (호환성: Average(TrueRange, n) 사용) ---------------------------------------------------------------*/ Mom = Close - Close[Length]; If CurrentBar > ATRlen Then ATRv = ma(TrueRange, ATRlen); Else ATRv = TrueRange; // 초기 바 처리용(극초기에는 TrueRange로 대체) ADXv = ADX(ADXlen); RSIv = RSI(RSIlen); PvalTicks = MaxList(PvalMinTicks, IntPortion((ATRv * PvalATRScale) / TickSize + 0.5)); PvalPrice = PvalTicks * TickSize; StopDistance = ATRv * ATRmultForStop; StopTicks = MaxList(1, IntPortion(StopDistance / TickSize + 0.5)); RiskPerContract = StopTicks * TickValue; If RiskPerContract > 0 Then ContractsToTrade = IntPortion((AccountSize * RiskPct) / RiskPerContract); Else ContractsToTrade = 1; If ContractsToTrade < 1 Then ContractsToTrade = 1; If ContractsToTrade > MaxContract Then ContractsToTrade = MaxContract; /*--------------------------------------------------------------- 일별 손익 관리 ---------------------------------------------------------------*/ If BDate <> BDate[1] Then Begin Xcond = False; N1 = NetProfit; TradesToday = 0; End; DayPl = NetProfit - N1; If TotalTrades > TotalTrades[1] Then TradesToday = TradesToday + 1; DayProfitAmt = DayProfitTicks * TickValue; DayLossAmt = DayLossTicks * TickValue; If DayPl >= DayProfitAmt Or DayPl <= -DayLossAmt Then Xcond = True; /*--------------------------------------------------------------- 상위 타임프레임(HTF) 필터 (Data2 = 4H) 차트에 Data2(240분)를 추가해야 HTF_MA가 계산됩니다. ---------------------------------------------------------------*/ If NumDataStreams > 1 Then HTF_MA = data2(ma(Close, 50)); Else HTF_MA = 0; /*--------------------------------------------------------------- 진입 조건 ---------------------------------------------------------------*/ If Xcond == False And TradesToday < MaxTradesPerDay Then Begin // Long Entry If Mom > 0 And Mom >= Mom[1] And ADXv > ADXth And RSIv > 50 Then Begin If (NumDataStreams < 2) Or (Close > HTF_MA) Then Buy("Mom_LE",AtLimit,High - PvalPrice,ContractsToTrade); End; // Short Entry If Mom < 0 And Mom <= Mom[1] And ADXv > ADXth And RSIv < 50 Then Begin If (NumDataStreams < 2) Or (Close < HTF_MA) Then Sell("Mom_SE",AtLimit, Low + PvalPrice, ContractsToTrade); End; End; /*--------------------------------------------------------------- 포지션 청산: ATR 스톱 + 트레일링 스톱 + 일별 손익 기반 ---------------------------------------------------------------*/ If MarketPosition == 1 Then Begin // 기본 ATR 스톱 ExitLong("ATR_Stop",AtStop, EntryPrice - StopTicks * TickSize); // 트레일링 스톱: 최근 5봉 최고가 - ATR * ATRmultForTrail TrailStopPrice = Highest(High, 5) - ATRv * ATRmultForTrail; If TrailStopPrice > EntryPrice - StopTicks * TickSize Then ExitLong("TrailStop", AtStop, TrailStopPrice); // 일별 익절/손절 분배 (기존 방식 유지) If CurrentContracts > 0 Then Begin ExitLong("DayProfit", AtLimit, EntryPrice + ((DayProfitAmt - DayPl) / CurrentContracts) / TickValue * TickSize); ExitLong("DayLoss", AtStop, EntryPrice - ((DayLossAmt + DayPl) / CurrentContracts) / TickValue * TickSize); End; End; If MarketPosition == -1 Then Begin ExitShort("ATR_StopS", AtStop, EntryPrice + StopTicks * TickSize); TrailStopPrice = Lowest(Low, 5) + ATRv * ATRmultForTrail; If TrailStopPrice < EntryPrice + StopTicks * TickSize Then ExitShort("TrailStopS", AtStop, TrailStopPrice); If CurrentContracts > 0 Then Begin ExitShort("DayProfitS", AtLimit, EntryPrice - ((DayProfitAmt - DayPl) / CurrentContracts) / TickValue * TickSize); ExitShort("DayLossS", AtStop, EntryPrice + ((DayLossAmt + DayPl) / CurrentContracts) / TickValue * TickSize); End; End; 즐거운 하루되세요