この戦略は,複数の移動平均値とトレンド強度に基づいたインテリジェントな取引システムである.この戦略は,ポジション管理とリスク管理のためのATR波動性指標と組み合わせて,異なる期間の価格と移動平均値との間の偏差を分析することによって,市場のトレンド強さを測定する.この戦略は高いカスタマイズ可能性を提供し,異なる市場環境と取引ニーズに応じてパラメータを柔軟に調整することができます.
戦略の基本論理は以下の側面に基づいています
この戦略は,移動平均値,トレンド強度定量化,キャンドルスタックパターン,ダイナミックリスク管理を組み合わせて包括的な取引システムを構築する.複数の確認メカニズムを通じて取引信頼性を向上させながら戦略的シンプルさを維持する.この戦略の高いカスタマイズ可能性は,異なる取引スタイルと市場環境に適応することを可能にするが,実装中にパラメータ最適化とリスク管理に注意を払わなければならない.
/*backtest start: 2024-12-03 00:00:00 end: 2024-12-10 00:00:00 period: 10m basePeriod: 10m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Customizable Strategy with Signal Intensity Based on Pips Above/Below MAs", overlay=true) // Customizable Inputs // Account and Risk Management account_size = input.int(100000, title="Account Size (USD)", minval=1) compounded_results = input.bool(true, title="Compounded Results") risk_per_trade = input.float(1.0, title="Risk per Trade (%)", minval=0.1, maxval=100) / 100 // Moving Averages Settings ma1_length = input.int(50, title="Moving Average 1 Length", minval=1) ma2_length = input.int(200, title="Moving Average 2 Length", minval=1) // Higher Time Frame for Moving Averages ma_htf = input.timeframe("D", title="Higher Time Frame for MA Delay") // Signal Intensity Range based on pips signal_intensity_min = input.int(0, title="Signal Intensity Start (Pips)", minval=0, maxval=1000) signal_intensity_max = input.int(1000, title="Signal Intensity End (Pips)", minval=0, maxval=1000) // ATR-Based Stop Loss and Take Profit atr_length = input.int(14, title="ATR Length", minval=1) atr_multiplier_stop = input.float(1.5, title="Stop Loss Size (ATR Multiplier)", minval=0.1) atr_multiplier_take_profit = input.float(2.5, title="Take Profit Size (ATR Multiplier)", minval=0.1) // Trailing Stop and Partial Profit trailing_stop_rr = input.float(2.0, title="Trailing Stop (R:R)", minval=0) partial_profit_percentage = input.float(50, title="Take Partial Profit (%)", minval=0, maxval=100) // Trend Filter Settings trend_filter_enabled = input.bool(true, title="Trend Filter Enabled") trend_filter_sensitivity = input.float(50, title="Trend Filter Sensitivity", minval=0, maxval=100) // Candle Pattern Type for Entry entry_candle_type = input.string("Any", title="Entry Candle Type", options=["Any", "Engulfing", "Hammer", "Shooting Star", "Doji"]) // Moving Average Entry Conditions ma_entry_condition = input.string("Both", title="MA Entry", options=["Fast Above Slow", "Fast Below Slow", "Both"]) // Trade Direction (Long, Short, or Both) trade_direction = input.string("Both", title="Trade Direction", options=["Long", "Short", "Both"]) // ATR Calculation atr_value = ta.atr(atr_length) // Moving Average Calculations (using Higher Time Frame) ma1_htf = ta.sma(request.security(syminfo.tickerid, ma_htf, close), ma1_length) ma2_htf = ta.sma(request.security(syminfo.tickerid, ma_htf, close), ma2_length) // Candle Pattern Conditions is_engulfing = close[1] < open[1] and close > open and high > high[1] and low < low[1] is_hammer = (high - low) > 3 * (close - open) and (close > open) and (low == ta.lowest(low, 5)) is_shooting_star = (high - low) > 3 * (open - close) and (open > close) and (high == ta.highest(high, 5)) is_doji = (close - open) <= ((high - low) * 0.1) // Apply the selected candle pattern candle_condition = false if entry_candle_type == "Any" candle_condition := true if entry_candle_type == "Engulfing" candle_condition := is_engulfing if entry_candle_type == "Hammer" candle_condition := is_hammer if entry_candle_type == "Shooting Star" candle_condition := is_shooting_star if entry_candle_type == "Doji" candle_condition := is_doji // Moving Average Entry Conditions ma_cross_above = ta.crossover(ma1_htf, ma2_htf) ma_cross_below = ta.crossunder(ma1_htf, ma2_htf) // Calculate pips distance to MAs and normalize it for signal intensity pip_size = syminfo.mintick * 10 // Assuming Forex; for other asset classes, modify as needed // Calculate distances in pips between price and MAs distance_to_ma1_pips = math.abs(close - ma1_htf) / pip_size distance_to_ma2_pips = math.abs(close - ma2_htf) / pip_size // Calculate signal intensity based on the pips distance // Normalize the signal intensity between the user-specified min and max signal_intensity = math.min(math.max((distance_to_ma1_pips + distance_to_ma2_pips), signal_intensity_min), signal_intensity_max) // Trend Filter Condition (Optional) trend_condition = false if trend_filter_enabled trend_condition := ta.sma(close, ma2_length) > ta.sma(close, ma2_length + int(trend_filter_sensitivity)) // Entry Conditions Based on MA, Candle Patterns, and Trade Direction long_condition = (trade_direction == "Long" or trade_direction == "Both") and (ma_entry_condition == "Fast Above Slow" or ma_entry_condition == "Both") and ma_cross_above and candle_condition and (not trend_filter_enabled or trend_condition) and signal_intensity > signal_intensity_min short_condition = (trade_direction == "Short" or trade_direction == "Both") and (ma_entry_condition == "Fast Below Slow" or ma_entry_condition == "Both") and ma_cross_below and candle_condition and (not trend_filter_enabled or not trend_condition) and signal_intensity > signal_intensity_min // Position Sizing Based on Risk Per Trade and ATR for Stop Loss risk_amount = account_size * risk_per_trade stop_loss_atr = atr_multiplier_stop * atr_value // Calculate the position size based on the risk amount and ATR stop loss position_size = risk_amount / stop_loss_atr // If compounded results are not enabled, adjust position size for non-compounded returns if not compounded_results position_size := position_size / account_size * 100000 // Adjust for non-compounded results // Convert take profit and stop loss from ATR to USD pip_value = syminfo.mintick * 10 // Assuming Forex; for other asset classes, modify as needed take_profit_atr = atr_multiplier_take_profit * atr_value take_profit_usd = (take_profit_atr * pip_value) * position_size stop_loss_usd = (stop_loss_atr * pip_value) * position_size // Trailing Stop trail_stop_level = trailing_stop_rr * stop_loss_atr // Initialize long_box_id and short_box_id as boxes (not ints) var box long_box_id = na var box short_box_id = na // Track Monthly Profit var float monthly_profit = 0.0 if (month(timenow) != month(timenow[1])) // New month monthly_profit := 0 // Long Trade Management if long_condition strategy.entry("Long", strategy.long, qty=position_size) // Partial Profit at 50% position close when 1:1 risk/reward strategy.exit("Partial Profit", from_entry="Long", limit=strategy.position_avg_price + stop_loss_atr, qty_percent=partial_profit_percentage / 100) // Full take profit and stop loss with trailing stop strategy.exit("Take Profit Long", from_entry="Long", limit=strategy.position_avg_price + take_profit_atr, stop=strategy.position_avg_price - stop_loss_atr, trail_offset=trail_stop_level) // Delete the old box if it exists if not na(long_box_id) box.delete(long_box_id) // Plot Take Profit and Stop Loss for Long Positions // long_box_id := box.new(left=bar_index - 1, top=strategy.position_avg_price + take_profit_atr, right=bar_index, bottom=strategy.position_avg_price - stop_loss_atr, bgcolor=color.new(color.green, 90), border_width=1, border_color=color.new(color.green, 0)) // Short Trade Management if short_condition strategy.entry("Short", strategy.short, qty=position_size) // Partial Profit at 50% position close when 1:1 risk/reward strategy.exit("Partial Profit", from_entry="Short", limit=strategy.position_avg_price - stop_loss_atr, qty_percent=partial_profit_percentage / 100) // Full take profit and stop loss with trailing stop strategy.exit("Take Profit Short", from_entry="Short", limit=strategy.position_avg_price - take_profit_atr, stop=strategy.position_avg_price + stop_loss_atr, trail_offset=trail_stop_level) // Delete the old box if it exists // if not na(short_box_id) // box.delete(short_box_id) // Plot Take Profit and Stop Loss for Short Positions // short_box_id := box.new(left=bar_index - 1, top=strategy.position_avg_price + stop_loss_atr, right=bar_index, bottom=strategy.position_avg_price - take_profit_atr, bgcolor=color.new(color.red, 90), border_width=1, border_color=color.new(color.red, 0)) // Plot MAs and Signals plot(ma1_htf, color=color.blue, title="MA1 (HTF)") plot(ma2_htf, color=color.red, title="MA2 (HTF)") plotshape(series=long_condition, location=location.belowbar, color=color.green, style=shape.labelup, title="Buy Signal", text="BUY") plotshape(series=short_condition, location=location.abovebar, color=color.red, style=shape.labeldown, title="Sell Signal", text="SELL")