Chiến lược giao dịch/giao dịch theo xu hướng chỉ báo MFI/STOCH ẩn của Kifier


Ngày tạo: 2023-12-19 15:18:09 sửa đổi lần cuối: 2023-12-19 15:18:09
sao chép: 0 Số nhấp chuột: 675
1
tập trung vào
1621
Người theo dõi

Chiến lược giao dịch/giao dịch theo xu hướng chỉ báo MFI/STOCH ẩn của Kifier

Tổng quan

Đây là một chiến lược giao dịch phổ biến được thiết kế cho thị trường tiền điện tử, nhằm tìm kiếm thời điểm tốt nhất để tham gia và nắm giữ đường dài trung bình trong môi trường lớn của thị trường tiền điện tử. Chiến lược tổng hợp sử dụng nhiều chỉ số kỹ thuật như chỉ số MFI, chỉ số STOCH, chỉ số VWMA, để nắm bắt các cơ hội đảo ngược xu hướng tiềm ẩn bằng cách đánh giá sự lệch lạc ẩn.

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

Chiến lược này bao gồm hai logic nhập cảnh:

  1. MFI ẩn lệch + STOCH lọc: Khi MFI hình thành ẩn lệch, tức là giá sáng tạo cao nhưng MFI không sáng tạo cao, chúng tôi cho rằng đây là tín hiệu đảo ngược xu hướng tiềm ẩn. Tuy nhiên, để tránh tín hiệu giả, chúng tôi thêm STOCH> 50% làm điều kiện lọc.

  2. Hệ thống xu hướng STOCH / MFI: Khi STOCH> 50% và MFI vượt qua đường 50 từ dưới lên, cho thấy xu hướng thị trường đang hình thành, khi đó việc tham gia có thể nhận được lợi nhuận rủi ro tốt hơn.

Để đảm bảo tính chính xác trong việc đánh giá xu hướng, chúng tôi cũng xây dựng một hệ thống xu hướng dựa trên VWMA và SMA. Chỉ cần trên VWMA để đi qua SMA, tức là xác định xu hướng tăng, thì các hệ thống trên sẽ phát ra tín hiệu giao dịch. Ngoài ra, chúng tôi sử dụng chỉ số OBV để đánh giá thị trường tổng thể là ở trạng thái hoạt động hoặc trạng thái tròn, điều này cũng được sử dụng để lọc một số tín hiệu giả.

Chỉ số ATR được sử dụng để đánh giá thị trường có đang trong tình trạng chấn động hay không, chúng tôi ưu tiên tìm kiếm MFI ẩn xa trong thị trường chấn động để can thiệp. Phương pháp dừng lỗ là tham khảo giá dừng lỗ thiết lập mức hỗ trợ gần đây. Phương pháp dừng lỗ là tính một tỷ lệ dừng bắt đầu từ giá mua.

Phân tích lợi thế

Chiến lược này sử dụng nhiều chỉ số để đánh giá cấu trúc thị trường và tránh được phần lớn tiếng ồn. Hệ thống ẩn ra có thể cung cấp cơ hội nhập vào có xác suất cao và có thể kiểm soát rủi ro trong giai đoạn biến động và điều chỉnh. Trong khi đó, hệ thống xu hướng STOCH / MFI có thể thu được lợi nhuận bổ sung trong xu hướng rõ ràng.

Phân tích rủi ro

Rủi ro lớn nhất của chiến lược này là việc che giấu sự phân biệt phán đoán không phải lúc nào cũng đáng tin cậy, nó chỉ phản ánh cảm xúc thị trường đang thay đổi và không đảm bảo giá sẽ đảo ngược ngay lập tức. Ngoài ra, thiết lập STOCH và các chỉ số khác nếu không phù hợp có thể dẫn đến xu hướng bị bỏ lỡ hoặc tạo ra tín hiệu giả. Cuối cùng, thiết lập dừng lỗ nếu quá quyết liệt, small có thể dẫn đến quá thường xuyên dừng và mở lại vị trí, ảnh hưởng đến thu nhập.

Chúng tôi đã lọc các tín hiệu bằng cách thêm xu hướng và đánh giá tình trạng thị trường, thiết lập một số mức dừng dừng để giảm thiểu rủi ro trên. Tất nhiên, nếu không dừng lỗ kịp thời, các sự kiện vĩ mô lớn cũng khó tránh hoàn toàn tổn thất lớn.

Hướng tối ưu hóa

Có thể cải thiện được nhiều khía cạnh của chiến lược này, bao gồm:

  1. Tối ưu hóa các thiết lập tham số của MFI và STOCH để cải thiện độ chính xác của các phán đoán ẩn

  2. Thêm mô hình học máy để đánh giá tình trạng thị trường, đánh giá lại để xác định các tham số tốt nhất

  3. Cố gắng dừng lỗ động để kiểm soát rủi ro hơn trong khi đảm bảo lợi nhuận

  4. Kiểm tra sự khác biệt của các loại tiền điện tử khác nhau, đặt tham số cá nhân hóa

  5. Thêm mô-đun lựa chọn cổ phiếu, làm cho chiến lược tập trung hơn vào các cổ phiếu có hình thức kỹ thuật tốt hơn

Bằng cách tối ưu hóa các điểm trên, chúng ta có thể mong đợi tăng cường hơn nữa sự ổn định và lợi nhuận của chiến lược.

Tóm tắt

Đây là một chiến lược giao dịch tiền điện tử rất thực tế. Nó sử dụng đúng nhiều chỉ số kỹ thuật để đánh giá cấu trúc thị trường và thu được lợi nhuận tốt hơn khi rủi ro có thể kiểm soát được. Vấn đề chính là phán đoán sai lệch ẩn không phải lúc nào cũng chính xác, chúng tôi đã giảm bớt vấn đề này bằng một loạt các bộ lọc.

Mã nguồn chiến lược
/*backtest
start: 2023-11-18 00:00:00
end: 2023-12-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © kifier

//@version=4
strategy("Kifier's MFI/STOCH Hidden Divergence/Trend Beater", shorttitle = "Kifier's MFI/STOCH", overlay=false, margin_long=100, margin_short=100, default_qty_type  = strategy.percent_of_equity, default_qty_value = 95, max_boxes_count = 500)

//Values
enb_date     = input(false                                  ,"Enable Date Range?",      type = input.bool, inline = "1")
enb_current  = input(true                                   ,"Today as End Date" ,      type = input.bool, inline = "1")
i_start_date = input(timestamp("01 Jan 2021 00:00 +0300")   ,"Start Date"        ,      type=input.time)
i_end_date   = input(timestamp("16 July 2021 00:00 +0300")  ,"End Date"          ,      type=input.time)

time_check   = true

i_vwma_length   = input(50,     "VWMA Length"               ,type = input.integer,   group = "Indicator Settings", inline = "2")
i_sma_length    = input(50,     "SMA Length"                ,type = input.integer,   group = "Indicator Settings", inline = "2")
i_stoch_length  = input(28,     "Stoch Length"              ,type = input.integer,   group = "Indicator Settings", inline = "3")
i_mfi_length    = input(7 ,     "MFI Length"                ,type = input.integer,   group = "Indicator Settings", inline = "3")
i_obv_length    = input(100,    "OBV Length"                ,type = input.integer,   group = "Indicator Settings")
i_atr_len       = input(100,    "ATR Ranging-trend len"     ,type = input.integer,   group = "Indicator Settings", tooltip = "This is the length of the ATR Emas that check when the market in a general trend or is just ranging")


i_div_price     = input(5       ,"Price Divergant Pivots"   ,type = input.integer, group = "Divergance Settings")
i_inacc         = input(0.05    ,"Price Inaccuracy"         ,type = input.float  , group = "Divergance Settings")
i_div_length    = input(3       ,"Divergance Valid Period"  ,type = input.integer, group = "Divergance Settings")
i_mfi_left      = input(5       ,"MFI Left/Right Pivots"    ,type = input.integer, group = "Divergance Settings", inline = "4")
i_mfi_right     = input(2       ,""                         ,type = input.integer, group = "Divergance Settings", inline = "4")

tp_percentage   = input(10  ,   "TP Percentage"         ,type = input.float             , group = "Exit Settings")/100
_inacc          = input(0.03,   "Support Inaccuracy"    ,type = input.float, step = 0.01, group = "Exit Settings")

enb_stoch_mfi     = input(true, "Use Stoch/MFI Trend"      , type = input.bool, group = "Individual Entries")
enb_stoch_mfi_div = input(true, "Use Stoch/MFI Divergance ", type = input.bool, group = "Individual Entries")

c_mfi           = input(color.yellow    ,"MFI/STOCH Colour     "        , type = input.color, group = "Indicator Colours", inline = "os")
c_stoch         = input(color.silver    ,""                             , type = input.color, group = "Indicator Colours", inline = "os")
c_buy           = input(color.green     ,"Buy/Sell Colour      "        , type = input.color, group = "Indicator Colours", inline = "pos")
c_sell          = input(color.red       ,""                             , type = input.color, group = "Indicator Colours", inline = "pos")
c_flat          = input(color.blue      ,"Flat/Trending Colours"        , type = input.color, group = "Indicator Colours", inline = "trend")
c_longtrend     = input(color.green     ,""                             , type = input.color, group = "Indicator Colours", inline = "trend")

//Global Variables
var float tpprice = na 

f_c_gradientAdvDec(_source, _center, _c_bear, _c_bull) =>
    var float _maxAdvDec = 0.
    var float _qtyAdvDec = 0.
    bool  _xUp     = crossover(_source, _center)
    bool  _xDn     = crossunder(_source, _center)
    float _chg     = change(_source)
    bool  _up      = _chg > 0
    bool  _dn      = _chg < 0
    bool  _srcBull = _source > _center
    bool  _srcBear = _source < _center
    _qtyAdvDec := 
      _srcBull ? _xUp ? 1 : _up ? _qtyAdvDec + 1 : _dn ? max(1, _qtyAdvDec - 1) : _qtyAdvDec :
      _srcBear ? _xDn ? 1 : _dn ? _qtyAdvDec + 1 : _up ? max(1, _qtyAdvDec - 1) : _qtyAdvDec : _qtyAdvDec
    _maxAdvDec := max(_maxAdvDec, _qtyAdvDec)
    float _transp = 100 - (_qtyAdvDec * 100 / _maxAdvDec)
    var color _return = na
    _return := _srcBull ? color.new(_c_bull, _transp) : _srcBear ? color.new(_c_bear, _transp) : _return

//Simple Sup/Res
var float _pH = na
var float _pL = na
_ph = pivothigh(high,20,20)
_pl = pivotlow(low,20,20)
_high_inacc = _inacc * high
_low_inacc = _inacc * low

if _ph
    _pH := high
if (high-_high_inacc) > _pH and _ph
    _pH := high
    _pH := nz(_pH)

if _pl
    _pL := low
if (low+_low_inacc) < _pL[1] 
    _pL := low
    _pL := nz(_pL)  

broke_res = iff(crossover(close, _pH), true, false)

//Indicator Initialisation
s_stoch = stoch(close, high, low, i_stoch_length) 
s_vwma = vwma(close,i_vwma_length)
s_sma = sma(close,i_sma_length)

//MONEY FLOW + BBW
atr1 =ema((atr(14)/close),i_atr_len/2)
atr2 =ema((atr(14)/close), i_atr_len)
is_ranging = iff(atr1 < atr2, true, false)
s_mfi = mfi(close,i_mfi_length)
overTop = iff(s_mfi >= 90, true, false)
underBot = iff(s_mfi <= 10, true, false)

//Price Divergance
ph = pivothigh(high, i_div_price,i_div_price)
pl = pivotlow(low,i_div_price,i_div_price)

var float pH = 0.0
var float pL = 0.0

high_acc = high * (i_inacc)
low_acc = low * i_inacc

if (high-high_acc) > pH or (high+high_acc < pH) and ph
    pH := high
    pH := nz(pH)
if (low+low_acc) < pL or (low-low_acc > pL) and pl
    pL := low
    pL := nz(pL)

higher_low = false
lower_low = false
//Filter out innacurate
if ph or pl
    if pL < pL[1]
        lower_low := true
    if pL > pL[1]
        higher_low := true
        
//MFI Divergance
mh = pivothigh(s_mfi, i_mfi_left,i_mfi_right)
ml = pivotlow(s_mfi, i_mfi_left,i_mfi_right)
bl = bar_index

var float mH = 0.0
var float mL = 0.0
var int bL = 0

if mh
    mH := highest(nz(mh),i_mfi_left)
    mH := nz(mH)
if ml
    bL := bar_index
    mL := ml
    mL := nz(mL)

higher_low_m = false
lower_low_m = false

if ml 
    if mL < mL[1]
        lower_low_m := true
    if mL > mL[1]
        higher_low_m := true

//Combintion
var int price_range = na
var int rsi_range = na
var int mfi_range = na

//Higher low on price, lower low on rsi, then check with stoch
mfi_div_bullish = iff(higher_low and higher_low_m, true, false)

if mfi_div_bullish
    price_range := 0
    rsi_range := 0

//VWMA/SMA/OBV
_src = s_vwma-s_sma
sd_src = stdev(_src,14)
pooled_src = (_src/sd_src)*2

sd_s_vwma = stdev(s_vwma,14)
sd_s_sma = stdev(s_sma,14)

longTrend = obv > ema(obv,100) and is_ranging == false
crossOver = crossover(s_vwma , s_sma)
crossingOver = (s_vwma > s_sma) and (close >= s_vwma) 
crossUnder = crossunder(s_vwma, s_sma)
crossingUnder = (s_vwma < s_sma) and (close <= s_vwma)

hist_color = f_c_gradientAdvDec(s_vwma-s_sma, (s_vwma-s_sma)/2, color.new(c_sell,90), color.new(c_buy,80))

//Strategy Entries
mfi_stoch_trend = iff(enb_stoch_mfi, iff(s_stoch >= 50 and crossover(s_mfi, 50) and crossingOver and longTrend and is_ranging == false, true, false), false)

var buy_counter_rsi = 0
var buy_counter_mfi = 0

mfi_div = iff(enb_stoch_mfi_div, iff(mfi_div_bullish and crossingOver and s_stoch >= 50 and is_ranging, true, false), false)

if mfi_div
    buy_counter_mfi := bar_index + 5
    
mfi_divergent_buy = iff(bar_index <= buy_counter_mfi and strategy.position_size == 0, true, false)

//Strategy Entries
order_fired = false
var float previousRes = 0.0

tpprice := strategy.position_avg_price * (1+tp_percentage)
if time_check
    if mfi_stoch_trend
        strategy.entry("Buy", true, comment = "[B] STOCH/MFI")
        order_fired := true
    if mfi_divergent_buy
        strategy.entry("Buy", true, comment = "[B] MFI Hidden Divergance")
        order_fired := true
        
    if order_fired 
        previousRes := _pL
    if strategy.position_size > 0
        strategy.exit("Buy", limit = tpprice, comment = "TP")
    if close <= previousRes 
        strategy.exit("Buy", stop = previousRes, comment = "SL")
        
//Drawings
hline(0, "Base", color.white)
hline(100, "Max", color.white)

p_stoch = plot(s_stoch, color = c_stoch)
p_mfi = plot(s_mfi, color = c_mfi)

hline(70, "Top Line")
p_mid = plot(50, "Mid Line", color.new(color.white,100))
hline(50, "Mid Line")
hline(30, "Bot Line")
fill(p_stoch, p_mid, color.new(c_stoch, 60))

plotshape(crossOver ? 5 : crossUnder ? -5 : na, style = shape.square, color = crossOver ? c_buy : crossUnder ? c_sell : na, size = size.tiny, location = location.absolute)
plot((_src/sd_src)*2, color = hist_color, style = plot.style_histogram)

//Boxes
// var string same = ""

// var box _box = na
// if longTrend and is_ranging == false and same != "longtrend"
//     same := "longtrend"
//     _box := box.new(bar_index, 105, bar_index, 100, bgcolor = c_longtrend,border_color = color.new(color.white, 100))
// else if is_ranging and same != "isranging"
//     same := "isranging"
//     _box := box.new(bar_index, 105, bar_index, 100, bgcolor = c_flat,border_color = color.new(color.white, 100))

// if not na(_box)
//     box.set_right(_box,bar_index)

// //Div Lines
// var line _line = na
// if mfi_divergent_buy
//     _line = line.new(bL[1] -6, s_mfi[bar_index-bL[1]], bar_index + 6, s_mfi, color = color.green, width = 3)