Cette stratégie utilise une moyenne mobile simple pour déterminer la direction de la tendance et aller long dans une tendance haussière et aller court dans une tendance baissière pour mettre en œuvre le trading d'inversion.
Cette stratégie utilise la moyenne mobile pondérée (VWMA) pour déterminer la direction de la tendance du marché.
Plus précisément, il calcule d'abord le VWMA d'une certaine période, puis juge si le VWMA a augmenté pendant plus de 5 jours. Si oui, il ouvre une position longue. Si le VWMA a chuté pendant plus de 5 jours, il ouvre une position courte. La condition de clôture est lorsque la direction du VWMA inverse pendant plus de 5 jours.
Pour calculer les rendements mensuels et annuels, la stratégie enregistre le bénéfice/perte de chaque mois et de chaque année.
Les avantages de cette stratégie sont les suivants:
L'utilisation de VWMA pour déterminer la tendance peut filtrer efficacement le bruit du marché et capturer les tendances majeures.
L'ouverture d'une position seulement après la confirmation de la tendance permet d'éviter les risques liés à un renversement de tendance.
Le trading inverse peut tirer profit à la fois de la tendance haussière et de la tendance baissière.
L'enregistrement des rendements mensuels et annuels facilite l'évaluation du rendement de la stratégie.
L'ajout de rendements de référence de marché permet une comparaison directe entre stratégie et marché.
Quelques risques de cette stratégie:
L'utilisation de VWMA pour déterminer la tendance peut retarder et manquer des opportunités au début de la tendance.
L'ouverture de la position seulement après confirmation peut manquer certains mouvements.
Le trading de revers doit mettre un stop loss, sinon la perte pourrait s'accroître.
Une fluctuation significative du marché peut déclencher un stop loss et empêcher le maintien de l'ensemble de la tendance.
Le jugement de l'inversion de tendance peut être inexact, augmentant les pertes.
Quelques aspects qui pourraient optimiser la stratégie:
Optimiser le paramètre de période VWMA pour améliorer la détermination de la tendance.
Ajustez le nombre de jours pour confirmer la tendance, améliorant le calendrier d'entrée et de sortie.
Ajoutez une stratégie de stop loss pour contrôler les pertes d'une seule transaction.
Incorporer d'autres indicateurs pour déterminer les renversements, ce qui améliore la certitude.
Optimiser la taille des positions en fonction des conditions du marché.
Considérez le coût de négociation, fixez un objectif de profit minimum.
La logique générale de cette stratégie est simple et claire, en utilisant VWMA pour déterminer la direction de la tendance et le commerce d'inversion après confirmation, ce qui peut effectivement suivre les mouvements du marché. Mais elle comporte également certains risques, nécessitant des tests et un ajustement des paramètres, un ajustement de la logique d'entrée / sortie et une dimensionnement approprié des positions. Cette stratégie de trading d'inversion de base jette les bases du trading quantitatif et mérite d'être poursuivie et améliorée.
/*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)