
Ini adalah strategi perdagangan umum yang dirancang untuk pasar cryptocurrency, yang bertujuan untuk mencari waktu masuk yang lebih baik, untuk memegang garis tengah dalam lingkungan pasar cryptocurrency yang lebih besar. Strategi ini menggunakan berbagai indikator teknis, seperti indikator MFI, indikator STOCH, dan indikator VWMA, untuk menangkap peluang pembalikan tren potensial dengan menilai pergeseran yang tersembunyi.
Strategi ini terdiri dari dua logika masuk:
MFI Hidden Deviation + STOCH Filter: Ketika MFI membentuk Hidden Deviation, yaitu harga inovasi tinggi tetapi MFI tidak inovasi tinggi, kami menganggap ini sebagai sinyal reversal tren potensial. Tetapi untuk menghindari sinyal palsu, kami menambahkan tambahan STOCH> 50% sebagai kondisi penyaringan.
Sistem tren STOCH/MFI: Ketika STOCH> 50% dan MFI melintasi garis 50 dari bawah ke atas, menunjukkan tren pasar sedang terbentuk, saat ini masuk dapat memperoleh pengembalian risiko yang lebih baik.
Untuk memastikan keakuratan penilaian tren, kami juga membangun sistem tren berdasarkan VWMA dan SMA. Hanya dengan melewati SMA di VWMA, yaitu menentukan tren yang naik, kedua sistem di atas akan mengirimkan sinyal perdagangan. Selain itu, kami menggunakan indikator OBV untuk menentukan apakah pasar secara keseluruhan berada dalam keadaan aktif atau dalam keadaan padat, yang juga digunakan untuk menyaring beberapa sinyal palsu.
Indikator ATR digunakan untuk menilai apakah pasar berada dalam keadaan goyah, kami lebih memilih untuk melakukan intervensi di pasar goyah untuk mencari MFI yang tersembunyi. Metode stop loss adalah dengan merujuk harga stop loss yang ditetapkan pada level dukungan baru-baru ini. Metode stop loss adalah dengan menghitung stop loss proporsional mulai dari harga masuk.
Strategi ini menggunakan berbagai indikator untuk menentukan struktur pasar, dan berhasil menghindari sebagian besar kebisingan. Sistem yang tersembunyi dari sistem dapat memberikan peluang masuk dengan probabilitas tinggi dan risiko yang dapat dikontrol selama fase goncangan dan penyesuaian. Sistem tren STOCH / MFI dapat memperoleh keuntungan tambahan dalam tren yang jelas.
Risiko terbesar dari strategi ini adalah bahwa hiding deviasi dari penilaian tidak selalu dapat diandalkan, hanya mencerminkan perubahan sentimen pasar, dan tidak menjamin harga akan segera berbalik. Selain itu, pengaturan STOCH dan indikator lainnya dapat menyebabkan kehilangan tren atau menghasilkan sinyal palsu jika tidak tepat.
Kami menyaring sinyal dengan menambahkan tambahan tren dan penilaian kondisi pasar, mengatur toleransi beberapa stop loss level, untuk mengurangi risiko di atas. Tentu saja, jika tidak dapat menghentikan kerugian tepat waktu, sulit untuk benar-benar menghindari kerugian besar pada peristiwa makro besar.
Ada ruang untuk perbaikan lebih lanjut dalam strategi ini, yang berfokus pada beberapa hal berikut:
Optimalkan pengaturan parameter MFI dan STOCH untuk meningkatkan akurasi hiding deviasi dari penilaian
Menambahkan model pembelajaran mesin untuk menilai kondisi pasar, dan memetakan kembali untuk menentukan parameter terbaik
Cobalah untuk melakukan stop loss secara dinamis untuk mengontrol risiko lebih lanjut sambil menjamin keuntungan
Uji diferensiasi dari varietas cryptocurrency yang berbeda, pengaturan parameter personalisasi
Menambahkan modul pilihan saham untuk membuat strategi lebih fokus pada saham dengan bentuk teknologi yang lebih baik
Dengan beberapa optimasi di atas, kita dapat berharap untuk meningkatkan stabilitas dan tingkat pengembalian strategi lebih lanjut.
Ini adalah strategi perdagangan cryptocurrency yang sangat praktis. Ini benar-benar menggunakan beberapa indikator teknis untuk menilai struktur pasar, dengan asumsi risiko yang dapat dikendalikan untuk mendapatkan hasil yang lebih baik. Masalah utama adalah bahwa penilaian yang tersembunyi tidak selalu akurat, dan kami mengurangi masalah ini dengan serangkaian filter.
/*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)