이것은 암호화폐 시장을 위해 고안된 보편적인 거래 전략으로, 중장기 보유를 위해 암호화폐에 대한 상승세를 보이는 경우 좋은 진입 기회를 찾는 것을 목표로 합니다. 이는 숨겨진 분리를 기반으로 잠재적 인 트렌드 반전을 식별하기 위해 MFI, STOCH, VWMA와 같은 다양한 기술적 지표를 결합합니다.
이 전략은 두 가지 진입 논리를 가지고 있습니다.
MFI 숨겨진 오차 + STOCH 필터: 가격과 MFI 사이에 숨겨진 오차가 있을 때, 즉 가격이 새로운 최고치를 달성하지만 MFI는 그렇지 않을 때, 이는 잠재적 인 트렌드 반전을 나타냅니다. 잘못된 신호를 피하기 위해 우리는 추가 필터로 STOCH>50%를 추가합니다.
STOCH/MFI 트렌드 시스템: STOCH>50%와 MFI가 50을 넘으면 상승 추세를 나타냅니다. 우리는 더 나은 위험 조정 수익을 위해 추세를 타고 있습니다.
트렌드 검출의 정확성을 보장하기 위해 VWMA와 SMA로 구성된 트렌드 시스템이 구축됩니다. VWMA가 SMA를 넘어서면 상승 추세를 확인하는 경우에만 엔트리가 허용됩니다. 또한 OBV는 전체 시장이 활성화되거나 범위가 있는지 확인하는 데 사용됩니다. 이것은 일부 잘못된 신호를 추가로 필터링합니다.
ATR은 시장이 범위가 있는지 여부를 결정하는 데 사용됩니다. 우리는 범위 제한 시장에서 숨겨진 분리에 대한 항목을 취하는 것을 선호합니다. 중지 손실은 최근 지원 수준에 따라 설정됩니다. 엔트리 가격에 따라 수익의 특정 비율이 달성되면 수익 출구를 취합니다.
이 전략은 시장 소음을 필터링하고 잘못된 신호를 피하기 위해 다양한 지표를 결합합니다. 숨겨진 분산 시스템은 범위 및 교정 시장에서 통제 된 위험에 높은 확률 항목을 제공합니다. STOCH / MFI 트렌드 시스템은 명확한 추세가 설정되면 추가 수익을 창출합니다. 합리적인 TP 및 SL 설정은 추진력을 추구하고 사냥을 중지하는 것을 방지합니다. 전략은 고도로 변동적인 암호화 시장에 매우 적합합니다.
주요 위험은 숨겨진 분리가 항상 즉각적인 반전으로 이어지는 것은 아니며 단순히 시장 분위기 변화만을 암시하는 것입니다. 소란 스톡 및 기타 신호는 파라미터 조정이 좋지 않은 결과로 발생할 수 있습니다. 너무 긴 TP / SL 수준은 또한 과도한 출구 및 재입입으로 이어지고 순이익을 끌어내릴 수 있습니다.
우리는 추가적인 트렌드 및 시장 조건 필터, 더 관용적인 TP/SL 수준 등을 통해 이러한 문제를 해결합니다. 큰 블랙 스완 사건 또는 시간적으로 손실을 줄이지 않는 경우 여전히 상당한 손실이 발생할 수 있습니다.
이 전략은 여전히 개선할 수 있습니다.
더 나은 숨겨진 오차 정확성을 위해 MFI/STOCH 매개 변수를 최적화
시장 조건 및 미세 조정 매개 변수를 결정하기 위해 ML 모델을 추가
수익성과 위험 통제를 균형 잡기 위한 동적 TP/SL 테스트
크로스 자산 차이를 확인하고 개인 매개 변수를 설정
더 나은 품질의 선택을 위해 주식 선택 필터를 추가
이러한 노력은 잠재적으로 안정성과 수익성을 더욱 향상시킬 수 있습니다.
이것은 매우 실용적인 암호화폐 거래 전략이다. 시장 조건을 결정하기 위해 다양한 기술적 지표를 신중하게 적용하고 확실한 위험 조정 수익을 제공합니다. 주요 경고는 숨겨진 분리가 항상 즉각적인 반전을 정확하게 예측하지 않는다는 것입니다. 우리는 필터의 연속을 통해 이 문제를 처리합니다. 안정성과 수익을 높이는 공간이 남아 있습니다. 암호화폐 공간에서 일관된 이익을 얻기 위해 양자에 대한 유익한 아이디어를 제공합니다.
/*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)