
Cette stratégie utilise des moyennes mobiles simples pour déterminer la direction de la tendance, faire plus dans une tendance à la hausse continue et faire moins dans une tendance à la baisse continue, pour réaliser des transactions bidirectionnelles.
Cette stratégie utilise les moyennes mobiles pondérées VWMA pour déterminer la direction de la tendance du marché. Lorsque la VWMA augmente, faites plus; lorsque la VWMA baisse, faites moins.
La stratégie consiste à calculer la VWMA d’un certain cycle, puis à déterminer si la VWMA est en hausse plus de 5 jours et, si c’est le cas, à ouvrir une position plus élevée; si la VWMA est en baisse plus de 5 jours, à ouvrir une position vide. La condition d’une position à zéro est que la direction de la VWMA soit inversée après plus de 5 jours.
Pour calculer la performance des gains mensuels et annuels, la stratégie enregistre les gains mensuels et annuels. En comparant la stratégie avec les gains de référence du marché, on peut visualiser la performance de la stratégie par rapport au marché.
Cette stratégie présente les avantages suivants:
L’utilisation de VWMA pour détecter les tendances permet de filtrer efficacement le bruit du marché et de capturer les principales tendances.
Le risque d’un renversement de tendance peut être évité en ouvrant une position seulement après la confirmation de la tendance.
Avec le trading bidirectionnel, vous pouvez gagner de l’argent à la hausse ou à la baisse.
Enregistrer les bénéfices mensuels et annuels pour évaluer l’efficacité de la stratégie.
Ajouter les bénéfices de référence du marché à la table des bénéfices permet de comparer intuitivement la performance relative de la stratégie et du marché.
Cette stratégie présente aussi des risques:
L’utilisation de VWMA pour détecter une tendance peut entraîner un retard et une possibilité de manquer le début de la tendance.
Il est possible de rater une partie du mouvement en ouvrant une position seulement après la confirmation de la tendance.
La transaction bilatérale nécessite de déterminer un point d’arrêt, sinon les pertes peuvent augmenter.
Les grandes fluctuations du marché peuvent entraîner le déclenchement d’un stop loss et l’absence de tendance complète.
Les estimations de l’inversion de tendance peuvent être inexactes et augmenter les pertes.
Cette stratégie peut être optimisée dans les domaines suivants:
Optimiser les paramètres des cycles VWMA et améliorer le jugement des tendances.
Modifier le nombre de jours de confirmation des tendances pour améliorer le timing des entrées et des sorties.
Ajouter une stratégie de stop loss pour contrôler les pertes individuelles.
Le changement de tendance, combiné à d’autres indicateurs, augmente la certitude.
Optimiser la gestion des positions et les adapter aux conditions du marché.
En tenant compte du coût de la transaction, définissez un minimum de profit.
L’idée générale de cette stratégie est claire et simple. Elle utilise le VWMA pour déterminer la direction de la tendance. Après la confirmation de la tendance, les transactions bidirectionnelles peuvent suivre efficacement le mouvement du marché.
/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="Monthly Returns in Strategies with Market Benchmark", shorttitle="Monthly P&L With Market", 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")//
///////////////////
// MONTHLY TABLE //
new_month = month(time) != month(time[1])
new_year = year(time) != year(time[1])
eq = strategy.equity
bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]
cur_month_pnl = 0.0
cur_year_pnl = 0.0
cur_month_bh = 0.0
cur_year_bh = 0.0
// Current Monthly P&L
cur_month_pnl := new_month ? 0.0 :
(1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1
cur_month_bh := new_month ? 0.0 :
(1 + cur_month_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 Monthly P&Ls
var month_pnl = array.new_float(0)
var month_time = array.new_int(0)
var month_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)
last_computed = false
if (not na(cur_month_pnl[1]) and (new_month or time_close + (time_close - time_close[1]) > timenow 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])
array.push(month_bh , cur_month_bh[1])
if (not na(cur_year_pnl[1]) and (new_year or time_close + (time_close - time_close[1]) > timenow 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])
array.push(year_bh , cur_year_bh[1])
last_computed := (time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory) ? true : nz(last_computed[1])
// Monthly P&L Table
var monthly_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
color.new(color.red, transp = 20)
else if pnl < bh
color.new(color.red, transp = 50)
else
color.new(color.red, transp = 80)
if last_computed
monthly_table := table.new(position.bottom_right, 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, tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
table.cell(monthly_table, 13, yi + 1, tostring(round(array.get(year_pnl, yi) * 100)) + " (" + tostring(round(array.get(year_bh, yi) * 100)) + ")", bgcolor = y_color)
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 = getCellColor(array.get(month_pnl, mi), array.get(month_bh, mi))
table.cell(monthly_table, m_col, m_row, tostring(round(array.get(month_pnl, mi) * 100)) + " (" + tostring(round(array.get(month_bh, mi) * 100)) +")", bgcolor = m_color)