Rotation de l'élan à travers les périodes tendance à suivre la stratégie

Auteur:ChaoZhang est là., Date: 2023-11-17 17h32 et 11h
Les étiquettes:

img

Résumé

La stratégie utilise une combinaison de moyennes mobiles sur un cadre temporel, identifie les rotations de tendances sur les graphiques horaires à moyen terme et permet un suivi des tendances à faible risque. La stratégie présente des avantages de configuration flexible, de simplicité et d'efficacité financière élevée, adaptée aux traders qui ont des positions à long terme.

Définition originale

La stratégie utilise trois moyennes mobiles de 5, 20 et 40 jours pour déterminer les combinaisons de tendances sous différents cadres horaires.

Plus précisément, une ligne rapide de 5 jours traversant la ligne médiane de 20 jours est considérée comme un signal de hausse de la ligne courte, et une ligne lente de 20 jours traversant la ligne médiane de 40 jours est considérée comme un signal de hausse de la ligne médiane. Lorsque la ligne rapide de 3 jours est en ordre (< 5 jours > 20 jours > 40 jours), elle est jugée comme un cycle à plusieurs têtes; lorsque la ligne lente de 3 jours est en inversion (< 5 jours < 20 jours < 40 jours), elle est jugée comme un cycle à tête vide.

Ainsi, en fonction de la direction de la tendance du grand cycle, puis en combinaison avec la force du petit cycle, la détection d'une entrée spécifique; c'est-à-dire que l'ouverture d'une position uniquement lorsque la tendance est homogène et que le petit cycle est fort, peut filtrer efficacement les fausses percées d'inversion pour réaliser des opérations à taux de victoire élevé.

En outre, la stratégie utilise l'ATR pour contrôler le risque d'une seule transaction et augmenter encore le taux de rentabilité.

Analyse des avantages

  • Configuration flexible, les paramètres de la moyenne mobile peuvent être ajustés par les utilisateurs pour s'adapter aux différentes variétés et préférences de négociation

  • La mise en œuvre est simple et facile pour les débutants.

  • L'efficacité de l'utilisation des fonds et le plein effet de levier

  • Les risques sont maîtrisés et les mécanismes d'arrêt des pertes sont efficaces pour éviter les pertes importantes

  • Une forte capacité à suivre la tendance et une rentabilité soutenue après la détermination de la direction du grand cycle

  • Les taux de réussite sont plus élevés, la qualité du signal de transaction est meilleure et les erreurs de trajectoire sont moins nombreuses.

Risques et améliorations

  • Les jugements de grande cyclicité dépendent de l'arrangement de la ligne moyenne de décalage, ce qui présente un risque d'erreur de jugement tardif.

  • Détection de l'intensité de micro-cycles avec un seul fil K, peut être déclenchée à l'avance et peut être correctement relaxée

  • L'amplitude du freinage est fixe et peut être optimisée en freinage dynamique.

  • Des conditions de filtrage supplémentaires peuvent être envisagées, telles que l'énergie du volume de transaction.

  • Vous pouvez essayer différentes combinaisons de paramètres de la moyenne mobile pour optimiser votre stratégie.

Résumé

Cette stratégie intègre l'analyse de plusieurs cadres temporels et la gestion des arrêts, ce qui permet de réaliser des transactions de suivi de tendances à faible risque. Elle peut être appliquée à différentes variétés en ajustant les paramètres pour répondre aux besoins des suiveurs de tendances. Sa décision de transaction est plus solide et son signal plus efficace par rapport aux systèmes traditionnels à un seul cadre temporel.

Résumé

Cette stratégie utilise une combinaison de moyennes mobiles à travers les délais pour identifier les rotations de tendance sur les graphiques horaires, quotidiens et hebdomadaires.

Logique de négociation

La stratégie utilise des moyennes mobiles de 5, 20 et 40 jours pour déterminer l'alignement des tendances sur différentes périodes.

Plus précisément, le franchissement d'un MA rapide de 5 jours au-dessus d'un MA moyen de 20 jours indique une tendance à la hausse à court terme. Le franchissement d'un MA moyen de 20 jours au-dessus d'un MA lent de 40 jours indique une tendance à la hausse à moyen terme. Lorsque les MA rapides, moyens et lents sont alignés positivement (5 jours > 20 jours > 40 jours), c'est un cycle haussier. Lorsqu'ils sont alignés négativement (5 jours < 20 jours < 40 jours), c'est un cycle baissier.

En déterminant la direction des cycles plus importants et en confirmant la force sur les cycles plus petits, cette stratégie n'ouvre des positions que lorsque la tendance majeure et l'élan mineur s'alignent.

La stratégie utilise également des arrêts de trail ATR pour contrôler les risques commerciaux uniques et améliorer davantage la rentabilité.

Les avantages

  • Configurations flexibles adaptées aux différents instruments et styles de négociation

  • Simple à mettre en œuvre même pour les traders débutants

  • Efficacité élevée du capital pour maximiser l'effet de levier

  • Contrôle efficace des risques pour éviter des pertes importantes

  • Forte tendance à la suite de la capacité à réaliser des bénéfices soutenus

  • Taux de victoire élevé en raison de signaux solides et de moins de coups de fouet

Risques et améliorations

  • Les croisements MA peuvent être retardés et entraîner une détection tardive de la tendance

  • La détection de la force d'une seule bougie pourrait déclencher une entrée prématurée, une condition de relaxation.

  • Perte d'arrêt ATR fixe, optimisé pour des arrêts dynamiques

  • Pensez à ajouter des filtres supplémentaires comme le volume

  • Explorez les différents paramètres MA pour l'optimisation

Conclusion

Cette stratégie intègre l'analyse de plusieurs délais et la gestion des risques pour une tendance à faible risque après le trading. En ajustant les paramètres, elle peut être adaptée à différents instruments pour convenir aux traders de tendance. Par rapport aux systèmes à délais uniques, elle prend des décisions commerciales plus robustes et génère des signaux d'efficacité plus élevés. En conclusion, cette stratégie a une bonne adaptabilité du marché et un potentiel de développement.


/*backtest
start: 2023-10-17 00:00:00
end: 2023-11-16 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © kgynofomo

//@version=5
strategy(title="[Salavi] | Andy Advance Pro Strategy [BTC|M15]",overlay = true, pyramiding = 1,initial_capital = 10000, default_qty_type = strategy.cash,default_qty_value = 10000)

ema_short = ta.ema(close,5)
ema_middle = ta.ema(close,20)
ema_long = ta.ema(close,40)

cycle_1 = ema_short>ema_middle and ema_middle>ema_long
cycle_2 = ema_middle>ema_short and ema_short>ema_long
cycle_3 = ema_middle>ema_long and ema_long>ema_short
cycle_4 = ema_long>ema_middle and ema_middle>ema_short
cycle_5 = ema_long>ema_short and ema_short>ema_middle
cycle_6 = ema_short>ema_long and ema_long>ema_middle

bull_cycle = cycle_1 or cycle_2 or cycle_3
bear_cycle = cycle_4 or cycle_5 or cycle_6
// label.new("cycle_1")
// bgcolor(color=cycle_1?color.rgb(82, 255, 148, 60):na)
// bgcolor(color=cycle_2?color.rgb(82, 255, 148, 70):na)
// bgcolor(color=cycle_3?color.rgb(82, 255, 148, 80):na)
// bgcolor(color=cycle_4?color.rgb(255, 82, 82, 80):na)
// bgcolor(color=cycle_5?color.rgb(255, 82, 82, 70):na)
// bgcolor(color=cycle_6?color.rgb(255, 82, 82, 60):na)

// Inputs
a = input(2, title='Key Vaule. \'This changes the sensitivity\'')
c = input(7, title='ATR Period')
h = false

xATR = ta.atr(c)
nLoss = a * xATR

src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=barmerge.lookahead_off) : close

xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), src - nLoss) : iff_2

pos = 0
iff_3 = src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, ema)

buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below

barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop




atr = ta.atr(14)
atr_length = input.int(25)
atr_rsi = ta.rsi(atr,atr_length)
atr_valid = atr_rsi>50

long_condition =  buy and bull_cycle and atr_valid
short_condition =  sell and bear_cycle and atr_valid

Exit_long_condition = short_condition
Exit_short_condition = long_condition

if long_condition
    strategy.entry("Andy Buy",strategy.long, limit=close,comment="Andy Buy Here")

if Exit_long_condition
    strategy.close("Andy Buy",comment="Andy Buy Out")
    // strategy.entry("Andy fandan Short",strategy.short, limit=close,comment="Andy 翻單 short Here")
    // strategy.close("Andy fandan Buy",comment="Andy short Out")


if short_condition
    strategy.entry("Andy Short",strategy.short, limit=close,comment="Andy short Here")


// strategy.exit("STR","Long",stop=longstoploss)
if Exit_short_condition
    strategy.close("Andy Short",comment="Andy short Out")
    // strategy.entry("Andy fandan Buy",strategy.long, limit=close,comment="Andy 翻單 Buy Here")
    // strategy.close("Andy fandan Short",comment="Andy Buy Out")




inLongTrade = strategy.position_size > 0
inLongTradecolor = #58D68D
notInTrade = strategy.position_size == 0
inShortTrade = strategy.position_size < 0

// bgcolor(color = inLongTrade?color.rgb(76, 175, 79, 70):inShortTrade?color.rgb(255, 82, 82, 70):na)
plotshape(close!=0,location = location.bottom,color = inLongTrade?color.rgb(76, 175, 79, 70):inShortTrade?color.rgb(255, 82, 82, 70):na)


plotshape(long_condition, title='Buy', text='Andy Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(short_condition, title='Sell', text='Andy Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)


//atr > close *0.01* parameter

// MONTHLY TABLE PERFORMANCE - Developed by @QuantNomad
// *************************************************************************************************************************************************************************************************************************************************************************
show_performance = input.bool(true, 'Show Monthly Performance ?', group='Performance - credits: @QuantNomad')
prec = input(2, 'Return Precision', group='Performance - credits: @QuantNomad')

if show_performance
    new_month = month(time) != month(time[1])
    new_year  = year(time)  != year(time[1])
    
    eq = strategy.equity
    
    bar_pnl = eq / eq[1] - 1
    
    cur_month_pnl = 0.0
    cur_year_pnl  = 0.0
    
    // Current Monthly P&L
    cur_month_pnl := new_month ? 0.0 : 
                     (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 
    
    // Current Yearly P&L
    cur_year_pnl := new_year ? 0.0 : 
                     (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1  
    
    // Arrays to store Yearly and Monthly P&Ls
    var month_pnl  = array.new_float(0)
    var month_time = array.new_int(0)
    
    var year_pnl  = array.new_float(0)
    var year_time = array.new_int(0)
    
    last_computed = false
    
    if (not na(cur_month_pnl[1]) and (new_month or barstate.islastconfirmedhistory))
        if (last_computed[1])
            array.pop(month_pnl)
            array.pop(month_time)
            
        array.push(month_pnl , cur_month_pnl[1])
        array.push(month_time, time[1])
    
    if (not na(cur_year_pnl[1]) and (new_year or barstate.islastconfirmedhistory))
        if (last_computed[1])
            array.pop(year_pnl)
            array.pop(year_time)
            
        array.push(year_pnl , cur_year_pnl[1])
        array.push(year_time, time[1])
    
    last_computed := barstate.islastconfirmedhistory ? true : nz(last_computed[1])
    
    // Monthly P&L Table    
    var monthly_table = table(na)
    
    if (barstate.islastconfirmedhistory)
        monthly_table := table.new(position.bottom_center, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)
    
        table.cell(monthly_table, 0,  0, "",     bgcolor = #cccccc)
        table.cell(monthly_table, 1,  0, "Jan",  bgcolor = #cccccc)
        table.cell(monthly_table, 2,  0, "Feb",  bgcolor = #cccccc)
        table.cell(monthly_table, 3,  0, "Mar",  bgcolor = #cccccc)
        table.cell(monthly_table, 4,  0, "Apr",  bgcolor = #cccccc)
        table.cell(monthly_table, 5,  0, "May",  bgcolor = #cccccc)
        table.cell(monthly_table, 6,  0, "Jun",  bgcolor = #cccccc)
        table.cell(monthly_table, 7,  0, "Jul",  bgcolor = #cccccc)
        table.cell(monthly_table, 8,  0, "Aug",  bgcolor = #cccccc)
        table.cell(monthly_table, 9,  0, "Sep",  bgcolor = #cccccc)
        table.cell(monthly_table, 10, 0, "Oct",  bgcolor = #cccccc)
        table.cell(monthly_table, 11, 0, "Nov",  bgcolor = #cccccc)
        table.cell(monthly_table, 12, 0, "Dec",  bgcolor = #cccccc)
        table.cell(monthly_table, 13, 0, "Year", bgcolor = #999999)
    
    
        for yi = 0 to array.size(year_pnl) - 1
            table.cell(monthly_table, 0,  yi + 1, str.tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
            
            y_color = array.get(year_pnl, yi) > 0 ? color.new(color.teal, transp = 40) : color.new(color.gray, transp = 40)
            table.cell(monthly_table, 13, yi + 1, str.tostring(math.round(array.get(year_pnl, yi) * 100, prec)), bgcolor = y_color, text_color=color.new(color.white, 0))
            
        for mi = 0 to array.size(month_time) - 1
            m_row   = year(array.get(month_time, mi))  - year(array.get(year_time, 0)) + 1
            m_col   = month(array.get(month_time, mi)) 
            m_color = array.get(month_pnl, mi) > 0 ? color.new(color.teal, transp = 40) : color.new(color.gray, transp = 40)
            
            table.cell(monthly_table, m_col, m_row, str.tostring(math.round(array.get(month_pnl, mi) * 100, prec)), bgcolor = m_color, text_color=color.new(color.white, 0))



Plus de