Estrategia diaria de divisas basada en la media móvil y el indicador Williams

El autor:¿ Qué pasa?, Fecha: 2024-01-29 14:35:48
Las etiquetas:

img

Resumen general

Esta estrategia combina el promedio móvil, el indicador ATR y el indicador Williams para la negociación diaria de divisas. Primero juzga la tendencia de precios y los puntos de reversión potenciales a través del promedio móvil, luego utiliza el indicador Williams para confirmar aún más las señales comerciales y aprovecha el indicador ATR para calcular el stop loss y el tamaño de la posición.

Estrategia lógica

  1. Utilice la media móvil de 20 días (línea de base) para determinar la tendencia general.
  2. El indicador Williams se utiliza para confirmar la inversión de precios.
  3. El indicador ATR calcula el promedio del rango de precios durante los últimos 2 días.
  4. El tamaño de la posición se basa en el riesgo del 50% del capital de la cuenta y el tamaño de la operación se calcula en función de la distancia de stop loss y del porcentaje de riesgo.
  5. Después de entrar en una posición larga, el stop loss se establece en el precio bajo menos la distancia de stop loss.
  6. Del mismo modo, para la posición corta, el stop loss y el take profit se establecen de la misma manera.

Análisis de ventajas

  1. La combinación del juicio de tendencia por medio móvil y la confirmación por indicador puede evitar efectivamente las pérdidas por falsos breakouts.
  2. La pérdida de parada dinámica por ATR puede establecer una distancia de parada razonable basada en la volatilidad del mercado.
  3. El control de riesgos y el dimensionamiento dinámico de las posiciones pueden maximizar el control sobre la pérdida de una sola operación.
  4. La lógica de salida combinada con la media móvil puede ayudar a confirmar aún más el buen momento de salida y evitar la obtención de beneficios prematuros.

Análisis de riesgos

  1. Las señales de media móvil pueden tener una mayor probabilidad de ser erróneas, y necesitan una confirmación adicional de los indicadores.
  2. Los propios indicadores también pueden generar señales erróneas, incapaces de evitar completamente las pérdidas.
  3. Esta estrategia se ajusta mejor a los pares de tendencia, puede tener peores resultados para los pares de rango.
  4. Los ajustes inadecuados del índice de control de riesgos también pueden afectar a la rentabilidad de la estrategia.

Métodos como el ajuste del período promedio móvil, la combinación de más indicadores, la intervención manual, etc. pueden ayudar a optimizar y mejorar aún más la estrategia.

Conclusión

Esta estrategia combina el juicio de tendencia y el filtro de indicadores para la negociación diaria. También aprovecha el stop loss dinámico, el control de riesgos y otros medios para controlar el riesgo comercial.


/*backtest
start: 2023-12-29 00:00:00
end: 2024-01-28 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("GBPJPY DAILY FX",initial_capital = 1000,currency="USD", overlay=true)

UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")
//
// === /INPUTS ===

// === BASE FUNCTIONS ===

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//INDICATOR---------------------------------------------------------------------    
    //Average True Range (1. RISK)
atr_period = 2
atr = atr(atr_period)



    //Ichimoku Cloud - Kijun Sen (2. BASELINE)
ks_period = 20
kijun_sen = (highest(haHigh,ks_period) + lowest(haLow,ks_period))/2
base_long = haOpen < kijun_sen and haClose > kijun_sen
base_short = haOpen > kijun_sen and haClose < kijun_sen

    //Williams Percent Range (3. Confirmation#1)
use_wpr = true
wpr_len = 4
wpr = -100*(highest(haHigh,wpr_len) - haClose)/(highest(haHigh,wpr_len) - lowest(haLow,wpr_len))
wpr_up = -35
wpr_low = -70
conf1_long = wpr >= wpr_up
conf1_short = wpr <= wpr_low
if(use_wpr == false)
    conf1_long := true
    conf1_short := true
//TRADE LOGIC-------------------------------------------------------------------
    //Long Entry
    //if -> WPR crosses below -39 AND MACD line is less than signal line
l_en = base_long and conf1_long
    //Long Exit
    //if -> WPR crosses above -14
l_ex = haClose < kijun_sen
    //Short Entry
    //if -> WPR crosses above -39 AND MACD line is greater than signal line
s_en = base_short and conf1_short
    //Short Exit
    //if -> WPR crosses under -14
s_ex = haClose > kijun_sen
    
strategy.initial_capital = 50000
//MONEY MANAGEMENT--------------------------------------------------------------
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit          //floating profit/loss
isTwoDigit = input(true,"Is this a 2 digit pair? (JPY, XAU, XPD...")
risk = input(50,"Risk %")/100           //risk % per trade
equity_protector = input(30,"Equity Protection %")/100  //equity protection %
stop = atr*100000*input(1,"Average True Range multiplier")    //Stop level
if(isTwoDigit)
    stop := stop/100
target = input(100, "Target TP in Points")  //TP level
    //Calculate current DD and determine if stopout is necessary
equity_stopout = false
if(floating<0 and abs(floating/balance)>equity_protector)
    equity_stopout := true
    
    //Calculate the size of the next trade
temp01 = balance * risk     //Risk in USD
temp02 = temp01/stop        //Risk in lots
temp03 = temp02*100000      //Convert to contracts
size = temp03 - temp03%1000 //Normalize to 1000s (Trade size)
if(size < 1)
    size := 1            //Set min. lot size

//TRADE EXECUTION---------------------------------------------------------------
strategy.close_all(equity_stopout)      //Close all trades w/equity protector
is_open = strategy.opentrades > 0

fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2000, title = "From Year", minval = 1970)
 //monday and session 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2021, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true

if(time_cond)
    strategy.entry("l_en",true,1,oca_name="a",when=l_en and not is_open)  //Long entry
    strategy.entry("s_en",false,1,oca_name="a",when=s_en and not is_open) //Short entry
    
    strategy.exit("S/L","l_en",loss=stop, profit=target)      //Long exit (stop loss)
    strategy.close("l_en",when=l_ex)            //Long exit (exit condition)
    strategy.exit("S/L","s_en",loss=stop, profit=target)      //Short exit (stop loss)
    strategy.close("s_en",when=s_ex)            //Short exit (exit condition)


Más.