该策略基于MACD指标的收敛与发散来判断交易信号。当MACD线与信号线出现交叉,且MACD线的值大于1.5或小于-1.5时,分别产生做多和做空信号。同时,策略设置了固定的止盈止损点位,并引入了风险回报比(R:R)的概念。此外,该策略还采用了日内最大亏损和最大盈利限制,以及更严格的移动止损措施,以更好地控制风险。
该策略通过MACD指标的收敛与发散来判断交易信号,同时引入了风险回报比、移动止损和日内限制等风险控制措施。虽然策略在一定程度上能够捕捉趋势行情并控制风险,但仍存在一些优化和改进的空间。未来可以考虑从信号确认、止盈止损、移动止损和日内限制等维度进行优化,以期获得更稳健和可观的回报。
/*backtest
start: 2023-05-28 00:00:00
end: 2024-06-02 00:00:00
period: 1d
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/
// © DD173838
//@version=5
strategy("MACD Convergence Strategy with R:R, Daily Limits, and Tighter Stop Loss", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1)
// MACD settings
fastLength = input.int(12, title="Fast Length", minval=1)
slowLength = input.int(26, title="Slow Length", minval=1)
signalSmoothing = input.int(9, title="Signal Smoothing", minval=1)
source = input(close, title="Source")
// Calculate MACD
[macdLine, signalLine, _] = ta.macd(source, fastLength, slowLength, signalSmoothing)
// Plot MACD and signal line
plot(macdLine, title="MACD Line", color=color.blue)
plot(signalLine, title="Signal Line", color=color.red)
// Define convergence conditions
macdConvergenceUp = ta.crossover(macdLine, signalLine) and macdLine > 1.5
macdConvergenceDown = ta.crossunder(macdLine, signalLine) and macdLine < -1.5
// Define take profit and stop loss
takeProfit = 600
stopLoss = 100
// Plot buy and sell signals on the chart
plotshape(series=macdConvergenceDown, title="Short Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="SHORT")
plotshape(series=macdConvergenceUp, title="Long Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="LONG")
// Execute short and long orders with defined take profit and stop loss
if (macdConvergenceDown)
strategy.entry("Short", strategy.short, qty=1, stop=high + (stopLoss / syminfo.mintick), limit=low - (takeProfit / syminfo.mintick))
if (macdConvergenceUp)
strategy.entry("Long", strategy.long, qty=1, stop=low - (stopLoss / syminfo.mintick), limit=high + (takeProfit / syminfo.mintick))
// Trailing stop logic
var float entryPrice = na
var float trailingStopPrice = na
if (strategy.position_size != 0)
entryPrice := strategy.opentrades.entry_price(0)
if (strategy.position_size > 0) // For long positions
if (close - entryPrice > 300)
trailingStopPrice := entryPrice + (close - entryPrice - 300)
if (strategy.position_size < 0) // For short positions
if (entryPrice - close > 300)
trailingStopPrice := entryPrice - (entryPrice - close - 300)
if (strategy.position_size > 0 and not na(trailingStopPrice) and close < trailingStopPrice)
strategy.close("Long", comment="Trailing Stop")
if (strategy.position_size < 0 and not na(trailingStopPrice) and close > trailingStopPrice)
strategy.close("Short", comment="Trailing Stop")
// Daily drawdown and profit limits
var float startOfDayEquity = na
if (na(startOfDayEquity) or ta.change(time('D')) != 0)
startOfDayEquity := strategy.equity
maxDailyLoss = 600
maxDailyProfit = 1800
currentDailyPL = strategy.equity - startOfDayEquity
if (currentDailyPL <= -maxDailyLoss)
strategy.close_all(comment="Max Daily Loss Reached")
if (currentDailyPL >= maxDailyProfit)
strategy.close_all(comment="Max Daily Profit Reached")