Estratégia FX diária baseada na média móvel e no indicador Williams

Autora:ChaoZhang, Data: 2024-01-29 14:35:48
Tags:

img

Resumo

Esta estratégia combina a média móvel, o indicador ATR e o indicador Williams para negociação diária de câmbio. Primeiro julga a tendência de preços e os pontos de reversão potenciais através da média móvel, em seguida, usa o indicador Williams para confirmar ainda mais os sinais de negociação e alavanca o indicador ATR para calcular o stop loss e o dimensionamento da posição.

Estratégia lógica

  1. Use a média móvel de 20 dias (linha de base) para determinar a tendência geral.
  2. O indicador Williams é usado para confirmar a reversão do preço.
  3. O indicador ATR calcula a média da faixa de preços durante os últimos 2 dias.
  4. O tamanho da posição baseia-se no risco de 50% do capital da conta, sendo o tamanho da negociação calculado com base na distância de stop loss e na percentagem de risco.
  5. Após a entrada de uma posição longa, o stop loss é definido no preço baixo menos a distância de stop loss.
  6. Da mesma forma, para a posição curta, o stop loss e o take profit são definidos da mesma forma.

Análise das vantagens

  1. A combinação do julgamento da tendência por média móvel e da confirmação por indicador pode evitar efetivamente as perdas decorrentes de falhas.
  2. A perda de parada dinâmica por ATR pode definir uma distância de parada razoável com base na volatilidade do mercado.
  3. O controlo do risco e o dimensionamento dinâmico das posições podem maximizar o controlo sobre a perda de uma única transacção.
  4. A lógica de saída combinada com a média móvel pode ajudar a confirmar ainda mais um bom momento de saída e evitar a obtenção prematura de lucros.

Análise de riscos

  1. Os sinais de média móvel podem ter maior probabilidade de estarem errados, necessitando de confirmação adicional dos indicadores.
  2. Os próprios indicadores também podem gerar sinais errados, incapazes de evitar completamente as perdas.
  3. Esta estratégia se adapta melhor aos pares de tendências, pode ter resultados mais pobres para os pares de gama.
  4. A configuração inadequada do rácio de controlo de risco também pode afetar a rentabilidade da estratégia.

Métodos como o ajustamento do período da média móvel, a combinação de mais indicadores, a intervenção manual, etc., podem ajudar a otimizar e melhorar ainda mais a estratégia.

Conclusão

Esta estratégia combina o julgamento da tendência e o filtro de indicadores para a negociação diária.


/*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)


Mais.