커뮤니티
시스템
안녕하세요 아래식을 수정완료해주시면 정말정말 감사하겠습나다
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