Der Kern dieser Strategie besteht darin, den ADX-Indikator zu verwenden, um Markttrends zu beurteilen, und die Differenz zwischen DI+ und DI- zu kombinieren, um automatisch Ausbruchspunkte für den adaptiven Handel zu identifizieren. Wenn die Differenz zwischen DI+ und ADX die festgelegte Schwelle überschreitet, gehen Sie lang. Wenn die Differenz zwischen DI- und ADX die festgelegte Schwelle überschreitet, gehen Sie kurz. Diese Strategie kann automatisch Trend-Ausbruchspunkte ohne manuelle Intervention identifizieren, geeignet für mittelfristige und langfristige Bestände.
Berechnen Sie die Indikatoren für die wahre Reichweite und die Richtbewegung, um die Indikatoren DI+, DI-, DX und ADX zu erhalten.
Vergleichen Sie die Differenzamplitude1 zwischen DI+ und ADX und die Differenzamplitude2 zwischen DI- und ADX.
Wenn die Amplitude1 größer ist als die festgelegte Schwelle (z. B. 10), wird ein langes Signal erzeugt. Wenn die Amplitude2 größer ist als die festgelegte Schwelle (z. B. 10), wird ein kurzes Signal erzeugt.
Und ADX muss zwischen DI+ und DI- sein, um falsche Signale auszufiltern.
Wenn der Markt in einen Trend eintritt, führen DI+ oder DI- ADX vor allem an und erzeugen Handelssignale.
Automatische Identifizierung von Trendbrechpunkten ohne manuelles Urteilen.
Die Schwelle der Differenz zwischen DI und ADX flexibel anpassen, um sich an unterschiedliche Marktbedingungen anzupassen.
Wirksam falsche Signale durch Kombination des ADX-Indikators filtern.
Längere Haltezeiten, keine Notwendigkeit für Hochfrequenzhandel, hohe Kapitalverwertung.
Kontrollierbare Rückgänge und stabiles Wachstum.
Der ADX-Indikator ist zurückbleibend und kann kurzfristige Handelsmöglichkeiten verpassen.
Es ist leicht, in den Märkten mit einer Bandbreite gefangen zu werden. Stop-Loss-Strategien können eingeführt werden oder ADX-Filterbedingungen können hinzugefügt werden, um die Wahrscheinlichkeit zu verringern, gefangen zu werden.
Bei großen Trendumkehrungen ist es anfällig für große Verluste.
Test auf verschiedenen Märkten und Produkten, um die optimale Kombination von Parametern zu finden.
Es sollte in Erwägung gezogen werden, andere technische Indikatoren einzubeziehen, um die Signalgenauigkeit zu verbessern, z. B. MACD, KD usw.
Hinzufügen von Stop-Loss-Strategien zur Kontrolle von Drawdowns und maximalen Verlusten.
Einführung einer Positionsgröße zur Anpassung der Positionen an die Marktbedingungen.
Optimierung der Ein- und Ausstiegskriterien zur Verringerung der Handelsrisiken.
Diese Strategie integriert die Stärken der ADX- und DI-Indikatoren, um Trends effektiv zu beurteilen und anpassungsfähigen Handel umzusetzen. Es ist kein häufiger Handel erforderlich, geeignet für mittelfristige und langfristige Beteiligungen. Es gibt auch bestimmte Risiken. Hilfstechnische Indikatoren und Risikomanagementtechniken müssen integriert werden, um die Strategie-Stabilität zu verbessern. Die Strategieidee ist zuverlässig und logisch klar, lohnt sich eine eingehende Forschung und Anwendung.
/*backtest start: 2023-01-10 00:00:00 end: 2024-01-16 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/ // © MAURYA_ALGO_TRADER //@version=5 strategy("Monthly Performance by Dr. Maurya", overlay=true, default_qty_value = 15, commission_type = strategy.commission.percent, commission_value = 0.1) len = input(14) th = input(20) TrueRange = math.max(math.max(high - low, math.abs(high - nz(close[1]))), math.abs(low - nz(close[1]))) DirectionalMovementPlus = high - nz(high[1]) > nz(low[1]) - low ? math.max(high - nz(high[1]), 0) : 0 DirectionalMovementMinus = nz(low[1]) - low > high - nz(high[1]) ? math.max(nz(low[1]) - low, 0) : 0 SmoothedTrueRange = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - nz(SmoothedTrueRange[1]) / len + TrueRange SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - nz(SmoothedDirectionalMovementPlus[1]) / len + DirectionalMovementPlus SmoothedDirectionalMovementMinus = 0.0 SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - nz(SmoothedDirectionalMovementMinus[1]) / len + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = math.abs(DIPlus - DIMinus) / (DIPlus + DIMinus) * 100 ADX = ta.sma(DX, len) //diff_1 = math.abs(DIPlus - DIMinus) diff_2 = math.abs(DIPlus-ADX) diff_3 = math.abs(DIMinus - ADX) long_diff = input(10, "Long Difference") short_diff = input(10, "Short Difference") buy_condition = diff_2 >=long_diff and diff_3 >=long_diff and (ADX < DIPlus and ADX > DIMinus) sell_condition = diff_2 >=short_diff and diff_3 >=short_diff and (ADX > DIPlus and ADX < DIMinus) if buy_condition strategy.entry("Long Entry", strategy.long, comment = "Long") if sell_condition strategy.entry("Short Entry", strategy.short, comment = "Short") // Copy below code to end of the desired strategy script /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // monthly pnl performance by Dr. Maurya @MAURYA_ALGO_TRADER // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// show_performance = input.bool(true, 'Show Monthly Monthly Performance ?', group='Monthly Performance') dash_loc_mp = input("Bottom Right","Location" ,options=["Top Right","Bottom Right","Top Left","Bottom Left", "Middle Right","Bottom Center"] ,group='Monthly Performance', inline = "performance") text_size_mp = input('Small',"Size" ,options=["Tiny","Small","Normal","Large"] ,group='Monthly Performance', inline = "performance") bg_c = input.color( color.rgb(7, 226, 242, 38), "Background Color", group='Monthly Performance') text_head_color = input.color( color.rgb(0,0,0), "Month/Year Heading Color", group='Monthly Performance') tab_month_c = input.color( color.white, "Month PnL Data Color", group='Monthly Performance') tab_year_c = input.color( color.rgb(0,0,0), "Year PnL Data Color", group='Monthly Performance') border_c = input.color( color.white, "Table Border Color", group='Monthly Performance') var table_position_mp = dash_loc_mp == 'Top Left' ? position.top_left : dash_loc_mp == 'Bottom Left' ? position.bottom_left : dash_loc_mp == 'Middle Right' ? position.middle_right : dash_loc_mp == 'Bottom Center' ? position.bottom_center : dash_loc_mp == 'Top Right' ? position.top_right : position.bottom_right var table_text_size_mp = text_size_mp == 'Tiny' ? size.tiny : text_size_mp == 'Small' ? size.small : text_size_mp == 'Normal' ? size.normal : size.large ///////////////// strategy.initial_capital =50000 ///////////////////////////////////////////// // var bool new_month = na new_month = ta.change(month) //> 0 ? true : false newest_month = new_month and strategy.closedtrades >= 1 // profit only_profit = strategy.netprofit initial_balance = strategy.initial_capital // month number var int month_number = na month_number := (ta.valuewhen(newest_month, month(time), 0)) //and month(time) > 1 ? (ta.valuewhen(newest_month, month(time), 0) - 1) : 12 //1 to 12 //month_year var int month_time = na month_time := ta.valuewhen(newest_month, time, 0) - 2419200000 var int m_counter = 0 if newest_month m_counter += 1 // current month values var bool new_year = na new_year := ta.change(year) curr_m_pnl = only_profit - nz(ta.valuewhen(newest_month, only_profit, 0), 0) curr_m_number = newest_month ? ta.valuewhen(newest_month, month(time), 0) : month(time) curr_y_pnl = (only_profit - nz(ta.valuewhen(new_year, only_profit, 0),0)) var float [] net_profit_array = array.new_float() var int [] month_array = array.new_int() var int [] month_time_array = array.new_int() if newest_month array.push(net_profit_array, only_profit) array.push(month_array, month_number) array.push(month_time_array, month_time) var float [] y_pnl_array = array.new_float() var int [] y_number_array = array.new_int() var int [] y_time_array = array.new_int() newest_year = ta.change(year) and strategy.closedtrades >= 1 get_yearly_pnl = nz(ta.valuewhen(newest_year, strategy.netprofit, 0) - nz(ta.valuewhen(newest_year, strategy.netprofit, 1), 0), 0) get_m_year = ta.valuewhen(newest_year, year(time), 1) get_y_time = ta.valuewhen(newest_year, time, 0) if newest_year array.push(y_pnl_array, get_yearly_pnl) array.push(y_number_array, get_m_year) array.push(y_time_array, get_y_time) var float monthly_profit = na var int column_month_number = na var int row_month_time = na var testTable = table.new(position = table_position_mp, columns = 14, rows = 40, bgcolor = bg_c, border_color = border_c, border_width = 1) if barstate.islastconfirmedhistory and show_performance table.cell(table_id = testTable, column = 0, row = 0, text = "YEAR", text_color = text_head_color, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 1, row = 0, text = "JAN", text_color = text_head_color, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 2, row = 0, text = "FEB", text_color = text_head_color, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 3, row = 0, text = "MAR", text_color = text_head_color, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 4, row = 0, text = "APR", text_color = text_head_color, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 5, row = 0, text = "MAY", text_color = text_head_color, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 6, row = 0, text = "JUN", text_color = text_head_color, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 7, row = 0, text = "JUL", text_color = text_head_color, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 8, row = 0, text = "AUG", text_color = text_head_color, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 9, row = 0, text = "SEP", text_color = text_head_color, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 10, row = 0, text = "OCT", text_color = text_head_color, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 11, row = 0, text = "NOV", text_color = text_head_color, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 12, row = 0, text = "DEC", text_color =text_head_color, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 13, row = 0, text = "YEAR P/L", text_color = text_head_color, text_size=table_text_size_mp) for i = 0 to (array.size(y_number_array) == 0 ? na : array.size(y_number_array) - 1) row_y = year(array.get(y_time_array, i)) - year(array.get(y_time_array, 0)) + 1 table.cell(table_id = testTable, column = 13, row = row_y, text = str.tostring(array.get(y_pnl_array , i), "##.##") + '\n' + '(' + str.tostring(array.get(y_pnl_array , i)*100/initial_balance, "##.##") + ' %)', bgcolor = array.get(y_pnl_array , i) > 0 ? color.green : array.get(y_pnl_array , i) < 0 ? color.red : color.gray, text_color = tab_year_c, text_size=table_text_size_mp) curr_row_y = array.size(month_time_array) == 0 ? 1 : (year(array.get(month_time_array, array.size(month_time_array) - 1))) - (year(array.get(month_time_array, 0))) + 1 table.cell(table_id = testTable, column = 13, row = curr_row_y, text = str.tostring(curr_y_pnl, "##.##") + '\n' + '(' + str.tostring(curr_y_pnl*100/initial_balance, "##.##") + ' %)', bgcolor = curr_y_pnl > 0 ? color.green : curr_y_pnl < 0 ? color.red : color.gray, text_color = tab_year_c, text_size=table_text_size_mp) for i = 0 to (array.size(net_profit_array) == 0 ? na : array.size(net_profit_array) - 1) monthly_profit := i > 0 ? ( array.get(net_profit_array, i) - array.get(net_profit_array, i - 1) ) : array.get(net_profit_array, i) column_month_number := month(array.get(month_time_array, i)) row_month_time :=((year(array.get(month_time_array, i))) - year(array.get(month_time_array, 0)) ) + 1 table.cell(table_id = testTable, column = column_month_number, row = row_month_time, text = str.tostring(monthly_profit, "##.##") + '\n' + '(' + str.tostring(monthly_profit*100/initial_balance, "##.##") + ' %)', bgcolor = monthly_profit > 0 ? color.green : monthly_profit < 0 ? color.red : color.gray, text_color = tab_month_c, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 0, row =row_month_time, text = str.tostring(year(array.get(month_time_array, i)), "##.##"), text_color = text_head_color, text_size=table_text_size_mp) curr_row_m = array.size(month_time_array) == 0 ? 1 : (year(array.get(month_time_array, array.size(month_time_array) - 1))) - (year(array.get(month_time_array, 0))) + 1 table.cell(table_id = testTable, column = curr_m_number, row = curr_row_m, text = str.tostring(curr_m_pnl, "##.##") + '\n' + '(' + str.tostring(curr_m_pnl*100/initial_balance, "##.##") + ' %)', bgcolor = curr_m_pnl > 0 ? color.green : curr_m_pnl < 0 ? color.red : color.gray, text_color = tab_month_c, text_size=table_text_size_mp) table.cell(table_id = testTable, column = 0, row =curr_row_m, text = str.tostring(year(time), "##.##"), text_color = text_head_color, text_size=table_text_size_mp) //============================================================================================================================================================================