L’idée principale de cette stratégie est d’utiliser des forks à ordre uniforme pour faire plus, des forks à ordre uniforme pour faire moins, et de définir un stop de suivi après avoir atteint la position. Lorsque le prix atteint le stop de suivi spécifié, le stop de suivi est déclenché et le stop de suivi est ajusté en permanence pour maximiser les gains.
Cette stratégie est principalement composée de plusieurs parties:
Calculer la moyenne rapide et la moyenne lente. La moyenne rapide est de 20 cycles, la moyenne lente de 50 cycles.
Les conditions d’admission sont les suivantes: faire plus sur la ligne moyenne rapide en passant sur la ligne moyenne lente; faire moins sur la ligne moyenne lente en passant sous la ligne moyenne rapide.
Détermine la direction de la tendance. Enregistre le nombre de barres surchargées et surchargées, et détermine si la tendance actuelle est une tendance à plusieurs têtes ou une tendance à vide.
Le prix d’entrée. Le prix au moment de l’émission du signal de transaction est enregistré comme prix d’entrée.
Réglez le frein.(1 + pourcentage de coupe) comme coupe; quand il est vide, il sera au bas(1- pourcentage de résistance) comme résistance
Suivre les arrêts. Les arrêts sont constamment ajustés et, lorsqu’ils se déplacent dans la bonne direction, continuent à se déplacer dans la bonne direction pour un pourcentage fixe, afin de maximiser les bénéfices.
La ligne d’arrêt est déclenchée. Lorsque le prix touche la ligne d’arrêt, le placement est arrêté.
Il y a aussi une fonction de démarrage optionnelle: la mise en place d’une barre de démarrage qui ne déclenche la barre de suivi que lorsque le prix la franchit pour la première fois.
Le plus grand avantage de cette stratégie réside dans l’utilisation d’un stop tracking qui permet de maximiser les bénéfices. Lorsque les conditions de marché sont favorables, la ligne de stop se déplace continuellement dans la direction favorable, ce qui assure la rentabilité.
En outre, la stratégie a ajouté un filtre de tendance pour les jugements de la moyenne, ce qui permet de réduire les positions inutilement répétées dans les marchés non tendance. L’ajout d’une fonction de démarrage permet également d’éviter que des fluctuations mineures de prix ne déclenchent un arrêt de suivi.
Ainsi, cette stratégie intègre plusieurs aspects de la détection des tendances, des conditions d’entrée et des stratégies de stop-loss, afin de maintenir et de maximiser les bénéfices dans des conditions de tendance.
Le principal risque de cette stratégie est qu’il faille avoir suffisamment de marge de manœuvre pour réaliser un arrêt. Si la tendance se retourne rapidement, cela peut entraîner des pertes.
En outre, le déclenchement fréquent d’un câble de freinage peut entraîner des dommages lors d’une secousse.
Enfin, si les paramètres sont mal réglés, par exemple si le rapport de freinage est trop élevé, cela augmente également le risque.
Le risque peut être maîtrisé en réglant raisonnablement le ratio de stop-loss, en évitant de négocier dans des conditions de choc, ou en réglant le stop-loss.
Cette stratégie peut être optimisée dans les domaines suivants:
Optimisation des paramètres de la moyenne. Vous pouvez tester différents paramètres de la moyenne pour trouver la combinaison la plus appropriée.
Optimisation de la fonction de démarrage. Vous pouvez tester différentes tailles de bouton de démarrage pour trouver le réglage le plus approprié.
L’optimisation du rapport d’arrêt. On peut trouver des paramètres de rapport d’arrêt plus appropriés en faisant des retours.
Ajout de stop. Définir une position de stop raisonnable et contrôler le risque.
Optimisation des conditions de filtrage. Vous pouvez tester d’autres conditions de filtrage, telles que le volume de transactions, le stop loss ATR, etc.
L’optimisation de l’indice. Il peut être testé sur différents indices tels que les actions, les devises, les crypto-monnaies, etc.
Cette stratégie intègre plusieurs modules de stratégie tels que le jugement de la tendance, les conditions d’entrée et le suivi des arrêts. Dans une tendance, il est possible de suivre en permanence les arrêts et de maximiser les bénéfices.
/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-06 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
//@author=Daveatt
SystemName = "BEST Trailing Profit Strategy"
// This string is to personalize the text that appears with your orders on the chart through strategy() calls and entry/exit markers, and in the alert default message.
// Although leaving it empty will not cause problems in study mode,
TradeId = "BEST"
// These values are used both in the strategy() header and in the script's relevant inputs as default values so they match.
// Unless these values match in the script's Inputs and the TV backtesting Properties, results between them cannot be compared.
InitCapital = 1000000
InitPosition = 100
InitCommission = 0.075
InitPyramidMax = 1
CalcOnorderFills = true
CalcOnTick = true
DefaultQtyType = strategy.fixed
DefaultQtyValue = strategy.fixed
Precision = 2
Overlay=true
// strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay,
// pyramiding=InitPyramidMax, initial_capital=InitCapital, default_qty_type=DefaultQtyType, default_qty_value=InitPosition, commission_type=strategy.commission.percent,
// commission_value=InitCommission, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick, precision=2)
// strategy(title=SystemName, shorttitle=SystemName, overlay=true,
// pyramiding=0, default_qty_value=100, precision=7, currency=currency.USD,
// commission_value=0.2,commission_type=strategy.commission.percent, initial_capital=10000)
//
// Author: Daveatt
// Revision: R0.1 Beta
// Date: 8-Dec-2019
//
// inputs
src = input(defval=close, type=input.source, title="Source")
slowLength = input(20, "Fast Length",minval=2,step=1)
fastLength = input(50, "Fast Length",minval=2,step=1)
// Calculate moving averages
fastSMA = sma(src, slowLength)
slowSMA = sma(src, fastLength)
// Calculate trading conditions
enterLong = crossover(fastSMA, slowSMA)
enterShort = crossunder(fastSMA, slowSMA)
// trend states
since_buy = barssince(enterLong)
since_sell = barssince(enterShort)
buy_trend = since_sell > since_buy
sell_trend = since_sell < since_buy
change_trend = (buy_trend and sell_trend[1]) or (sell_trend and buy_trend[1])
// get the entry price
entry_price = valuewhen(enterLong or enterShort, src, 0)
// Plot moving averages
plot(series=fastSMA, color=color.teal)
plot(series=slowSMA, color=color.orange)
// Plot the entries
plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small)
plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small)
///////////////////////////////
//======[ Take Profit ]======//
///////////////////////////////
// Use TP?
useTP = input(true, "Use take profit")
// TP trailing
ProfitTrailPerc = input(1.0, "Trailing Profit (%)",minval=0,step=0.5,type=input.float) * 0.01
use_TP_Trigger = input(true, "Use Take Profit Trigger")
// Will trigger the take profit trailing once reached
takeProfitTrigger = input(3.0, "Take Profit Trigger (%)",minval=0,step=0.5,type=input.float) * 0.01
// ttp := ttp>tp ? tp : ttp
takeprofitPriceTrigger = 0.0
takeprofitPriceTrigger := if (use_TP_Trigger)
if (buy_trend)
entry_price * (1 + takeProfitTrigger)
else
entry_price * (1 - takeProfitTrigger)
else
-1
//plot(entry_price, title='entry_price', transp=100)
var TP_Trigger_Long_HIT = false
TP_Trigger_Long_HIT := useTP and use_TP_Trigger and buy_trend and high >= takeprofitPriceTrigger
? true : TP_Trigger_Long_HIT[1]
var TP_Trigger_Short_HIT = false
TP_Trigger_Short_HIT := useTP and use_TP_Trigger and sell_trend and low <= takeprofitPriceTrigger
? true : TP_Trigger_Short_HIT[1]
display_long_TP_trigger = useTP and buy_trend and TP_Trigger_Long_HIT == false
and takeprofitPriceTrigger != -1
display_short_TP_trigger = useTP and sell_trend and TP_Trigger_Short_HIT == false
and takeprofitPriceTrigger != -1
display_TP_trigger = display_long_TP_trigger or display_short_TP_trigger
//🔷🔷🔷
// @hugo: Will display the TP trigger as long as not hit
// once the TP trigger is hit, the TP trailing will activate
plot(display_TP_trigger ? takeprofitPriceTrigger : na, title='takeprofitPriceTrigger', transp=0, color=color.orange,
style=plot.style_cross, linewidth=3)
longTrailTP= 0.0, shortTrailTP = 0.0
// Trailing Profit
// Start trailing once trigger is reached
longTrailTP := if useTP and buy_trend
tpValue = high * (1 + ProfitTrailPerc)
max(tpValue, longTrailTP[1])
else
0
shortTrailTP := if useTP and sell_trend
tpValue = low * (1 - ProfitTrailPerc)
min(tpValue, shortTrailTP[1])
else
999999
//plot(longTrailTP, title='debug longTrailTP', transp=100)
//plot(shortTrailTP, title='debug shortTrailTP', transp=100)
//////////////////////////////////////////////////////////////////////////////////////////
//*** TRAILING TAKE PROFIT HIT CONDITIONS TO BE USED IN ALERTS ***//
//////////////////////////////////////////////////////////////////////////////////////////
//🔷🔷🔷
// @hugo: I use crossover/crossunder for the alerts to trigger the events only once
cond_long_trail_tp_hit = useTP and buy_trend and crossover(high, longTrailTP[1])
and (TP_Trigger_Long_HIT or use_TP_Trigger == false)
cond_short_trail_tp_hit = useTP and sell_trend and crossunder(low, shortTrailTP[1])
and (TP_Trigger_Short_HIT or use_TP_Trigger == false)
// 🔷🔷🔷
// Plot take profits values for confirmation
// Display the trailing TP until not hit
plot(series= useTP and buy_trend and high <= longTrailTP and
(TP_Trigger_Long_HIT or use_TP_Trigger == false) ? longTrailTP : na,
color=color.aqua, style=plot.style_circles,
linewidth=2, title="Long Trail TP")
plot(series= useTP and sell_trend and low >= shortTrailTP and
(TP_Trigger_Short_HIT or use_TP_Trigger == false) ? shortTrailTP : na,
color=color.aqua, style=plot.style_circles,
linewidth=2, title="Short Trail TP")
close_long = cond_long_trail_tp_hit
close_short = cond_short_trail_tp_hit
// Submit entry orders
strategy.entry("EL", long=true, when=enterLong)
strategy.close("EL", when=close_long)
//if (enterShort)
strategy.entry("ES", long=false, when=enterShort)
strategy.close("ES", when=close_short)
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////// ALERTS ////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////
//* Put Entry Alerts below *//
//////////////////////////////
// IN STUDY MODE ONLY
// ⚠️⚠️⚠️ For alerts on the signal itself ⚠️⚠️⚠️
//alertcondition(buy_event, "Open Long", "LONG")
//alertcondition(sell_event, "Open Short", "SHORT")
// For the closes you will want to trigger these alerts on condition with alert
// option "Once Per Bar" for TP and SL
if change_trend
TP_Trigger_Long_HIT := false
TP_Trigger_Short_HIT := false