Rainbow Oscillator

Penulis:ChaoZhang, Tanggal: 2022-05-13 22:38:03
Tag:EMASMARMAWMA


Fitur

.:: Tingkat Dinamis Indikator ini terdiri dari tingkat (zona pembalikan harga) yang berkorelasi satu sama lain dengan angka Fibonacci lainnya. Semua tingkat terbentuk dari nilai osilator yang tidak halus yang ada. ini memungkinkan Anda untuk tidak menetapkan ambang zona belokan, misalnya, -100 dan 100, seperti yang dilakukan di CCI atau nilai 30 dan 70 untuk zona pembalikan dalam indikator RSI. tingkat dinamis menyesuaikan dengan lonjakan nilai osilator dan memungkinkan Anda untuk menemukan titik pembalikan harga lebih sering dan tidak kurang efisien.

.:: Osilator komposit (3 dalam 1) Garis osilator terdiri dari tiga pengukuran indikator RSI, CCI, Stoch sekaligus dalam persentase yang luas. Pada saat yang sama, berkat pengaturan, Anda dapat dengan mudah menyingkirkan salah satu indikator.

.:: Pengaturan CCI + RSI + Stoch ratio Masing-masing indikator alami memiliki bobot sendiri dalam rumus perhitungan: w2 * cci ( + w1 * (rsi - 50) + (1 - w2 - w1) * (stoch - 50), ini memungkinkan Anda untuk melihat osilator untuk salah satu dari berbagai indikator atau kecerdasan bobot untuk masing-masing

.:: Tingkat dan garis perataan osilator: Menata nilai osilator memungkinkan Anda untuk menyaring kebisingan dan mendapatkan data yang lebih akurat.

.:: Aktivitas selama APARTEMEN::. Penciptaan tingkat dinamis memungkinkan Anda untuk menemukan di zona pembalikan harga, bahkan ketika harga berada di datar (datar)


Pengaturan

.:: RSI berat / CCI berat Koefisien kontrol bobot untuk indikator RSI dan CCI, masing-masing. Ketika Anda mengatur RSI Weight = 0, menyamakan kombinasi CCI dan Stoch, ketika RSI Weight adalah nol dan CCI Weight sama dengan nilai osilator akan digambarkan hanya dari Stoch. nilai perantara memiliki tingkat tinggi pengukuran masing-masing dari tiga osilator dalam hal persentase dari 0 sampai 100. Perhitungan menggunakan rumus: w2 * cci ( + w1 * (rsi - 50) + (1 - w2 - w1) * (stoch - 50), di mana w1 adalah RSI Berat dan w2 adalah CCI Berat, Stoch berat dihitung di atas terbang sebagai (1 - w2 - w1), sehingga jumlah w1 + w2 seharusnya tidak melebihi 1, dalam hal ini Stoch akan bekerja sebagai lawan dari CCI dan RSI.

.:: Periode osiloskop: Ini adalah periode dari semua osilator, ditetapkan oleh satu parameter untuk semua.

.:: Oscilloscope M.A. Periode: Penghalusan lini osilator secara berkala. Membantu untuk penyesuaian yang lebih halus untuk menghilangkan kebisingan. Jika Anda memilih nilai 0, penghalusan dinonaktifkan dan pengaturan Sampel Osiloskop akan secara otomatis berhenti bekerja.

.:: Sampel bentuk gelombang: pengaturan memungkinkan Anda untuk mengatur jumlah pelembab untuk garis osilator.

.:: Oscilloscope MA Tipe: Jenis frekuensi rata-rata bergerak untuk geser garis osilator

.:: Periode tingkat: Rata-rata bergerak secara berkala yang digunakan untuk membentuk tingkat (zona) dari indikator Rainbow Oscillator

.:: Tingkat offset:. Pengaturan tambahan untuk menggeser tingkat dari titik nol. Dapat berguna untuk menyerap tingkat dan menyaring sinyal masukan.

.:: Tingkat yang berlebihan Ini menggambarkan tingkat keparahan kondisi pada setiap iterasi tingkat penyakit. Jika ditetapkan menjadi 1 - tingkat tidak akan menurun ketika nilai osilator jatuh. Jika memiliki nilai 0,99 - tingkat berkurang sebesar 0,01 masing-masing memiliki osilator dalam 1% kasus dan ditekan ke 0 oleh yang lebih agresif.

.:: Sampel dari tingkat rata: Mengukur jumlah rata-rata dengan definisi jenis rata-rata bergerak

.:: Jenis tingkat MA: Jenis rata-rata bergerak, rata-rata untuk pembentukan zona overbought dan oversold smoothing

backtest

img


/*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)

Berkaitan

Lebih banyak