Chiến lược hàng ngày dựa trên đường trung bình động và chỉ báo Williams


Ngày tạo: 2024-01-29 14:35:48 sửa đổi lần cuối: 2024-01-29 14:35:48
sao chép: 1 Số nhấp chuột: 639
1
tập trung vào
1617
Người theo dõi

Chiến lược hàng ngày dựa trên đường trung bình động và chỉ báo Williams

Tổng quan

Chiến lược này kết hợp sử dụng đường trung bình, chỉ số ATR và chỉ số William để giao dịch ở cấp độ mặt trời đối với GBP / JPY. Chiến lược này đánh giá xu hướng giá và điểm đảo ngược có thể thông qua đường trung bình, sau đó sử dụng chỉ số William để xác nhận tín hiệu giao dịch hơn nữa, đồng thời tính toán điểm dừng lỗ và khối lượng giao dịch bằng chỉ số ATR.

Nguyên tắc chiến lược

  1. Sử dụng đường trung bình 20 ngày (đường cơ sở) để xác định xu hướng tổng thể của giá, giá được quét từ bên dưới đường trung bình là tín hiệu mua, từ phía trên đường trung bình là tín hiệu bán
  2. Chỉ số William được sử dụng để xác nhận sự đảo ngược giá. Chỉ số trên 35 là xác nhận mua và 70 là xác nhận bán
  3. Chỉ số ATR tính toán phạm vi biến động trung bình trong 2 ngày qua. Giá trị này được nhân bởi hệ số và đặt thành khoảng cách dừng
  4. Kiểm soát rủi ro theo 50% lợi nhuận tài khoản. Số lượng giao dịch được tính theo tỷ lệ dừng lỗ và rủi ro
  5. Sau khi vào vị trí dài, điểm dừng giảm khoảng cách dừng cho giá thấp. điểm dừng thêm 100 điểm cho điểm vào. logic Exiting được sử dụng để xác nhận thêm tín hiệu thoát ra
  6. Sau khi vào vị trí ngắn, dừng lỗ và dừng lại đồng thời. Exiting logic được sử dụng để xác nhận thêm tín hiệu thoát

Phân tích lợi thế

  1. Sử dụng tổng hợp các xu hướng đánh giá đường trung bình và các chỉ số xác nhận vào sân, có thể lọc hiệu quả thiệt hại do phá vỡ giả
  2. ATR dừng động có thể thiết lập khoảng cách dừng hợp lý dựa trên sự biến động của thị trường
  3. Kiểm soát rủi ro và tính toán khối lượng giao dịch động có thể kiểm soát tối đa tổn thất đơn lẻ
  4. Exiting logic kết hợp với sự phán đoán bình đẳng có thể xác nhận thêm thời gian ra đi, tránh ngừng hoạt động sớm

Phân tích rủi ro

  1. Đánh giá đường trung bình có khả năng tạo ra tín hiệu sai, cần xác nhận thêm 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ể hoàn toàn tránh được sự mất mát.
  3. Chiến lược này phù hợp hơn với các giống xu hướng và có thể kém hiệu quả đối với các giống biến động phạm vi
  4. Thiết lập 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ó thể tối ưu hóa và cải thiện hơn nữa bằng cách điều chỉnh chu kỳ trung bình, kết hợp nhiều chỉ số hơn hoặc giao dịch can thiệp nhân tạo.

Tóm tắt

Chiến lược này kết hợp sự phán đoán xu hướng và lọc chỉ số, thiết kế phương pháp đối với giao dịch GBP / JPY tại mức đường nắng. Đồng thời sử dụng các phương tiện như dừng động, kiểm soát rủi ro để kiểm soát rủi ro giao dịch.

Mã nguồn 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)