
Esta estratégia usa um indicador de força e fraqueza relativa (RSI) ou um indicador de fluxo de capital (MFI) para determinar se o mercado está em alta ou baixa, e combina o coeficiente de baixa e alta da teoria Dow para calcular a distribuição de probabilidade ajustada. Dependendo do tipo de mercado, diferentes entradas e saídas são usadas.
A estratégia geralmente tem bons resultados de retrospectiva e tem um certo valor de combate. No entanto, ainda é necessário testar e ajustar ainda mais, especialmente a lógica de parada de danos. O uso de indicadores como auxiliares de julgamento será mais eficaz e não pode ser seguido às cegas.
/*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 ')