.:: Níveis dinâmicos O indicador consiste em níveis (zonas de reversão de preços) que se correlacionam entre si com outros números de Fibonacci. Todos os níveis são formados a partir dos valores do oscilador não suavizado existentes. Os níveis dinâmicos ajustam-se aos picos nos valores do oscilador e permitem encontrar pontos de reversão de preços com mais frequência e não menos eficiência.
.:: Oscilador composto (3 em 1) A linha do oscilador consiste em três medições dos indicadores RSI, CCI, Stoch de uma só vez em uma grande porcentagem.
.:: CCI + RSI + Stoch ratio Cada um dos indicadores naturais tem o seu próprio peso na fórmula de cálculo: w2 * cci ( + w1 * (rsi - 50) + (1 - w2 - w1) * (stoch - 50), isto permite ver um oscilador para qualquer um destes vários indicadores ou peso de nitidez para cada
.:: Níveis e linhas de suavização do oscilador A suavização dos valores do oscilador permite filtrar o ruído e obter dados mais precisos.
.:: Atividade durante o APARTAMENTO Criação dinâmica de níveis permite-lhe encontrar na zona de reversão do preço, mesmo quando o preço está em um plano (flat)
.:: Peso RSI / Peso CCI Coeficientes de controle de peso para indicadores RSI e CCI, respectivamente. Quando você definir RSI peso = 0, igualar a combinação de CCI e Stoch, quando o peso RSI é zero e CCI peso é igual ao valor do oscilador será traçado Os valores intermediários têm um alto grau de medição de cada um dos três osciladores em termos percentuais de 0 a 100. onde w1 é o peso do RSI e w2 é o peso do CCI, o peso do Stoch é calculado como (1 - w2 - w1), de modo que a soma de w1 + w2 não deve exceder 1, neste caso, o Stoch funcionará em oposição ao CCI e ao RSI.
.:: Período do osciloscópio Este é o período de todos os osciladores, é definido por um parâmetro para todos.
.:: Osciloscópio M.A. Período: A regulação periódica da linha do oscilador serve para uma regulação mais precisa para eliminar o ruído. Se você selecionar um valor de 0, a regulação é desativada e a configuração de amostras do osciloscópio deixará de funcionar automaticamente.
.:: amostras de forma de onda: configuração permite definir a quantidade de suavização para a linha do oscilador.
.:: Osciloscópio MA Tipo: Tipo de frequência média móvel para deslizamento da linha do oscilador
.:: Período de nível: As médias móveis periódicas utilizadas para formar os níveis (zona) do indicador do oscilador Rainbow
.:: Deslocamento de nível:. Configuração adicional para deslocar níveis a partir de pontos zero. Pode ser útil para absorver níveis e filtrar sinais de entrada.
.:: Nível redundante: Ele caracteriza a gravidade do estado do estado em cada iteração do nível da doença. Se definido para 1 - os níveis não diminuirão quando os valores do oscilador cair. Se tiver um valor de 0,99 - os níveis são reduzidos em 0,01 cada um tem um oscilador em 1% dos casos e é pressionado para 0 por os mais agressivos.
.:: amostras de níveis suavizados A configuração permite definir o número de traços por nível. Medindo o número de médias com a definição do tipo de médias móveis
.:: Tipo de nível de MA: Tipo de média móvel, média para a formação de uma zona de sobrecompra e sobrevenda de suavização
backtest
/*backtest start: 2022-04-12 00:00:00 end: 2022-05-06 23:59: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/ // © businessduck //@version=5 indicator("Rainbow Oscillator") float w1 = input.float(0.33, 'RSI Weight', 0, 1, 0.01) float w2 = input.float(0.33, 'CCI Weight', 0, 1, 0.01) int period = input.int(24, 'Ocillograph Period', 4, 60, 1) int oscillographSamplesPeriod = input.int(4, 'Oscillograph MA Period', 1, 30, 1) int oscillographSamplesCount = input.int(1, 'Oscillograph Samples', 0, 4, 1) string oscillographMAType = input.string("SMA", "Oscillograph MA type", options = ["EMA", "SMA", "RMA", "WMA"]) int levelPeriod = input.int(18, 'Level Period', 2, 30) int levelOffset = input.int(0, 'Level Offset', 0, 200, 10) float redunant = input.float(0.99, 'Level Redunant', 0, 1, 0.01) int levelSampleCount = input.int(3, 'Level Smooth Samples', 0, 4, 1) string levelType = input.string("RMA", "Level MA type", options = ["EMA", "SMA", "RMA", "WMA"]) perc(current, prev) => ((current - prev) / prev) * 100 smooth(value, type, period) => float ma = switch type "EMA" => ta.ema(value, period) "SMA" => ta.sma(value, period) "RMA" => ta.rma(value, period) "WMA" => ta.wma(value, period) => runtime.error("No matching MA type found.") float(na) getSample(value, samples, type, period) => float ma = switch samples 0 => value 1 => smooth(value, type, period) 2 => smooth(smooth(value, type, period), type, period) 3 => smooth(smooth(smooth(value, type, period), type, period), type, period) 4 => smooth(smooth(smooth(smooth(value, type, period), type, period), type, period), type, period) float takeProfit = input.float(7.5, "% Take profit", 0.8, 100, step = 0.1) float stopLoss = input.float(3.5, "% Stop Loss", 0.8, 100, step = 0.1) float magic = w2 * ta.cci(close, period) + w1 * (ta.rsi(close, period) - 50) + (1 - w2 - w1) * (ta.stoch(close, high, low, 40) - 50) float sampledMagic = getSample(magic, oscillographSamplesCount, oscillographMAType, oscillographSamplesPeriod) float lastUpperValue = 0 float lastLowerValue = 0 if (magic > 0) lastUpperValue := math.max(magic, magic[1]) else lastUpperValue := math.max(0, lastUpperValue[1]) * redunant if (magic <= 0) lastLowerValue := math.min(magic, magic[1]) else lastLowerValue := math.min(0, lastLowerValue[1]) * redunant float level1up = getSample( (magic >= 0 ? magic : lastUpperValue) / 4, levelSampleCount, levelType, levelPeriod) + levelOffset float level2up = getSample( (magic >= 0 ? magic : lastUpperValue) / 2, levelSampleCount, levelType, levelPeriod) + levelOffset float level3up = getSample( magic >= 0 ? magic : lastUpperValue, levelSampleCount, levelType, levelPeriod) + levelOffset float level4up = getSample( (magic >= 0 ? magic : lastUpperValue) * 2, levelSampleCount, levelType, levelPeriod) + levelOffset float level1low = getSample( (magic <= 0 ? magic : lastLowerValue) / 4, levelSampleCount, levelType, levelPeriod) - levelOffset float level2low = getSample( (magic <= 0 ? magic : lastLowerValue) / 2, levelSampleCount, levelType, levelPeriod) - levelOffset float level3low = getSample( magic <= 0 ? magic : lastLowerValue, levelSampleCount, levelType, levelPeriod) - levelOffset float level4low = getSample( (magic <= 0 ? magic : lastLowerValue) * 2, levelSampleCount, levelType, levelPeriod) - levelOffset var transparent = color.new(color.white, 100) var overbough4Color = color.new(color.red, 75) var overbough3Color = color.new(color.orange, 75) var overbough2Color = color.new(color.yellow, 75) var oversold4Color = color.new(color.teal, 75) var oversold3Color = color.new(color.blue, 75) var oversold2Color = color.new(color.aqua, 85) upperPlotId1 = plot(level1up, 'Upper1', transparent) upperPlotId2 = plot(level2up, 'Upper2', transparent) upperPlotId3 = plot(level3up, 'Upper3', transparent) upperPlotId4 = plot(level4up, 'Upper4', transparent) plot(sampledMagic, 'Oscillograph') lowerPlotId1 = plot(level1low, 'Lower1', transparent) lowerPlotId2 = plot(level2low, 'Lower2', transparent) lowerPlotId3 = plot(level3low, 'Lower3', transparent) lowerPlotId4 = plot(level4low, 'Lower4', transparent) fill(upperPlotId4, upperPlotId3, overbough4Color) fill(upperPlotId3, upperPlotId2, overbough3Color) fill(upperPlotId2, upperPlotId1, overbough2Color) fill(lowerPlotId4, lowerPlotId3, oversold4Color) fill(lowerPlotId3, lowerPlotId2, oversold3Color) fill(lowerPlotId2, lowerPlotId1, oversold2Color) bool longCond = sampledMagic[1] < level4low[1] and sampledMagic > level4low bool shortCond = sampledMagic[1] > level4up[1] and sampledMagic < level4up plotshape(longCond, "Long", shape.circle, location.bottom, color.aqua, 0, na, color.white, false, size.tiny) plotshape(shortCond, "Short", shape.circle, location.top, color.red, 0, na, color.white, false, size.tiny) if longCond strategy.entry("Enter Long", strategy.long) else if shortCond strategy.entry("Enter Short", strategy.short)