Strategi FX harian berdasarkan Purata Bergerak dan Penunjuk Williams

Penulis:ChaoZhang, Tarikh: 2024-01-29 14:35:48
Tag:

img

Ringkasan

Strategi ini menggabungkan purata bergerak, penunjuk ATR dan penunjuk Williams untuk perdagangan FX harian. Ia mula-mula menilai trend harga dan titik pembalikan yang berpotensi melalui purata bergerak, kemudian menggunakan penunjuk Williams untuk mengesahkan isyarat perdagangan lebih lanjut, dan memanfaatkan penunjuk ATR untuk mengira stop loss dan saiz kedudukan.

Logika Strategi

  1. Gunakan purata bergerak 20 hari (baseline) untuk menentukan trend keseluruhan.
  2. Penunjuk Williams digunakan untuk mengesahkan pembalikan harga. Penunjuk melintasi di atas -35 adalah pengesahan membeli, sementara melintasi di bawah -70 adalah pengesahan menjual.
  3. Indikator ATR mengira purata julat harga selama 2 hari terakhir.
  4. Saiz kedudukan adalah berdasarkan risiko 50% ekuiti akaun. Saiz perdagangan dikira berdasarkan jarak stop loss dan peratusan risiko.
  5. Selepas memasuki kedudukan panjang, stop loss ditetapkan pada harga rendah dikurangkan jarak stop loss. mengambil keuntungan ditetapkan pada harga masuk ditambah 100 mata. logik keluar seterusnya mengesahkan isyarat keluar.
  6. Begitu juga untuk kedudukan pendek, stop loss dan mengambil keuntungan ditetapkan dengan cara yang sama. Logik keluar juga digunakan untuk mengesahkan keluar.

Analisis Kelebihan

  1. Menggabungkan penilaian trend dengan purata bergerak dan pengesahan dengan penunjuk dapat mengelakkan kerugian daripada pecah palsu.
  2. Hentikan kehilangan dinamik oleh ATR boleh menetapkan jarak henti yang munasabah berdasarkan turun naik pasaran.
  3. Kawalan risiko dan saiz kedudukan dinamik boleh memaksimumkan kawalan ke atas kerugian perdagangan tunggal.
  4. Logik keluar yang digabungkan dengan purata bergerak dapat membantu mengesahkan masa keluar yang baik dan mengelakkan mengambil keuntungan lebih awal.

Analisis Risiko

  1. Isyarat purata bergerak mungkin mempunyai kebarangkalian yang lebih tinggi untuk salah, memerlukan pengesahan lanjut dari penunjuk.
  2. Penunjuk itu sendiri juga boleh menghasilkan isyarat yang salah, tidak dapat mengelakkan kerugian sepenuhnya.
  3. Strategi ini lebih sesuai dengan pasangan trend, mungkin mempunyai hasil yang lebih buruk untuk pasangan yang terikat julat.
  4. Tetapan nisbah kawalan risiko yang tidak betul juga boleh memberi kesan kepada keuntungan strategi.

Kaedah seperti menyesuaikan tempoh purata bergerak, menggabungkan lebih banyak penunjuk, campur tangan manual dan lain-lain boleh membantu mengoptimumkan dan meningkatkan strategi.

Kesimpulan

Strategi ini menggabungkan penilaian trend dan penapis penunjuk untuk perdagangan harian. Ia juga memanfaatkan stop loss dinamik, kawalan risiko dan cara lain untuk mengawal risiko perdagangan. Banyak ruang untuk pengoptimuman wujud dengan penyesuaian parameter dan kombinasi kaedah untuk meningkatkan prestasi strategi.


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


Lebih lanjut