Estrategia de negociación de media móvil doble con cruz dorada y cruz de la muerte


Fecha de creación: 2023-12-01 14:36:33 Última modificación: 2023-12-01 14:36:33
Copiar: 9 Número de Visitas: 614
1
Seguir
1619
Seguidores

Estrategia de negociación de media móvil doble con cruz dorada y cruz de la muerte

Descripción general

La estrategia de negociación de doble equilánea genera señales de negociación mediante el cálculo de promedios móviles indicativos de diferentes períodos, formando líneas rápidas y lentas, y observando su forma de horquilla de oro y horquilla muerta. Cuando la línea rápida atraviesa la línea lenta desde abajo, haga más; cuando la línea rápida atraviesa la línea lenta desde arriba hacia abajo, haga vacío.

Principio de estrategia

El indicador central de la estrategia de negociación de doble línea es calcular la línea rápida y la línea lenta. La línea rápida indica el promedio móvil del índice de períodos cortos, con el parámetro de 12 días; la línea lenta indica el promedio móvil del índice de períodos largos, con el parámetro de 26 días. La fórmula para calcular el promedio móvil del índice es:

EMA(t) = (C(t) - EMA(t-1)) * SF + EMA(t-1)

Entre ellos, C (t) es el precio de cierre del día, y SF es el factor de suavización. La diferencia entre el promedio móvil de índice y el promedio móvil de cálculo ordinario es que el promedio móvil de índice otorga un mayor peso a los datos más recientes y puede responder más rápidamente a los cambios de precio.

Las reglas de negociación de una estrategia de doble línea son:

  • Cuando la línea rápida atraviesa la línea lenta desde abajo, se forma el golden cross, que hace más entradas.
  • Cuando la línea rápida atraviesa la línea lenta desde arriba hacia abajo, se forma una horca muerta de cruz muerta, lo que hace que la entrada sea vacía.
  • Cuando la línea rápida y la línea lenta se desvían, la posición plana se retira.

Capturar las formas cruzadas de la línea de paridad, reaccionar a tiempo a los cambios en la relación de oferta y demanda del mercado y las tendencias, para obtener ganancias.

Análisis de las ventajas

La estrategia de negociación de dos líneas equitativas tiene las siguientes ventajas como una estrategia de indicadores técnicos más madura:

  1. La idea es clara, fácil de entender y de llevar a cabo.
  2. El resultado de la evaluación de la oferta y la demanda en el mercado es un mayor índice de éxito.
  3. En la actualidad, el mercado de los productos y servicios de telefonía móvil está en pleno apogeo.
  4. Se puede aplicar en diferentes mercados y en diferentes marcos temporales.
  5. Se puede combinar con otros indicadores técnicos para enriquecer la estrategia.
  6. La tasa de utilización de los fondos es alta, lo que corresponde a la gran necesidad de fondos.

Análisis de riesgos

Las estrategias binarias también tienen ciertos defectos y riesgos:

  1. El gobierno de la República Democrática del Congo (RDC) está en el punto de mira de una crisis económica que podría ser muy grave.
  2. Las señales falsas y las frecuentes y pequeñas oscilaciones provocan un intenso intercambio.
  3. Optimizar los parámetros para adaptarse a diferentes variedades y períodos de tiempo;
  4. No se puede determinar la posición razonable de la reversión de la tendencia.

Para los riesgos anteriores, se puede optimizar mediante el ajuste de los parámetros de ciclo promedio, la introducción de filtros adicionales, etc., para garantizar una estrategia más sólida.

Dirección de optimización

Las estrategias de negociación binaria se pueden optimizar en los siguientes aspectos:

  1. La introducción de indicadores MACD para evaluar tendencias fuertes y débiles, evitando el error de negociación de las tendencias débiles y oscilantes;
  2. Aumentar los volúmenes de transacción como indicador de confirmación y evitar falsas rupturas en la reversión de la tendencia;
  3. En combinación con otros indicadores técnicos, como la línea Brin, la línea K, se establecen condiciones de entrada y salida más precisas;
  4. Utiliza métodos de aprendizaje automático como LSTM para optimizar automáticamente los parámetros de la línea media y lograr una mejor adaptabilidad al mercado.

Resumir

La estrategia de negociación de doble línea de equilibrio capta las oportunidades de negociación de la línea de equilibrio, determina el punto de inflexión de la tendencia de los precios y logra una ganancia estable. La ventaja de esta estrategia es su sencillez y claridad, su alta eficiencia financiera, y es la estrategia preferida para la entrada cuantitativa. Pero también hay ciertas deficiencias, como la generación de señales falsas, que requieren la introducción de más indicadores para optimizarlos y adaptarlos mejor a una variedad específica y al entorno de negociación.

Código Fuente de la Estrategia
/*backtest
start: 2022-11-24 00:00:00
end: 2023-11-30 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/
// © antondmt

//@version=5
strategy("Returns & Drawdowns Table", "R & DD", true, calc_on_every_tick = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, process_orders_on_close = true)
i_eq_to_dd =            input.string("Compound Equity", "Mode", ["Simple Equity", "Compound Equity", "Drawdown"], group = "R & DD Table")
i_precision =           input.int(2, "Return Precision", group = "R & DD Table")
i_headers_col =         input.color(#D4D4D4, "Headers Color", group = "R & DD Table")
i_headers_text_col =    input.color(color.black, "Headers Text Color", group = "R & DD Table")
i_pos_col =             input.color(color.green, "Positive Color", group = "R & DD Table")
i_neg_col =             input.color(color.red, "Negative Color", group = "R & DD Table")
i_zero_col =            input.color(#DDDDDD, "Zero Color", group = "R & DD Table")
i_cell_text_col =       input.color(color.white, "Cell Text Color", group = "R & DD Table")

// TIME {
var month_times = array.new_int(0)                                                              // Array of all month times  
new_month = month(time) != month(time[1]) 
if(new_month or barstate.isfirst)
    array.push(month_times, time)

var year_times = array.new_int(0)                                                               
new_year = year(time) != year(time[1])  
if (new_year or barstate.isfirst)
    array.push(year_times, time)
//}

// SIMPLE EQUITY CALCULATIONS {
// Simple equity is strictly calculated from start to end of each month/year equity. There is no compound
var monthly_simp_pnls = array.new_float(0)                                                      // Array of all monthly profits and losses
var yearly_simp_pnls = array.new_float(0)                                                       

if(i_eq_to_dd == "Simple Equity")
    var initial_monthly_equity = strategy.equity                                                // Starting equity for each month
    cur_month_pnl = nz((strategy.equity - initial_monthly_equity) / initial_monthly_equity)     // Current month's equity change
    if(new_month or barstate.isfirst)
        initial_monthly_equity := strategy.equity
        array.push(monthly_simp_pnls, cur_month_pnl)
    else 
        array.set(monthly_simp_pnls, array.size(monthly_simp_pnls) - 1, cur_month_pnl)
    
    var initial_yearly_equity = strategy.equity
    cur_year_pnl = nz((strategy.equity - initial_yearly_equity) / initial_yearly_equity)
    if (new_year or barstate.isfirst)
        initial_yearly_equity := strategy.equity
        array.push(yearly_simp_pnls, cur_year_pnl)
    else 
        array.set(yearly_simp_pnls, array.size(yearly_simp_pnls) - 1, cur_year_pnl)
// }

// COMPOUND EQUITY CALCULATIONS {
// Compound equity is strictly calculated based on equity state from the beginning of time until the end of each month/year equity. It shows the exact equity movement through time
var monthly_comp_pnls = array.new_float(0)                                                      // Array of all monthly profits and losses
var yearly_comp_pnls = array.new_float(0)                                                       

if(i_eq_to_dd == "Compound Equity")
    var initial_equity = strategy.equity                                                
    cur_month_pnl = nz((strategy.equity - initial_equity) / initial_equity)                     // Current month's equity change
    if(new_month or barstate.isfirst)
        array.push(monthly_comp_pnls, cur_month_pnl)
    else 
        array.set(monthly_comp_pnls, array.size(monthly_comp_pnls) - 1, cur_month_pnl)
    
    cur_year_pnl = nz((strategy.equity - initial_equity) / initial_equity)
    if (new_year or barstate.isfirst)
        array.push(yearly_comp_pnls, cur_year_pnl)
    else 
        array.set(yearly_comp_pnls, array.size(yearly_comp_pnls) - 1, cur_year_pnl)
// }
    
// DRAWDOWN CALCULATIONS {
// Drawdowns are calculated from highest equity to lowest trough for the month/year
var monthly_dds = array.new_float(0)                                                            // Array of all monthly drawdowns
var yearly_dds = array.new_float(0)                                                             

if (i_eq_to_dd == "Drawdown")
    total_equity = strategy.equity - strategy.openprofit                        
    
    var cur_month_dd = 0.0  
    var m_ATH = total_equity                                                                    // Monthly All-Time-High (ATH). It is reset each month
    m_ATH := math.max(total_equity, nz(m_ATH[1]))
    m_drawdown = -math.abs(total_equity / m_ATH * 100 - 100) / 100                              // Drawdown at current bar
    if(m_drawdown < cur_month_dd)
        cur_month_dd := m_drawdown
    if(new_month or barstate.isfirst)
        cur_month_dd := 0.0
        m_ATH := strategy.equity - strategy.openprofit
        array.push(monthly_dds, 0)
    else 
        array.set(monthly_dds, array.size(monthly_dds) - 1, cur_month_dd)
    
    var cur_year_dd = 0.0
    var y_ATH = total_equity
    y_ATH := math.max(total_equity, nz(y_ATH[1]))
    y_drawdown = -math.abs(total_equity / y_ATH * 100 - 100) / 100
    if(y_drawdown < cur_year_dd)
        cur_year_dd := y_drawdown
    if (new_year or barstate.isfirst)
        cur_year_dd := 0.0
        y_ATH := strategy.equity - strategy.openprofit
        array.push(yearly_dds, 0)
    else 
        array.set(yearly_dds, array.size(yearly_dds) - 1, cur_year_dd) 
// }

// TABLE LOGIC { 
var main_table = table(na)
table.clear(main_table, 0, 0, 13, new_year ? array.size(year_times) - 1 : array.size(year_times))
main_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_times) + 1, border_width = 1)

t_set_headers() =>                                                                              // Sets time headers of the table
    // Set month headers
    table.cell(main_table, 0,  0, "",     text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 1,  0, "Jan",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 2,  0, "Feb",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 3,  0, "Mar",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 4,  0, "Apr",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 5,  0, "May",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 6,  0, "Jun",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 7,  0, "Jul",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 8,  0, "Aug",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 9,  0, "Sep",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 10, 0, "Oct",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 11, 0, "Nov",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 12, 0, "Dec",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 13, 0, str.tostring(i_eq_to_dd), text_color = i_headers_text_col, bgcolor = i_headers_col)

    // Set year headers
    for i = 0 to array.size(year_times) - 1
        table.cell(main_table, 0,  i + 1, str.tostring(year(array.get(year_times, i))), text_color = i_headers_text_col, bgcolor = i_headers_col)

t_set_months() =>                                                                               // Sets inner monthly data of the table
    display_array = switch i_eq_to_dd 
        "Simple Equity" => monthly_simp_pnls 
        "Compound Equity" => monthly_comp_pnls
        => monthly_dds
    for i = 0 to array.size(month_times) - 1
        m_row = year(array.get(month_times, i)) - year(array.get(year_times, 0)) + 1
        m_col = month(array.get(month_times, i)) 
        m_color = array.get(display_array, i) == 0 ? color.new(i_zero_col, transp = 30) : array.get(display_array, i) > 0 ? color.new(i_pos_col, transp = 30) : color.new(i_neg_col, transp = 30)
        table.cell(main_table, m_col, m_row, str.tostring(math.round(array.get(display_array, i) * 100, i_precision)), bgcolor = m_color, text_color = i_cell_text_col)
        
t_set_years() =>                                                                                // Sets inner yearly data of the table
    display_array = switch i_eq_to_dd 
        "Simple Equity" => yearly_simp_pnls 
        "Compound Equity" => yearly_comp_pnls
        => yearly_dds
    for i = 0 to array.size(year_times) - 1
        y_color = array.get(display_array, i) == 0 ? color.new(i_zero_col, transp = 30) : array.get(display_array, i) > 0 ? color.new(i_pos_col, transp = 20) : color.new(i_neg_col, transp = 20)
        table.cell(main_table, 13, i + 1, str.tostring(math.round(array.get(display_array, i) * 100, i_precision)), bgcolor = y_color, text_color = i_cell_text_col)

t_set_headers() 
t_set_months()
t_set_years()
// }

// PLACE YOUR STRATEGY CODE HERE {
// This is a sample code of a working strategy to show the table in action
fastLength = input(12)
slowlength = input(26)
MACDLength = input(9)
MACD = ta.ema(close, fastLength) - ta.ema(close, slowlength)
aMACD = ta.ema(MACD, MACDLength)
delta = MACD - aMACD
if (ta.crossover(delta, 0))
	strategy.entry("MacdLE", strategy.long, comment = "MacdLE")
if (ta.crossunder(delta, 0))
	strategy.entry("MacdSE", strategy.short, comment = "MacdSE")
// }