Stratégie de change quotidienne basée sur la moyenne mobile et l'indicateur Williams

Auteur:ChaoZhang est là., Date: 2024-01-29 14h35 et 48 min
Les étiquettes:

img

Résumé

Cette stratégie combine la moyenne mobile, l'indicateur ATR et l'indicateur Williams pour la négociation quotidienne de devises. Elle juge d'abord la tendance des prix et les points de renversement potentiels à travers la moyenne mobile, puis utilise l'indicateur Williams pour confirmer davantage les signaux de trading, et tire parti de l'indicateur ATR pour calculer le stop loss et la taille de la position.

La logique de la stratégie

  1. Utilisez la moyenne mobile de 20 jours (ligne de base) pour déterminer la tendance globale.
  2. L'indicateur Williams est utilisé pour confirmer un renversement de prix.
  3. L'indicateur ATR calcule la moyenne de la fourchette de prix au cours des 2 derniers jours.
  4. La taille de la position est basée sur 50% de risque du capital du compte, la taille de la transaction est calculée sur la base de la distance de stop loss et du pourcentage de risque.
  5. Après avoir entré une position longue, le stop loss est réglé au prix bas moins la distance de stop loss. Le profit est réglé au prix d'entrée plus 100 points. La logique de sortie confirme en outre les signaux de sortie.
  6. De même pour les positions courtes, le stop loss et le take profit sont définis de la même manière.

Analyse des avantages

  1. La combinaison d'un jugement de tendance par moyenne mobile et d'une confirmation par indicateur permet d'éviter efficacement les pertes dues à de fausses écarts.
  2. L'arrêt dynamique des pertes par ATR peut définir une distance d'arrêt raisonnable en fonction de la volatilité du marché.
  3. Le contrôle des risques et la dimensionnement dynamique des positions peuvent maximiser le contrôle des pertes d'une seule transaction.
  4. La logique de sortie combinée à la moyenne mobile peut aider à confirmer un bon moment de sortie et à éviter une prise de bénéfices prématurée.

Analyse des risques

  1. Les signaux de moyenne mobile peuvent avoir une probabilité plus élevée d'être erronés, nécessitant une confirmation supplémentaire des indicateurs.
  2. Les indicateurs eux-mêmes peuvent également générer des signaux erronés, ne pouvant éviter complètement les pertes.
  3. Cette stratégie s'adapte mieux aux paires tendance, peut avoir de moins bons résultats pour les paires à plage.
  4. Des réglages incorrects du ratio de contrôle des risques peuvent également avoir une incidence sur la rentabilité de la stratégie.

Des méthodes telles que l'ajustement de la période moyenne mobile, la combinaison de plus d'indicateurs, l'intervention manuelle, etc. peuvent aider à optimiser et à améliorer davantage la stratégie.

Conclusion

Cette stratégie combine le jugement de tendance et le filtre d'indicateur pour le trading quotidien. Elle exploite également le stop loss dynamique, le contrôle des risques et d'autres moyens de contrôler le risque de trading.


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


Plus de