Динамические уровни: Показатель состоит из уровней (зоны переворота цен), которые коррелируют друг с другом с другими числами Фибоначчи. Все уровни формируются из существующих негладких значений осциллятора. Это позволяет не фиксировать пороги поворотной зоны, например, -100 и 100, как это делается в CCI Динамические уровни адаптируются к пикам в значениях осциллятора и позволяют чаще и не менее эффективно находить точки переворота цен.
.:: Композитный осциллятор (3 в 1) ::. Линия осциллятора состоит из трех измерений индикаторов RSI, CCI, Stoch сразу в широком процентном соотношении. В то же время, благодаря настройкам, можно легко избавиться от одного из индикаторов.
.:: Установка коэффициента CCI + RSI + Stoch Каждый из естественных показателей имеет свой собственный вес в формуле расчета: w2 * cci ( + w1 * (rsi - 50) + (1 - w2 - w1) * (сток - 50), это позволяет видеть осциллятор к любому из этих различных показателей или остроты вес для каждого
.:: Уровняющие уровни и линии осциллятора:. Углаживание значений осциллятора позволяет отфильтровать шум и получить более точные данные.
.:: Деятельность во время АПАРТМЕНТА.::. Динамическое создание уровней позволяет найти в зоне переворота цены, даже когда цена находится в плоской (плоской)
.:: вес RSI / вес CCI Коэффициенты контроля веса для индикаторов RSI и CCI соответственно. Когда вы устанавливаете RSI Weight = 0, уравняете комбинацию CCI и Stoch, когда вес RSI равен нулю, а вес CCI равен значению осциллятора, будет проецировано Промежуточные значения имеют высокую степень измерения каждого из трех осцилляторов в процентном выражении от 0 до 100. где w1 - вес RSI и w2 - вес CCI, вес Stoch рассчитывается на ходу как (1 - w2 - w1), поэтому сумма w1 + w2 не должна превышать 1, в этом случае Stoch будет работать в противоположность CCI и RSI.
.:: Период осциллоскопа: Возможно, в ожидаемых версиях периоды будут настроены отдельно.
.:: Осциллоскоп М.А. Период: Периодическое сглаживание линии осциллятора. Служит для более тонкой настройки для устранения шума. Если вы выберете значение 0, сглаживание отключено, и настройка Oscilloscope Samples автоматически перестанет работать.
.:: Образцы волновой формы: Оциллоскоп типа MA
.:: осциллоскоп MA Тип: Тип скользящей средней частоты для скольжения линии осциллятора
.:: Уровень периода: Периодические скользящие средние, используемые для формирования уровней (зоны) индикатора радужного осциллятора
.:: Условное смещение: Дополнительная настройка для сдвига уровней с нулевых точек. Может быть полезен для поглощения уровней и фильтрации входных сигналов.
.:: избыточный уровень: Это характеризует тяжесть состояния состояния при каждой итерации уровня заболевания. Если установить на 1 - уровни не уменьшатся, когда значения осциллятора падают. Если он имеет значение 0,99 - уровни уменьшаются на 0,01 Каждый из них имеет осциллятор в 1% случаев и подталкивается к нулю более агрессивными.
.:: Образцы сглаженных уровней: Измерение числа средних с определением типа скользящих средних
.:: Тип уровня МО: Тип скользящей средней, средняя для формирования сглаживающей зоны перекупления и перепродажи
обратная проверка
/*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)