この戦略は,二重移動平均値とMACD指標を組み合わせたトレンドフォローシステムである.特定のエントリータイミングのためにMACD指標を使用しながらトレンド方向を決定するために50期および200期移動平均値を使用する.この戦略は,ダイナミックなストップ・ロストとテイク・プロフィートメカニズム,および複数のフィルタリング条件を使用して取引品質を向上させる.これは正確なエントリーと出口ルールで15分間のタイムフレームで動作する完全な取引システムである.
基本的な論理はいくつかの重要な要素に基づいています.
この戦略は,完全に論理的なトレードシステムに従った,よく設計されたトレンドです.クラシックな技術指標と近代的なリスク管理方法を組み合わせることで,戦略はトレンドキャプチャとリスク制御をバランスします.最適化のための領域がある一方で,全体的に実質的に価値のあるトレード戦略です.トレーダーは,ライブ実装の前に徹底的なバックテストを行い,特定のトレードインstrumentと市場環境に応じてパラメータを調整することをお勧めします.
/*backtest start: 2024-11-12 00:00:00 end: 2024-12-11 08:00:00 period: 1h basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © WolfofAlgo //@version=5 strategy("Trend Following Scalping Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=200) // Input Parameters stopLossPips = input.float(5.0, "Stop Loss in Pips", minval=1.0) takeProfitPips = input.float(10.0, "Take Profit in Pips", minval=1.0) useFixedTakeProfit = input.bool(true, "Use Fixed Take Profit") // Moving Average Parameters fastMA = input.int(50, "Fast MA Period") slowMA = input.int(200, "Slow MA Period") // MACD Parameters macdFastLength = input.int(12, "MACD Fast Length") macdSlowLength = input.int(26, "MACD Slow Length") macdSignalLength = input.int(9, "MACD Signal Length") // Trade Filter Parameters (Adjusted to be less strict) minBarsBetweenTrades = input.int(5, "Minimum Bars Between Trades", minval=1) trendStrengthPeriod = input.int(10, "Trend Strength Period") minTrendStrength = input.float(0.4, "Minimum Trend Strength", minval=0.1, maxval=1.0) macdThreshold = input.float(0.00005, "MACD Threshold", minval=0.0) // Variables for trade management var int barsLastTrade = 0 barsLastTrade := nz(barsLastTrade[1]) + 1 // Calculate Moving Averages ma50 = ta.sma(close, fastMA) ma200 = ta.sma(close, slowMA) // Calculate MACD [macdLine, signalLine, _] = ta.macd(close, macdFastLength, macdSlowLength, macdSignalLength) // Calculate trend strength (simplified) trendDirection = ta.ema(close, trendStrengthPeriod) > ta.ema(close, trendStrengthPeriod * 2) isUptrend = close > ma50 and ma50 > ma200 isDowntrend = close < ma50 and ma50 < ma200 // Calculate pip value pointsPerPip = syminfo.mintick * 10 // Entry Conditions with Less Strict Filters macdCrossUp = ta.crossover(macdLine, signalLine) and math.abs(macdLine - signalLine) > macdThreshold macdCrossDown = ta.crossunder(macdLine, signalLine) and math.abs(macdLine - signalLine) > macdThreshold // Long and Short Conditions longCondition = close > ma50 and macdCrossUp and barsLastTrade >= minBarsBetweenTrades and isUptrend shortCondition = close < ma50 and macdCrossDown and barsLastTrade >= minBarsBetweenTrades and isDowntrend // Exit Conditions (made more lenient) exitLongCondition = macdCrossDown or close < ma50 exitShortCondition = macdCrossUp or close > ma50 // Reset bars counter on new trade if (longCondition or shortCondition) barsLastTrade := 0 // Calculate stop loss and take profit levels longStopPrice = strategy.position_avg_price - (stopLossPips * pointsPerPip) longTakeProfitPrice = strategy.position_avg_price + (takeProfitPips * pointsPerPip) shortStopPrice = strategy.position_avg_price + (stopLossPips * pointsPerPip) shortTakeProfitPrice = strategy.position_avg_price - (takeProfitPips * pointsPerPip) // Plot Moving Averages plot(ma50, "50 MA", color=color.blue) plot(ma200, "200 MA", color=color.red) // Plot Entry Signals plotshape(longCondition, "Long Signal", shape.triangleup, location.belowbar, color.green, size=size.small) plotshape(shortCondition, "Short Signal", shape.triangledown, location.abovebar, color.red, size=size.small) // Strategy Entry Rules if (longCondition and strategy.position_size == 0) strategy.entry("Long", strategy.long) if (shortCondition and strategy.position_size == 0) strategy.entry("Short", strategy.short) // Strategy Exit Rules if (strategy.position_size > 0 and exitLongCondition) strategy.close("Long") if (strategy.position_size < 0 and exitShortCondition) strategy.close("Short") // Stop Loss and Take Profit Management if (strategy.position_size > 0) strategy.exit("Long TP/SL", "Long", stop=longStopPrice, limit=useFixedTakeProfit ? longTakeProfitPrice : na) if (strategy.position_size < 0) strategy.exit("Short TP/SL", "Short", stop=shortStopPrice, limit=useFixedTakeProfit ? shortTakeProfitPrice : na) // Performance Metrics var float totalTrades = 0 var float winningTrades = 0 var float totalProfitPips = 0 var float totalLossPips = 0 if (strategy.closedtrades > 0) totalTrades := strategy.closedtrades winningTrades := strategy.wintrades totalProfitPips := strategy.grossprofit / pointsPerPip totalLossPips := math.abs(strategy.grossloss) / pointsPerPip // Display Stats var label statsLabel = na label.delete(statsLabel[1]) // Create performance stats text var string stats = "" if (strategy.closedtrades > 0) winRate = (winningTrades / math.max(totalTrades, 1)) * 100 avgWin = totalProfitPips / math.max(winningTrades, 1) avgLoss = totalLossPips / math.max(totalTrades - winningTrades, 1) plRatio = avgWin / math.max(avgLoss, 1) stats := "Win Rate: " + str.tostring(winRate, "#.##") + "%\n" + "Avg Win: " + str.tostring(avgWin, "#.##") + " pips\n" + "Avg Loss: " + str.tostring(avgLoss, "#.##") + " pips\n" + "P/L Ratio: " + str.tostring(plRatio, "#.##") + "\n" + "Total Trades: " + str.tostring(totalTrades, "#") statsLabel := label.new(x=bar_index, y=high, text=stats, style=label.style_label_down, color=color.new(color.blue, 80))