
Chiến lược này sử dụng chỉ số tương đối mạnh yếu (RSI) hoặc chỉ số dòng tiền (MFI) để xác định thị trường tăng hoặc giảm, và kết hợp hệ số bò và gấu của lý thuyết Dow để tính toán phân bố xác suất điều chỉnh. Tùy thuộc vào loại thị trường khác nhau, các logic nhập và thoát khác nhau được sử dụng.
Chiến lược này nói chung có kết quả tốt và có một số giá trị thực tế. Tuy nhiên, vẫn cần thử nghiệm và điều chỉnh thêm, đặc biệt là logic dừng tổn thất. Sử dụng các chỉ số hỗ trợ phán đoán sẽ hiệu quả hơn, không thể theo dõi mù quáng.
/*backtest
start: 2022-12-05 00:00:00
end: 2023-03-11 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
//MIT License
//Copyright (c) 2019 user-Noldo
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//The above copyright notice and this permission notice shall be included in all
//copies or substantial portions of the Software.
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
//SOFTWARE.
strategy("Dow Factor RSI/MFI and Dependent Variable Odd Generator Strategy",shorttitle = "Dow_Factor RSI/MFI & DVOG Strategy", overlay = false, default_qty_type=strategy.percent_of_equity,commission_type=strategy.commission.percent, commission_value=0.125, default_qty_value=100 )
src = close
lights = input(title="Barcolor I / 0 ? ", options=["ON", "OFF"], defval="OFF")
method = input(title="METHOD", options=["MFI", "RSI"], defval="RSI")
length = input(5, minval=2,maxval = 14, title = "Strategy Period")
// Essential Functions
// Function Sum
f_sum(_src , _length) =>
_output = 0.00
_length_adjusted = _length < 1 ? 1 : _length
for i = 0 to _length_adjusted-1
_output := _output + _src[i]
f_sma(_src, _length)=>
_length_adjusted = _length < 1 ? 1 : _length
float _sum = 0
for _i = 0 to (_length_adjusted - 1)
_sum := _sum + _src[_i]
_return = _sum / _length_adjusted
// Unlocked Exponential Moving Average Function
f_ema(_src, _length)=>
_length_adjusted = _length < 1 ? 1 : _length
_multiplier = 2 / (_length_adjusted + 1)
_return = 0.00
_return := na(_return[1]) ? _src : ((_src - _return[1]) * _multiplier) + _return[1]
// Function Standard Deviation
f_stdev(_src,_length) =>
float _output = na
_length_adjusted = _length < 2 ? 2 : _length
_avg = f_ema(_src , _length_adjusted)
evar = (_src - _avg) * (_src - _avg)
evar2 = ((f_sum(evar,_length_adjusted))/_length_adjusted)
_output := sqrt(evar2)
// Linear Regression Channels :
f_pearson_corr(_src1, _src2, _length) =>
_length_adjusted = _length < 2 ? 2 : _length
_ema1 = f_ema(_src1, _length_adjusted)
_ema2 = f_ema(_src2, _length_adjusted)
isum = 0.0
for i = 0 to _length_adjusted - 1
isum := isum + (_src1[i] - _ema1) * (_src2[i] - _ema2)
isumsq1 = 0.0
for i = 0 to _length_adjusted - 1
isumsq1 := isumsq1 + pow(_src1[i] - _ema1, 2)
isumsq2 = 0.0
for i = 0 to _length_adjusted - 1
isumsq2 := isumsq2 + pow(_src2[i] - _ema2, 2)
pcc = isum/(sqrt(isumsq1*isumsq2))
pcc
// Dow Theory Cycles
dow_coeff = f_pearson_corr(src,volume,length)
dow_bull_factor = (1 + dow_coeff)
dow_bear_factor = (1 - dow_coeff)
// MONEY FLOW INDEX =====> FOR BULL OR BEAR MARKET (CLOSE)
upper_s = f_sum(volume * (change(src) <= 0 ? 0 : src), length)
lower_s = f_sum(volume * (change(src) >= 0 ? 0 : src), length)
_market_index = rsi(upper_s, lower_s)
// RSI (Close)
// Function RMA
f_rma(_src, _length) =>
_length_adjusted = _length < 1 ? 1 : _length
alpha = _length_adjusted
sum = 0.0
sum := (_src + (alpha - 1) * nz(sum[1])) / alpha
// Function Relative Strength Index (RSI)
f_rsi(_src, _length) =>
_output = 0.00
_length_adjusted = _length < 0 ? 0 : _length
u = _length_adjusted < 1 ? max(_src - _src[_length_adjusted], 0) : max(_src - _src[1] , 0) // upward change
d = _length_adjusted < 1 ? max(_src[_length_adjusted] - _src, 0) : max(_src[1] - _src , 0) // downward change
rs = f_rma(u, _length) / f_rma(d, _length)
res = 100 - 100 / (1 + rs)
res
_rsi = f_rsi(src, length)
// Switchable Method Codes
_method = 0.00
if (method=="MFI")
_method:= _market_index
if (method=="RSI")
_method:= _rsi
// Conditions
_bull_gross = (_method )
_bear_gross = (100 - _method )
_price_stagnant = ((_bull_gross * _bear_gross ) / 100)
_price_bull = (_bull_gross - _price_stagnant)
_price_bear = (_bear_gross - _price_stagnant)
_coeff_price = (_price_stagnant + _price_bull + _price_bear) / 100
_bull = _price_bull / _coeff_price
_bear = _price_bear / _coeff_price
_stagnant = _price_stagnant / _coeff_price
// Market Types with Dow Factor
_temp_bull_gross = _bull * dow_bull_factor
_temp_bear_gross = _bear * dow_bear_factor
// Addition : Odds with Stagnant Market
_coeff_normal = (_temp_bull_gross + _temp_bear_gross) / 100
// ********* OUR RSI / MFI VALUE ***********
_value = _temp_bull_gross / _coeff_normal
// Temporary Pure Odds
_temp_stagnant = ((_temp_bull_gross * _temp_bear_gross) / 100)
_temp_bull = _temp_bull_gross - _temp_stagnant
_temp_bear = _temp_bear_gross - _temp_stagnant
// Now we ll do venn scheme (Probability Cluster)
// Pure Bull + Pure Bear + Pure Stagnant = 100
// Markets will get their share in the Probability Cluster
_coeff = (_temp_stagnant + _temp_bull + _temp_bear) / 100
_odd_bull = _temp_bull / _coeff
_odd_bear = _temp_bear / _coeff
_odd_stagnant = _temp_stagnant / _coeff
_positive_condition = crossover (_value,50)
_negative_condition = crossunder(_value,50)
_stationary_condition = ((_odd_stagnant > _odd_bull ) and (_odd_stagnant > _odd_bear))
// Strategy
closePosition = _stationary_condition
if (_positive_condition)
strategy.entry("Long", strategy.long, comment="Long")
strategy.close(id = "Long", when = closePosition )
if (_negative_condition)
strategy.entry("Short", strategy.short, comment="Short")
strategy.close(id = "Short", when = closePosition )
// Plot Data
// Plotage
oversold = input(25 , type = input.integer , title = "Oversold")
overbought = input(75 , type = input.integer , title = "Overbought")
zero = 0
hundred = 100
limit = 50
// Plot Data
stagline = hline(limit , color=color.new(color.white,0) , linewidth=1, editable=false)
zeroline = hline(zero , color=color.new(color.silver,100), linewidth=0, editable=false)
hundredline = hline(hundred , color=color.new(color.silver,100), linewidth=0, editable=false)
oversoldline = hline(oversold , color=color.new(color.silver,100), linewidth=0, editable=false)
overboughtline = hline(overbought , color=color.new(color.silver,100), linewidth=0, editable=false)
// Filling Borders
fill(zeroline , oversoldline , color=color.maroon , transp=88 , title = "Oversold Area")
fill(oversoldline , stagline , color=color.red , transp=80 , title = "Bear Market")
fill(stagline , overboughtline , color=color.green , transp=80 , title = "Bull Market")
fill(overboughtline , hundredline , color=color.teal , transp=88 , title = "Overbought Market")
// Plot DOW Factor Methods
plot(_value, color = #F4C430 , linewidth = 2 , title = "DOW F-RSI" , transp = 0)
// Plot border lines
plot(oversold ,style = plot.style_line,color = color.new(color.maroon,30),linewidth = 1)
plot(overbought,style = plot.style_line,color = color.new(color.teal,30) ,linewidth = 1)
plot(zero ,style = plot.style_line , color = color.new(color.silver,30) , linewidth = 1 ,editable = false)
plot(hundred ,style = plot.style_line , color = color.new(color.silver,30) , linewidth = 1 ,editable = false)
// Switchable Barcolor ( On / Off)
_lights = 0.00
if (lights=="ON")
_lights:= 1.00
if (lights=="OFF")
_lights:= -1.00
bcolor_on = _lights == 1.00
bcolor_off = _lights == -1.00
barcolor((_positive_condition and bcolor_on) ? color.green : (_negative_condition and bcolor_on) ? color.red :
(_stationary_condition and bcolor_on) ? color.yellow : na)
// Alerts
alertcondition(_positive_condition , title='Strong Buy !', message='Strong Buy Signal ')
alertcondition(crossover(_value,overbought) , title='Gradual Buy', message='Gradual Buy Signal')
alertcondition(crossover(_value,oversold) , title='Gradual Buy', message='Gradual Buy Signal')
alertcondition(crossunder(_value,overbought) , title='Gradual Sell', message='Gradual Sell Signal')
alertcondition(crossunder(_value,oversold) , title='Gradual Sell', message='Gradual Sell Signal')
alertcondition(_negative_condition , title='Strong Sell !', message='Strong Sell Signal ')