
Il s’agit d’une stratégie de négociation de suivi de tendance dynamique basée sur les indicateurs SMA, combinée à des intervalles de prix, à des indicateurs aléatoires et à un mécanisme de protection de multiples bénéfices. La stratégie utilise des signaux croisés de mouvements de prix dans différents intervalles, combinés à des moyennes mobiles à court et à long terme, tout en utilisant des indicateurs aléatoires pour déterminer l’état du marché et la force de la tendance, permettant une capture de tendance efficace.
La logique fondamentale de la stratégie comprend les éléments clés suivants :
La stratégie utilise plusieurs indicateurs techniques et méthodes d’analyse du comportement des prix pour construire un système de négociation complet. L’avantage de la stratégie réside dans les mécanismes de confirmation multiples et le système de freinage flexible, mais il faut également tenir compte de l’impact de l’environnement du marché sur la performance de la stratégie.
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title="SMA Color Strategy",
overlay=true,
initial_capital=10000,
max_bars_back=5000,
max_labels_count=500,
max_boxes_count=500,
default_qty_type=strategy.fixed,
default_qty_value=1,
currency=currency.NONE,
process_orders_on_close=true)
// === INPUTS ===
zoneLength = input.int(20, "Price Zone Length", minval=5)
profitLockPct = input.float(50, "Profit Lock Percentage", minval=1, maxval=100, step=5) / 100
ticksToLock = input.int(12, "Ticks to Activate Lock", minval=1, tooltip="Number of ticks price must move up to activate tick-based lock")
ticksToSecure = input.int(10, "Ticks to Secure", minval=1, tooltip="Number of ticks to lock in once activated")
// Calculate tick values
tickSize = syminfo.mintick
ticksToLockPoints = ticksToLock * tickSize
ticksToSecurePoints = ticksToSecure * tickSize
// Calculate price zones
h = ta.highest(high, zoneLength)
l = ta.lowest(low, zoneLength)
priceRange = h - l
lvl5 = h
lvl4 = l + (priceRange * 0.75) // Orange line
lvl3 = l + (priceRange * 0.50) // Yellow line
lvl2 = l + (priceRange * 0.25) // Green line
lvl1 = l
// Calculate SMAs
sma19 = ta.sma(close, 19)
sma74 = ta.sma(close, 74)
// Stochastic calculation for color logic
k = ta.stoch(close, high, low, 60)
d = ta.sma(k, 10)
// SMA Color Logic with state tracking
var color currentSMAColor = color.orange
var color previousSMAColor = color.orange
var string currentColorName = "ORANGE"
var string previousColorName = "ORANGE"
smaColor = if d >= 80 or d <= 20
color.rgb(255, 215, 0)
else if d > d[1]
color.green
else if d < d[1]
color.red
else
color.orange
// Update color state and names
if smaColor != currentSMAColor
previousSMAColor := currentSMAColor
currentSMAColor := smaColor
previousColorName := currentColorName
currentColorName := if smaColor == color.rgb(255, 215, 0)
"YELLOW"
else if smaColor == color.green
"GREEN"
else if smaColor == color.red
"RED"
else
"ORANGE"
// Color logic for SMA74
sma74Color = if smaColor == color.rgb(255, 215, 0)
color.rgb(255, 215, 0)
else if sma74 < sma19
color.green
else
color.red
// === ENTRY CONDITIONS ===
smaIsGreen = smaColor == color.green
greenCandle = close > open
candleAboveOrange = close > lvl4
candleAboveSMA = close > sma19
crossedAboveOrange = ta.crossover(close, lvl4)
smaIsYellow = smaColor == color.rgb(255, 215, 0)
longCondition1 = smaIsGreen and greenCandle and candleAboveOrange and candleAboveSMA and crossedAboveOrange
longCondition2 = smaIsYellow and crossedAboveOrange and candleAboveSMA
// === PROFIT LOCK SYSTEM ===
var float entryPrice = na
var float maxPrice = na
var float profitLockLevel = na
var bool tickLockActivated = false
var float tickBasedLockLevel = na
// Reset variables on new trade entry
if (longCondition1 or longCondition2)
entryPrice := close
maxPrice := close
profitLockLevel := close * (1 - profitLockPct)
tickLockActivated := false
tickBasedLockLevel := na
// Update maximum price and profit locks when in a trade
if strategy.position_size > 0
maxPrice := math.max(maxPrice, high)
profitLockLevel := math.max(profitLockLevel, maxPrice * (1 - profitLockPct))
// Check if price has moved up enough to activate tick-based lock
if not tickLockActivated and (maxPrice - entryPrice) >= ticksToLockPoints
tickLockActivated := true
tickBasedLockLevel := entryPrice + ticksToSecurePoints
// === EXIT CONDITIONS ===
exitOnYellowLine = close < lvl3
exitOnProfitLock = low < profitLockLevel and strategy.position_size > 0
exitOnTickLock = tickLockActivated and low < tickBasedLockLevel
// === TRADE MANAGEMENT ===
if (longCondition1 or longCondition2)
strategy.entry("Long", strategy.long)
if strategy.position_size > 0
if exitOnYellowLine
strategy.close("Long", comment="Close below yellow")
if exitOnProfitLock
strategy.close("Long", comment="Profit lock triggered")
if exitOnTickLock
strategy.close("Long", comment="Tick-based lock triggered")
// Plot indicators
plot(sma19, "SMA 19", color=smaColor, linewidth=2)
plot(sma74, "SMA 74", color=sma74Color, linewidth=2)
plot(lvl5, "Upper Zone Top", color=color.red, linewidth=2)
plot(lvl4, "Upper Zone Bottom", color=color.orange, linewidth=2)
plot(lvl3, "Middle Line", color=color.yellow, linewidth=2)
plot(lvl2, "Lower Zone Top", color=color.green, linewidth=2)
plot(lvl1, "Lower Zone Bottom", color=color.blue, linewidth=2)
// Plot profit lock levels
plot(strategy.position_size > 0 ? profitLockLevel : na, "Profit Lock Level", color=color.purple, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size > 0 and tickLockActivated ? tickBasedLockLevel : na, "Tick Lock Level", color=color.fuchsia, style=plot.style_linebr, linewidth=2)
// Fill zones
var p1 = plot(lvl5, display=display.none)
var p2 = plot(lvl4, display=display.none)
var p3 = plot(lvl2, display=display.none)
var p4 = plot(lvl1, display=display.none)
fill(p1, p2, color=color.new(color.red, 90))
fill(p3, p4, color=color.new(color.green, 90))
// Debug Table
if barstate.islast
var table debugTable = table.new(position.top_right, 2, 13, bgcolor=color.new(color.black, 70), frame_width=1)
table.cell(debugTable, 0, 0, "Current Color", text_color=color.white)
table.cell(debugTable, 1, 0, currentColorName, text_color=currentSMAColor)
table.cell(debugTable, 0, 1, "Previous Color", text_color=color.white)
table.cell(debugTable, 1, 1, previousColorName, text_color=previousSMAColor)
table.cell(debugTable, 0, 2, "Entry 1 (Green)", text_color=color.white)
table.cell(debugTable, 1, 2, str.tostring(longCondition1), text_color=color.white)
table.cell(debugTable, 0, 3, "Entry 2 (Yellow)", text_color=color.white)
table.cell(debugTable, 1, 3, str.tostring(longCondition2), text_color=color.white)
table.cell(debugTable, 0, 4, "Current Position", text_color=color.white)
table.cell(debugTable, 1, 4, str.tostring(strategy.position_size), text_color=color.white)
table.cell(debugTable, 0, 5, "Entry Price", text_color=color.white)
table.cell(debugTable, 1, 5, str.tostring(entryPrice), text_color=color.white)
table.cell(debugTable, 0, 6, "Max Price", text_color=color.white)
table.cell(debugTable, 1, 6, str.tostring(maxPrice), text_color=color.white)
table.cell(debugTable, 0, 7, "Profit Lock Level", text_color=color.white)
table.cell(debugTable, 1, 7, str.tostring(profitLockLevel), text_color=color.white)
table.cell(debugTable, 0, 8, "Tick Lock Active", text_color=color.white)
table.cell(debugTable, 1, 8, str.tostring(tickLockActivated), text_color=color.white)
table.cell(debugTable, 0, 9, "Tick Lock Level", text_color=color.white)
table.cell(debugTable, 1, 9, str.tostring(tickBasedLockLevel), text_color=color.white)
table.cell(debugTable, 0, 10, "Price Move (Ticks)", text_color=color.white)
table.cell(debugTable, 1, 10, str.tostring(strategy.position_size > 0 ? (maxPrice - entryPrice) / tickSize : 0), text_color=color.white)
table.cell(debugTable, 0, 11, "Locked Profit %", text_color=color.white)
table.cell(debugTable, 1, 11, str.tostring(strategy.position_size > 0 ? ((maxPrice - entryPrice) / entryPrice * 100) : 0.0) + "%", text_color=color.white)
table.cell(debugTable, 0, 12, "Exit Signals", text_color=color.white)
table.cell(debugTable, 1, 12, "Y:" + str.tostring(exitOnYellowLine) + " P:" + str.tostring(exitOnProfitLock) + " T:" + str.tostring(exitOnTickLock), text_color=color.white)