
Cette stratégie utilise le système de courbe de la courbe pour juger de la direction de la tendance actuelle, en fonction de la direction de la tendance. Lorsque la courbe de la courbe augmente, il est jugé que la confiance en la hausse est élevée, faites plus; lorsque la courbe de la courbe baisse, il est jugé que la confiance en la baisse est élevée, faites plus.
Calculer la moyenne mobile pondérée (vwma) d’une certaine période (default 400 cycles) comme indicateur de la moyenne.
Déterminez si la VWMA moyenne est en hausse, si elle est en hausse, définissez un signal de hausse; si elle est en baisse, définissez un signal de baisse.
Lorsque la tendance haussière est vraie, vous faites plus; lorsque la tendance baissière est vraie, vous laissez votre position vide.
Calculer le rendement stratégique bar_pnl et le rendement achat/détention bar_bh pour chaque ligne K.
Le rendement stratégique pour chaque trimestre et année est calculé en fonction des points de rupture trimestriels et annuels, soit le rendement trimestriel_pnl et le rendement annuel_pnl, ainsi que le rendement achat-détenu correspondant, soit le rendement trimestriel_bh et le rendement annuel_bh.
Les tableaux présentent les rendements stratégiques et les rendements d’achat et de détention pour chaque trimestre de l’année.
Cette stratégie repose principalement sur la courbe de la courbe de la courbe du marché et présente les avantages suivants:
Il est simple à utiliser, facile à comprendre et à maîtriser, et permet de juger de l’évolution du marché à partir d’indicateurs de la moyenne.
La capacité de contrôle des retraits est plus forte, elle suit les opérations de tendance et permet de contrôler efficacement les pertes des marchés hors tendance.
Les paramètres configurables sont moins nombreux, principalement pour ajuster le cycle de la ligne moyenne, facile à tester et à optimiser.
Les bénéfices sont affichés de façon visuelle sur des tableaux, c’est évident.
Les gains d’achat et de détention peuvent être ajoutés dans le tableau des gains pour les comparer, ce qui permet de définir clairement la stratégie de gains accrus.
Il est possible de configurer la position de la table de manière flexible pour une utilisation en combinaison avec d’autres stratégies.
Cette stratégie comporte aussi des risques:
Risque de marché en vrac: dans un marché haussier de longue durée, les gains peuvent être légèrement inférieurs à ceux d’une stratégie d’achat et de détention. Le cycle de la moyenne peut être ajusté de manière appropriée pour optimiser.
Le risque de whipsaw est plus élevé en cas de choc. Des conditions de filtrage supplémentaires, telles que des hauts avant la rupture, peuvent être envisagées pour réduire les transactions répétitives.
Le système de ligne moyenne ne s’adapte pas bien à la courbe et peut manquer le point de basculement de la tendance. Différents types d’indicateurs de ligne moyenne peuvent être testés.
Il n’y a pas de mécanisme d’arrêt de perte et de sortie, il y a un risque de retrait important. Vous pouvez configurer un arrêt dynamique ou envisager de réduire votre position.
En ce qui concerne l’optimisation du tableau, il est possible d’ajouter des indicateurs de risque tels que le ratio de sharpe et le retrait maximal.
Cette stratégie peut être optimisée dans les domaines suivants:
Optimiser les paramètres de la ligne moyenne et adapter la période de la ligne moyenne aux différents environnements du marché.
Ajouter des conditions de filtrage, telles que des hauts avant la rupture, pour réduire le whipsaw.
Essayez différents types de moyennes, comme les moyennes mobiles pondérées, les moyennes mobiles bi-indicateurs, etc.
L’adhésion à un mécanisme de stop loss permet de définir un stop loss dynamique ou d’envisager une réduction de position.
Enrichir le contenu des tableaux, ajouter des indicateurs tels que le ratio de sharpe, le maximum de rétractation.
Les tendances sont évaluées en combinaison avec d’autres indicateurs, tels que le MACD, les bandes de Bollinger.
Optimisation de la gestion des positions, adaptation des positions en fonction de la dynamique du marché.
Tester l’efficacité des différentes normes pour trouver la meilleure portée.
La stratégie de négociation en ligne est généralement simple, directe, fonctionne en fonction de la tendance, a une forte capacité de contrôle des retraits et convient aux traders qui suivent la tendance. Il y a encore beaucoup de place pour l’optimisation. La stratégie peut être optimisée en termes de système en ligne, de mécanisme d’arrêt de perte, de gestion de position, etc., ce qui rend la stratégie plus adaptée à un environnement de marché complexe. La conception du tableau montre la stratégie par rapport aux gains et pertes de détention et montre visuellement la valeur ajoutée de la stratégie.
/*backtest
start: 2022-10-23 00:00:00
end: 2023-10-29 00:00:00
period: 1d
basePeriod: 1h
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/
// © Dannnnnnny
//@version=4
strategy(title="Quarterly Returns in Strategies vs Buy & Hold", initial_capital= 1000, overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.1)
maLength= input(400)
wma= vwma(hl2,maLength)
uptrend= rising(wma, 5)
downtrend= falling(wma,5)
plot(wma)
if uptrend
strategy.entry("Buy", strategy.long)
else
strategy.close("Buy")//
///////////////////
// QUARTERLY TABLE //
enableQuarterlyTable = input(title="Enable Quarterly Return table", type=input.bool, defval=false)
enableCompareWithMarket = input(title="Compare with Market Benchmark", type=input.bool, defval=false)
table_position = input(title="Table Position", type=input.string, defval='bottom_right', options=['bottom_right','bottom_left','top_right', 'top_left'])
precision = 2
new_quarter = ceil(month(time)/3) != ceil(month(time[1])/3)
new_year = year(time) != year(time[1])
eq = strategy.equity
bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]
cur_quarter_pnl = 0.0
cur_year_pnl = 0.0
cur_quarter_bh = 0.0
cur_year_bh = 0.0
// Current Quarterly P&L
cur_quarter_pnl := new_quarter ? 0.0 :
(1 + cur_quarter_pnl[1]) * (1 + bar_pnl) - 1
cur_quarter_bh := new_quarter ? 0.0 :
(1 + cur_quarter_bh[1]) * (1 + bar_bh) - 1
// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 :
(1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1
cur_year_bh := new_year ? 0.0 :
(1 + cur_year_bh[1]) * (1 + bar_bh) - 1
// Arrays to store Yearly and Quarterly P&Ls
var quarter_pnl = array.new_float(0)
var quarter_time = array.new_int(0)
var quarter_bh = array.new_float(0)
var year_pnl = array.new_float(0)
var year_time = array.new_int(0)
var year_bh = array.new_float(0)
end_time = false
end_time:= time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory
if (not na(cur_quarter_pnl[1]) and (new_quarter or end_time))
if (end_time[1])
array.pop(quarter_pnl)
array.pop(quarter_time)
array.push(quarter_pnl , cur_quarter_pnl[1])
array.push(quarter_time, time[1])
array.push(quarter_bh , cur_quarter_bh[1])
if (not na(cur_year_pnl[1]) and (new_year or end_time))
if (end_time[1])
array.pop(year_pnl)
array.pop(year_time)
array.push(year_pnl , cur_year_pnl[1])
array.push(year_time, time[1])
array.push(year_bh , cur_year_bh[1])
// Quarterly P&L Table
var quarterly_table = table(na)
getCellColor(pnl, bh) =>
if pnl > 0
if bh < 0 or pnl > 2 * bh
color.new(color.green, transp = 20)
else if pnl > bh
color.new(color.green, transp = 50)
else
color.new(color.green, transp = 80)
else
if bh > 0 or pnl < 2 * bh
color.new(color.red, transp = 20)
else if pnl < bh
color.new(color.red, transp = 50)
else
color.new(color.red, transp = 80)
if (end_time and enableQuarterlyTable)
quarterly_table := table.new(table_position, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)
table.cell(quarterly_table, 0, 0, "", bgcolor = #cccccc)
table.cell(quarterly_table, 1, 0, "Q1", bgcolor = #cccccc)
table.cell(quarterly_table, 2, 0, "Q2", bgcolor = #cccccc)
table.cell(quarterly_table, 3, 0, "Q3", bgcolor = #cccccc)
table.cell(quarterly_table, 4, 0, "Q4", bgcolor = #cccccc)
table.cell(quarterly_table, 5, 0, "Year", bgcolor = #999999)
for yi = 0 to array.size(year_pnl) - 1
table.cell(quarterly_table, 0, yi + 1, tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
table.cell(quarterly_table, 5, yi + 1, enableCompareWithMarket ? tostring(round(array.get(year_pnl, yi) * 100, precision)) + " (" + tostring(round(array.get(year_bh, yi) * 100, precision)) + ")" : tostring(round(array.get(year_pnl, yi) * 100, precision)), bgcolor = y_color, text_color=#bfbfbf)
for mi = 0 to array.size(quarter_time) - 1
m_row = year(array.get(quarter_time, mi)) - year(array.get(year_time, 0)) + 1
m_col = ceil(month(array.get(quarter_time, mi)) / 3)
m_color = getCellColor(array.get(quarter_pnl, mi), array.get(quarter_bh, mi))
table.cell(quarterly_table, m_col, m_row, enableCompareWithMarket ? tostring(round(array.get(quarter_pnl, mi) * 100, precision)) + " (" + tostring(round(array.get(quarter_bh, mi) * 100,precision)) +")" : tostring(round(array.get(quarter_pnl, mi) * 100, precision)), bgcolor = m_color, text_color=#bfbfbf)