Tägliche FX-Strategie auf Basis des gleitenden Durchschnitts und des Williams-Indikators

Schriftsteller:ChaoZhang, Datum: 2024-01-29 14:35:48
Tags:

img

Übersicht

Diese Strategie kombiniert den gleitenden Durchschnitt, den ATR-Indikator und den Williams-Indikator für den täglichen Devisenhandel. Erst beurteilt er den Preistrend und potenzielle Umkehrpunkte durch gleitenden Durchschnitt, verwendet dann den Williams-Indikator, um Handelssignale weiter zu bestätigen, und nutzt den ATR-Indikator, um Stop-Loss und Positionsgröße zu berechnen.

Strategie Logik

  1. Verwenden Sie den gleitenden 20-Tage-Durchschnitt (Basislinie), um den allgemeinen Trend zu bestimmen.
  2. Der Williams-Indikator wird verwendet, um die Preisumkehrung zu bestätigen.
  3. Der ATR-Indikator berechnet den Durchschnitt der Preisspanne über die letzten 2 Tage.
  4. Die Größe der Positionen basiert auf einem Risiko von 50% des Eigenkapitals des Kontos und der Handelsgröße wird anhand der Stop-Loss-Distanz und des Risikoprozentsatzes berechnet.
  5. Nach dem Eintritt in eine Long-Position wird der Stop-Loss zum niedrigen Preis minus Stop-Loss-Distanz gesetzt. Der Take-Profit wird zum Einstiegspreis plus 100 Punkte gesetzt. Die Exit-Logik bestätigt die Exit-Signale weiter.
  6. Für Short-Positionen werden Stop-Loss und Take-Profit auf die gleiche Weise festgelegt.

Analyse der Vorteile

  1. Die Kombination von Trendbeurteilung durch gleitenden Durchschnitt und Bestätigung durch Indikator kann Verluste durch falsche Ausbrüche wirksam vermeiden.
  2. Dynamische Stoppverluste durch ATR können eine angemessene Stoppdistanz aufgrund der Marktvolatilität festlegen.
  3. Die Risikokontrolle und die dynamische Positionsgröße können die Kontrolle über Einzelhandelsverluste maximieren.
  4. Die Logik des Ausstiegs in Kombination mit dem gleitenden Durchschnitt kann dazu beitragen, einen guten Ausstiegszeitpunkt weiter zu bestätigen und eine vorzeitige Gewinnnahme zu vermeiden.

Risikoanalyse

  1. Bewegliche Durchschnittssignale haben möglicherweise eine höhere Wahrscheinlichkeit, dass sie falsch sind und weitere Bestätigungen durch Indikatoren benötigen.
  2. Die Indikatoren selbst können auch falsche Signale erzeugen und Verluste nicht vollständig vermeiden.
  3. Diese Strategie passt besser zu Trending-Paaren, kann jedoch bei Range-bound Paaren schlechtere Ergebnisse erzielen.
  4. Eine unsachgemäße Einstellung der Risikokontrollquote kann sich auch auf die Rentabilität der Strategie auswirken.

Methoden wie die Anpassung der gleitenden Durchschnittsperiode, die Kombination mehrerer Indikatoren, manuelle Interventionen usw. können zur weiteren Optimierung und Verbesserung der Strategie beitragen.

Schlussfolgerung

Diese Strategie kombiniert Trendbeurteilung und Indikatorfilter für den täglichen Handel. Sie nutzt auch dynamischen Stop-Loss, Risikokontrolle und andere Mittel zur Kontrolle des Handelsrisikos.


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


Mehr