이 전략은 동적 화폐 관리 방법론과 함께 MACD, RSI, PSAR 및 기타 기술 지표를 통합하여 트렌드를 추적하고 여러 시간 프레임에 걸쳐 반전 거래를 수행합니다. 이 전략은 단기, 중기 및 장기 거래에 적용 될 수 있습니다.
이 전략은 트렌드 방향을 결정하기 위해 PSAR 지표를 사용합니다. EMA와 BB 중선 사이의 크로스오버는 첫 번째 확인 포인트로 작용합니다. MACD 히스토그램 방향은 두 번째 확인 포인트로 작용합니다. RSI 과잉 구매 및 과잉 판매 영역은 세 번째 확인 포인트로 작용합니다. 위의 모든 조건이 충족되면 거래 신호가 생성됩니다.
포지션에 입력 한 후, 수익을 취하고 손실을 멈추는 지점이 설정됩니다. 손실을 멈추는 지점은 ATR 값을 고정된 숫자로 곱하여 결정됩니다. 수익을 얻는 지점은 동일한 방식으로 계산됩니다. 한편으로, 부동 손실 비율의 손실을 멈추는 지점이 설정됩니다. 손실이 전체 계정 자본의 특정 비율에 도달하면 손실을 멈추는 것이 유발됩니다.
또한 변동 이윤의 비율 설정도 있습니다. 이윤이 전체 계좌 자본의 특정 비율에 도달하면 이윤을 취합니다.
동적 화폐 관리는 전체 계좌 자금, ATR 값 및 중지 손실에 사용되는 곱셈을 기반으로 포지션 크기를 계산합니다. 최소 거래 양도 설정됩니다.
복수 요인 확인은 잘못된 오류를 방지하고 입력 정확도를 향상시킵니다.
동적 금전관리는 단일 거래 위험을 통제하고 계정을 효과적으로 보호합니다.
스톱 로즈 및 취득 포인트는 ATR에 따라 설정되며, 시장 변동성에 따라 조정될 수 있습니다.
변동 손실과 이익 비율 설정은 수익을 차단하고 인하를 방지합니다.
여러 가지 요인 조합은 어떤 거래 기회를 놓칠 수 있습니다.
높은 비율로 설정하면 더 큰 손실이 발생할 수 있습니다.
잘못된 ATR 값 설정은 너무 넓거나 너무 공격적인 스톱 로스로 이어질 수 있습니다.
부적절한 자금 관리 설정은 지나치게 큰 포지션 크기로 이어질 수 있습니다.
신호의 정확성을 높이기 위해 가중 요소를 조정합니다.
최적의 조합을 찾기 위해 다른 비율 매개 변수 설정을 테스트합니다.
각기 다른 제품 특성에 따라 합리적인 ATR 곱셈을 선택합니다.
역동적으로 재무 관리 매개 변수를 배크테스트 결과에 따라 조정합니다.
시간 프레임 설정을 최적화하고 테스트 트레이딩 세션.
이 전략은 트렌드 결정에 대한 여러 기술적 지표를 통합하고 리스크를 제어하기 위해 동적 금전 관리를 추가하여 여러 시간 프레임에서 안정적인 이익을 실현합니다. 백테스트 결과를 기반으로 요인 가중, 위험 제어 매개 변수 및 금전 관리 설정을 조정하여 추가로 최적화 할 수 있습니다.
/*backtest start: 2023-09-16 00:00:00 end: 2023-10-16 00:00:00 period: 10m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © SoftKill21 //@version=4 strategy("EURUSD 1min strat RISK %% ", overlay=false, initial_capital = 1000) // BACKTESTING RANGE // From Date Inputs fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input(defval = 6, title = "From Month", minval = 1, maxval = 12) fromYear = input(defval = 2020, title = "From Year", minval = 1970) // To Date Inputs toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12) toYear = input(defval = 2020, title = "To Year", minval = 1970) // Calculate start/end date and time condition DST = 1 //day light saving for usa //--- Europe London = iff(DST==0,"0000-0900","0100-1000") //--- America NewYork = iff(DST==0,"0400-1500","0500-1600") //--- Pacific Sydney = iff(DST==0,"1300-2200","1400-2300") //--- Asia Tokyo = iff(DST==0,"1500-2400","1600-0100") //-- Time In Range timeinrange(res, sess) => time(res, sess) != 0 london = timeinrange(timeframe.period, London) newyork = timeinrange(timeframe.period, NewYork) startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) time_cond = true // // // rsi length = input( 5 ) overSold = input( 23 ) overBought = input( 72 ) price = close vrsi = rsi(price, length) co = crossover(vrsi, overSold) cu = crossunder(vrsi, overBought) // macd fast_length_macd = input(title="Fast Length", type=input.integer, defval=12) slow_length_macd = input(title="Slow Length", type=input.integer, defval=26) src_macd = input(title="Source", type=input.source, defval=close) signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9) sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=true) sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true) // Plot colors col_grow_above = #26A69A col_grow_below = #FFCDD2 col_fall_above = #B2DFDB col_fall_below = #EF5350 col_macd = #0094ff col_signal = #ff6a00 // Calculating fast_ma = sma_source ? sma(src_macd, fast_length_macd) : ema(src_macd, fast_length_macd) slow_ma = sma_source ? sma(src_macd, slow_length_macd) : ema(src_macd, slow_length_macd) macd = fast_ma - slow_ma signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length) hist = macd - signal //plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 ) // sar start = input(0.02) increment = input(0.02) maximum = input(0.2) var bool uptrend = na var float EP = na var float SAR = na var float AF = start var float nextBarSAR = na if bar_index > 0 firstTrendBar = false SAR := nextBarSAR if bar_index == 1 float prevSAR = na float prevEP = na lowPrev = low[1] highPrev = high[1] closeCur = close closePrev = close[1] if closeCur > closePrev uptrend := true EP := high prevSAR := lowPrev prevEP := high else uptrend := false EP := low prevSAR := highPrev prevEP := low firstTrendBar := true SAR := prevSAR + start * (prevEP - prevSAR) if uptrend if SAR > low firstTrendBar := true uptrend := false SAR := max(EP, high) EP := low AF := start else if SAR < high firstTrendBar := true uptrend := true SAR := min(EP, low) EP := high AF := start if not firstTrendBar if uptrend if high > EP EP := high AF := min(AF + increment, maximum) else if low < EP EP := low AF := min(AF + increment, maximum) if uptrend SAR := min(SAR, low[1]) if bar_index > 1 SAR := min(SAR, low[2]) else SAR := max(SAR, high[1]) if bar_index > 1 SAR := max(SAR, high[2]) nextBarSAR := SAR + AF * (EP - SAR) //plot(SAR, style=plot.style_cross, linewidth=3, color=color.orange) //plot(nextBarSAR, style=plot.style_cross, linewidth=3, color=color.aqua) //plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr) //bb length_bb = input(17, minval=1) src_bb = input(close, title="Source") mult_bb = input(2.0, minval=0.001, maxval=50, title="StdDev") basis_bb = sma(src_bb, length_bb) dev_bb = mult_bb * stdev(src_bb, length_bb) upper_bb = basis_bb + dev_bb lower_bb = basis_bb - dev_bb offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500) //plot(basis_bb, "Basis", color=#872323, offset = offset) //p1_bb = plot(upper_bb, "Upper", color=color.teal, offset = offset) //p2_bb = plot(lower_bb, "Lower", color=color.teal, offset = offset) //fill(p1_bb, p2_bb, title = "Background", color=#198787, transp=95) //ema len_ema = input(10, minval=1, title="Length") src_ema = input(close, title="Source") offset_ema = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500) out_ema = ema(src_ema, len_ema) //plot(out_ema, title="EMA", color=color.blue, offset=offset_ema) //out_ema e emaul //basis_bb e middle de la bb //hist e histograma // rsi cu band0 cross pt rsi // confirmarea shortCondition = (uptrend==false and crossunder(ema(src_ema, len_ema),sma(src_bb, length_bb)) and hist < 0 and vrsi < overSold) //and time_cond longCondition = (uptrend==true and crossover(ema(src_ema, len_ema),sma(src_bb, length_bb)) and hist > 0 and vrsi > overBought ) //and time_cond //tp=input(0.0025,type=input.float, title="tp") //sl=input(0.001,type=input.float, title="sl") //INDICATOR--------------------------------------------------------------------- //Average True Range (1. RISK) atr_period = input(14, "Average True Range Period") atr = atr(atr_period) strategy.initial_capital = 50000 //MONEY MANAGEMENT-------------------------------------------------------------- balance = strategy.netprofit + strategy.initial_capital //current balance floating = strategy.openprofit //floating profit/loss risk = input(2,type=input.float,title="Risk %")/100 //risk % per trade isTwoDigit = input(false,"Is this a 2 digit pair? (JPY, XAU, XPD...") equity_protector = input(1 ,type=input.float, title="Equity Protection %")/100 //equity protection % equity_protectorTP = input(2 ,type=input.float, title="Equity TP %")/100 //equity protection % multtp = input(5,type=input.float, title="multi atr tp") multsl = input(5,type=input.float, title="multi atr sl") stop = atr*100000*input(1,"SL X")* multsl //Stop level if(isTwoDigit) stop := stop/100 target = atr*100000*input(1,"TP X")*multtp //Stop level //Calculate current DD and determine if stopout is necessary equity_stopout = false if(floating<0 and abs(floating/balance)>equity_protector) equity_stopout := true equity_stopout2 = false if(floating>0 and abs(floating/balance)>equity_protectorTP) equity_stopout2 := true //Calculate the size of the next trade temp01 = balance * risk //Risk in USD temp02 = temp01/stop //Risk in lots temp03 = temp02*100000 //Convert to contracts size = temp03 - temp03%1000 //Normalize to 1000s (Trade size) if(size < 10000) size := 10000 //Set min. lot size //TRADE EXECUTION--------------------------------------------------------------- strategy.close_all(equity_stopout, comment="equity sl", alert_message = "equity_sl") //Close all trades w/equity protector //strategy.close_all(equity_stopout2, comment="equity tp", alert_message = "equity_tp") //Close all trades w/equity protector is_open = strategy.opentrades > 0 strategy.entry("long",true,oca_name="a",when=longCondition and not is_open) //Long entry strategy.entry("short",false,oca_name="a",when=shortCondition and not is_open) //Short entry strategy.exit("exit_long","long",loss=stop, profit=target) //Long exit (stop loss) strategy.close("long",when=shortCondition) //Long exit (exit condition) strategy.exit("exit_short","short",loss=stop, profit=target) //Short exit (stop loss) strategy.close("short",when=longCondition) //Short exit (exit condition) //strategy.entry("long", strategy.long,size,when=longCondition , comment="long" , alert_message = "long") //strategy.entry("short", strategy.short, size,when=shortCondition , comment="short" , alert_message = "short") //strategy.exit("closelong", "long" , profit = close * tp / syminfo.mintick, alert_message = "closelong") //strategy.exit("closeshort", "short" , profit = close * tp / syminfo.mintick, alert_message = "closeshort") //strategy.exit("closelong", "long" ,size, profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closelong") //strategy.exit("closeshort", "short" , size, profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closeshort") //strategy.close("long" , when=not (time_cond), comment="time", alert_message = "closelong" ) //strategy.close("short" , when=not (time_cond), comment="time", alert_message = "closeshort") //strategy.close_all(when=not (time_cond), comment ='time')