この戦略は,MACD,RSI,PSARおよびその他の技術指標を動的マネーマネジメント方法論と統合し,トレンドを追跡し,複数のタイムフレームで逆転取引を行う.この戦略は,短期,中期および長期の取引に適用することができます.
この戦略は,トレンド方向を決定するためにPSAR指標を使用する. EMAとBBの中間線間のクロスオーバーは最初の確認点として機能する. MACDヒストグラムの方向は2番目の確認点として機能する. RSIの過剰購入および過剰販売エリアは3番目の確認点として機能する. 上記のすべての条件を満たしたときに取引信号が生成される.
ポジションに入ると,利益とストップ損失ポイントが設定されます.ストップ損失ポイントは,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')