Đây là một chiến lược giao dịch phổ quát được thiết kế cho thị trường tiền điện tử, nhằm mục đích tìm kiếm các cơ hội nhập cảnh tốt khi tăng trên tiền điện tử để nắm giữ trung và dài hạn. Nó kết hợp các chỉ số kỹ thuật khác nhau như MFI, STOCH, VWMA để xác định sự đảo ngược xu hướng tiềm ẩn dựa trên sự khác biệt ẩn.
Chiến lược có hai logic đầu vào:
MFI ẩn chênh lệch + bộ lọc STOCH: Khi có một chênh lệch ẩn giữa giá và MFI, tức là giá đạt mức cao mới nhưng MFI không, nó cho thấy một sự đảo ngược xu hướng tiềm năng. Để tránh các tín hiệu sai, chúng tôi thêm STOCH> 50% làm bộ lọc bổ sung.
Hệ thống xu hướng STOCH / MFI: Khi STOCH> 50% và MFI vượt trên 50, nó báo hiệu xu hướng tăng trong hành động. Chúng ta có thể đi theo xu hướng để có lợi nhuận điều chỉnh rủi ro tốt hơn.
Để đảm bảo độ chính xác của việc phát hiện xu hướng, một hệ thống xu hướng bao gồm VWMA và SMA được xây dựng. Các mục chỉ được phép khi VWMA vượt qua SMA, xác nhận xu hướng tăng. Bên cạnh đó, OBV được sử dụng để kiểm tra xem thị trường tổng thể có hoạt động hay không. Điều này tiếp tục lọc ra một số tín hiệu sai.
ATR được sử dụng để xác định xem thị trường có dao động hay không. Chúng tôi thích ghi vào sự khác biệt ẩn trong các thị trường giới hạn trong phạm vi. Stop loss được đặt dựa trên mức hỗ trợ gần đây. Lấy lợi nhuận khi đạt một tỷ lệ lợi nhuận nhất định dựa trên giá nhập cảnh.
Các chiến lược kết hợp các chỉ số khác nhau để lọc ra tiếng ồn của thị trường và tránh tín hiệu sai. Hệ thống chênh lệch ẩn cung cấp các mục có khả năng cao với rủi ro được kiểm soát trong các thị trường dao động và điều chỉnh. Hệ thống xu hướng STOCH / MFI tạo ra lợi nhuận bổ sung khi một xu hướng rõ ràng được thiết lập. Cài đặt TP và SL hợp lý ngăn chặn việc theo đuổi đà và dừng săn. Chiến lược phù hợp với thị trường tiền điện tử rất dễ biến động để có lợi nhuận điều chỉnh rủi ro vững chắc.
Rủi ro chính là sự khác biệt ẩn không phải lúc nào cũng dẫn đến sự đảo ngược ngay lập tức vì nó chỉ gợi ý về tình cảm thị trường thay đổi. STOCH ồn ào và các tín hiệu khác có thể là kết quả của việc điều chỉnh tham số kém. Mức TP / SL quá chặt chẽ cũng có thể dẫn đến thoát và tái nhập quá mức, kéo xuống lợi nhuận ròng.
Chúng tôi giải quyết các vấn đề này thông qua các bộ lọc xu hướng và điều kiện thị trường bổ sung, mức TP / SL dung nạp hơn, v.v. Vẫn có thể xảy ra tổn thất đáng kể trong trường hợp các sự kiện thiên nga đen lớn hoặc không cắt giảm lỗ kịp thời.
Vẫn còn chỗ để cải thiện chiến lược này:
Tối ưu hóa các tham số MFI/STOCH để có độ chính xác phân kỳ ẩn tốt hơn
Thêm các mô hình ML để xác định điều kiện thị trường và điều chỉnh các tham số
Kiểm tra TP/SL năng động để cân bằng lợi nhuận và kiểm soát rủi ro
Kiểm tra sự khác biệt giữa các tài sản và đặt các tham số cá nhân
Thêm các bộ lọc lựa chọn cổ phiếu để chọn chất lượng tốt hơn
Những nỗ lực này có khả năng nâng cao sự ổn định và lợi nhuận hơn nữa.
Đây là một chiến lược giao dịch tiền điện tử rất thực tế. Nó áp dụng một cách khôn ngoan các chỉ số kỹ thuật khác nhau để xác định điều kiện thị trường và mang lại lợi nhuận điều chỉnh rủi ro vững chắc. Lưu ý chính là sự khác biệt ẩn không phải lúc nào cũng dự đoán chính xác sự đảo ngược ngay lập tức. Chúng tôi xử lý vấn đề này thông qua một chuỗi các bộ lọc. Vẫn còn chỗ để tăng sự ổn định và lợi nhuận. Nó cung cấp những ý tưởng hiệu quả cho các lượng để thu được lợi nhuận nhất quán trong không gian tiền điện tử.
/*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)