Chiến lược ngoại hối hàng ngày dựa trên đường trung bình động và chỉ số Williams

Tác giả:ChaoZhang, Ngày: 2024-01-29 14:35:48
Tags:

img

Tổng quan

Chiến lược này kết hợp trung bình động, chỉ số ATR và chỉ số Williams cho giao dịch ngoại hối hàng ngày.

Chiến lược logic

  1. Sử dụng đường trung bình động 20 ngày (đường cơ bản) để xác định xu hướng tổng thể. Giá vượt từ dưới lên trên là tín hiệu mua, trong khi vượt từ trên xuống dưới là tín hiệu bán.
  2. Chỉ số Williams được sử dụng để xác nhận sự đảo ngược giá. Chỉ số vượt trên -35 là xác nhận mua, trong khi vượt dưới -70 là xác nhận bán.
  3. Chỉ số ATR tính toán mức trung bình của phạm vi giá trong 2 ngày qua.
  4. Kích thước vị trí dựa trên 50% rủi ro của vốn chủ sở hữu tài khoản.
  5. Sau khi vào vị trí dài, stop loss được đặt ở mức giá thấp trừ khoảng cách stop loss. Take profit được đặt ở mức giá nhập cộng với 100 điểm. Exiting logic xác nhận thêm tín hiệu thoát.
  6. Tương tự như vậy đối với vị trí ngắn, dừng lỗ và lấy lợi nhuận được đặt theo cùng một cách.

Phân tích lợi thế

  1. Kết hợp đánh giá xu hướng bằng đường trung bình động và xác nhận bằng chỉ số có thể ngăn chặn hiệu quả tổn thất từ sự phá vỡ sai.
  2. Lỗi dừng động của ATR có thể thiết lập khoảng cách dừng hợp lý dựa trên biến động thị trường.
  3. Kiểm soát rủi ro và kích thước vị trí năng động có thể tối đa hóa kiểm soát lỗ giao dịch duy nhất.
  4. Logic thoát kết hợp với đường trung bình động có thể giúp xác nhận thêm thời gian thoát tốt và tránh thu lợi nhuận sớm.

Phân tích rủi ro

  1. Các tín hiệu trung bình động có thể có khả năng sai hơn, cần xác nhận thêm từ các chỉ số.
  2. Các chỉ số cũng có thể tạo ra các tín hiệu sai, không thể tránh hoàn toàn tổn thất.
  3. Chiến lược này phù hợp với các cặp xu hướng tốt hơn, có thể có kết quả kém hơn cho các cặp giới hạn phạm vi.
  4. Cài đặt tỷ lệ kiểm soát rủi ro không chính xác cũng có thể ảnh hưởng đến lợi nhuận chiến lược.

Các phương pháp như điều chỉnh thời gian trung bình động, kết hợp nhiều chỉ số hơn, can thiệp thủ công vv có thể giúp tối ưu hóa và cải thiện chiến lược hơn nữa.

Kết luận

Chiến lược này kết hợp đánh giá xu hướng và bộ lọc chỉ số cho giao dịch hàng ngày. Nó cũng tận dụng các phương tiện dừng lỗ động, kiểm soát rủi ro và các phương tiện khác để kiểm soát rủi ro giao dịch. Có nhiều chỗ để tối ưu hóa bằng cách điều chỉnh tham số và kết hợp phương pháp để cải thiện hơn nữa hiệu suất chiến lược.


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


Thêm nữa