C'est une stratégie de rupture basée sur le suivi des tendances.
La stratégie repose principalement sur deux indicateurs pour déterminer les signaux d'entrée et de sortie - la fonction la plus élevée qui détermine le prix le plus élevé sur une certaine période, et la fonction la plus basse qui détermine le prix le plus bas sur une certaine période.
La stratégie définit également un stop loss mobile et un stop loss fixe. Le stop loss mobile est basé sur l'indicateur ATR, calculé par une valeur ATR sur une certaine période multipliée par un facteur (paramètre trailingAtrMultiplier) comme le niveau de stop loss mobile. Le stop loss fixe est calculé de la même manière sur la base de l'indicateur ATR.
Après un long ou un short, le stop loss fixe prend effet pour la première barre; puis il passe à un stop loss principalement mobile.
La stratégie établit également des règles pour le calcul de la taille des positions. Elle calcule la taille de position appropriée en fonction du pourcentage de perte maximal acceptable, du capital du compte, etc. Elle tient également compte du nombre d'instruments de négociation, en réduisant correctement la taille de position pour chaque instrument.
En résumé, il s'agit d'une stratégie de rupture typique de suivi de tendance. Il entre quand il juge qu'une rupture s'est produite, bloque les bénéfices et suit les tendances à travers le stop loss, et sort quand la tendance s'inverse.
Les principaux avantages de cette stratégie sont les suivants:
Un jugement de tendance précis: en utilisant les prix les plus élevés et les plus bas pour déterminer si les tendances sont inversées, la précision est très élevée et les faux signaux sont peu probables.
La taille de la position et le stop loss sont raisonnables. Le pourcentage de perte maximal, l'association des fonds propres du compte, etc. rendent la taille de la position raisonnable, évitant le sur-échange ou le trading inefficace. Le stop loss combiné bloque les profits et suit les mouvements de tendance.
Simple et pratique, facile à comprendre et à utiliser, elle repose uniquement sur des indicateurs de base et sa logique est simple et facile à saisir.
Les principaux risques de cette stratégie sont les suivants:
Risque d'inversion de tendance. Les stratégies de rupture reposent fortement sur le jugement de la tendance, si cela va mal, d'énormes pertes peuvent être rencontrées.
Si les paramètres du cycle des prix les plus élevés/les plus bas sont mal choisis, les tendances pourraient être manquées.
Les principales solutions sont les suivantes:
Ajoutez des filtres de tendance, comme des indicateurs supplémentaires pour vérifier les fausses ruptures.
Détendez la distance stop-loss de manière appropriée pour résister à des retraits raisonnables.
Les principales orientations d'optimisation de cette stratégie sont les suivantes:
En plus des prix les plus élevés/les plus bas, des indicateurs tels que les moyennes mobiles peuvent également être ajoutés pour rendre la détermination des tendances plus précise.
Optimiser les paramètres. Tester et trouver les combinaisons optimales pour les paramètres tels que les cycles de prix les plus élevés / les plus bas, les facteurs de multiplicateur de stop-loss, etc.
Ajuster l'algorithme de dimensionnement des positions en fonction des conditions du marché. Par exemple, réduire la taille des positions lorsque la volatilité (par exemple VIX) augmente.
Le choix d'instruments avec de petites variations de spread et de faibles corrélations peut réduire les risques de portefeuille.
En tant que stratégie de rupture de tendance, cette stratégie fonctionne bien en termes de précision de jugement, de dimensionnement des positions et de contrôle des risques, de facilité d'exploitation, etc. Elle capte les tendances tôt et équilibre la prise de profit et le suivi par le biais de stop-loss en mouvement.
Dans l'ensemble, il s'agit d'une stratégie très pratique. Sa structure de base contient déjà les composants les plus cruciaux pour une stratégie quantique. Avec des optimisations et des améliorations continues, elle peut certainement devenir une stratégie automatisée rentable stable. Valeur pour les quantiques à étudier et à référencer.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(shorttitle="Trend Surfers - Breakout", title="Trend Surfers - Premium Breakout", overlay=true) // Risk for position and pyramid maxriskval = input(2, "Max % risk", type = input.float, tooltip="Risk % over total equity / Position", group = "Risk Management") pairnumber = input(title = "How many pairs",type = input.integer, defval= 1, tooltip="How many pairs are you trading with the strategy?", group = "Risk Management") // Emtry Exit highPeriod = input(title="Highest High Period", type=input.integer, defval=168 , tooltip="Highest High of X bars - This will trigger a Long Entry when close is above. (Thin Green Line)" , group = "Entry Condition") lowPeriod = input(title="Lowest Low Period", type=input.integer, defval=168, tooltip="Lowest low of X bars - This will trigger a Short Entry when close is under. (Thin Red Line)" , group = "Entry Condition") // Stoploss trailingAtrPeriod = input(title="Trailing ATR Pediod", type=input.integer, defval=10, tooltip="Average True Range for the Trailing Stop. (Thick Green Line) " , group = "Exit Condition") trailingAtrMultiplier = input(title="Trailing ATR Multiplier", type=input.float, defval=8 , group = "Exit Condition") fixAtrPeriod = input(title="Fix ATR Pediod", type=input.integer, defval=10, tooltip="Average True Range for the Fix Stoloss. (Thick Yellow Line)" , group = "Exit Condition") fixAtrMultiplier = input(title="Fix ATR Multiplier", type=input.float, defval=2 , group = "Exit Condition") // Pair info pair = syminfo.basecurrency + syminfo.currency // High Low Variable highestHigh = highest(high, highPeriod)[1] lowestLow = lowest(low, lowPeriod)[1] trailingAtr = atr(trailingAtrPeriod) * trailingAtrMultiplier // Trade Condition longCondition = crossover(close, highestHigh) shortCondition = crossunder(close, lowestLow) // Risk Variable fixAtr = atr(fixAtrPeriod) * fixAtrMultiplier stopvaluelong = close[1] - fixAtr[1] stopvalueshort = close[1] + fixAtr[1] // Position size Long maxpossize = strategy.equity / close positionsizelong = ( ( ( (maxriskval/100) * strategy.equity) / (close - stopvaluelong))) stopperclong = ((close - stopvaluelong) / close) * 100 leveragelong = max(1, ceil(positionsizelong / maxpossize)) * 2 posperclong = (((positionsizelong * close) / strategy.equity) *100 / leveragelong) / pairnumber realposlong = (((posperclong / 100) * strategy.equity) * leveragelong) / close // Position size Short positionsizeshort = ( ( ( (maxriskval/100) * strategy.equity) / (stopvalueshort - close))) stoppercshort = ((close - stopvalueshort) / close) * 100 leverageshort = max(1, ceil(positionsizeshort / maxpossize)) * 2 pospercshort = (((positionsizeshort * close) / strategy.equity) *100 / leverageshort) / pairnumber realposshort = (((pospercshort / 100) * strategy.equity) * leverageshort) / close // Alert Message entry_long_message = '\nGo Long for ' + pair + 'NOW!' + '\nPosition Size % =' + tostring(posperclong) + '\nLeverage' + tostring(leveragelong) + '\nStoploss Price =' + tostring(stopvaluelong) + '\nClose any Short position that are open for ' + pair + '!' + '\n\nVisit TrendSurfersSignals.com' + '\nFor automated premium signals (FREE)' entry_short_message ='\nGo Short for ' + pair + 'NOW!' + '\nPosition Size % =' + tostring(pospercshort) + '\nLeverage' + tostring(leverageshort) + '\nStoploss Price =' + tostring(stopvalueshort) + '\nClose any Long position that are open for ' + pair + '!' + '\n\nVisit TrendSurfersSignals.com' + '\nFor automated premium signals (FREE)' exit_short_message = '\nExit Short for ' + pair + 'NOW!' + '\n\nVisit TrendSurfersSignals.com' + '\nFor automated premium signals (FREE)' exit_long_message = '\nExit Long for ' + pair + 'NOW!' + '\n\nVisit TrendSurfersSignals.com' + '\nFor automated premium signals (FREE)' // Order if longCondition strategy.entry("Long", strategy.long, stop=highestHigh, comment="Long", qty=realposlong , alert_message = entry_long_message) if shortCondition strategy.entry("Short", strategy.short, stop=lowestLow, comment="Short", qty=realposshort , alert_message = entry_short_message) // Stoploss Trailing longTrailing = close - trailingAtr shortTrailing = close + trailingAtr var longTrailingStop = 0.0 var shortTrailingStop = 999999.9 trailingStopLine = 0.0 trailingStopLine := na fixedStopLine = 0.0 fixedStopLine := na var inTrade = 0 if longCondition or shortCondition if 0 == inTrade if longCondition inTrade := 1 else inTrade := -1 if 1 == inTrade and (shortCondition or low <= max(fixedStopLine[1], longTrailingStop)) inTrade := 0 if -1 == inTrade and (longCondition or high >= min(fixedStopLine[1], shortTrailingStop)) inTrade := 0 longTrailingStop := if (1 == inTrade) stopValue = longTrailing max(stopValue, longTrailingStop[1]) else 0 shortTrailingStop := if (-1 == inTrade) stopValue = shortTrailing min(stopValue, shortTrailingStop[1]) else 999999 // Fix Stoploss firstPrice = 0.0 firstFixAtr = 0.0 firstPrice := na firstFixAtr := na if 0 != inTrade firstPrice := valuewhen(inTrade != inTrade[1] and 0 != inTrade, close, 0) firstFixAtr := valuewhen(inTrade != inTrade[1] and 0 != inTrade, fixAtr, 0) if 1 == inTrade fixedStopLine := firstPrice - firstFixAtr trailingStopLine := longTrailingStop else fixedStopLine := firstPrice + firstFixAtr trailingStopLine := shortTrailingStop if (strategy.position_size > 0) strategy.exit(id="L Stop", stop=max(fixedStopLine, longTrailingStop) , alert_message = exit_long_message) if (strategy.position_size < 0) strategy.exit(id="S Stop", stop=min(fixedStopLine, shortTrailingStop) , alert_message = exit_long_message) // Plot plot(highestHigh, color=color.green, linewidth=1, transp=0, title='Highest High') plot(lowestLow, color=color.red, linewidth=1, transp=0, title='Lowest Low') plot(trailingStopLine, color=color.lime, linewidth=2, transp=0, offset=1, title='Trailing Stop') plot(fixedStopLine, color=color.orange, linewidth=2, transp=0, offset=1, title='Fixed Stop')