Rainbow Oscillator

Tác giả:ChaoZhang, Ngày: 2022-05-13 22:38:03
Tags:EMASMARMAWMA


Các đặc điểm

.:: Mức năng động Chỉ số bao gồm các mức (vùng đảo ngược giá) tương quan với nhau với các số Fibonacci khác. Tất cả các mức được hình thành từ các giá trị dao động không mịn hiện có. Điều này cho phép bạn không cố định ngưỡng vùng quay, ví dụ, -100 và 100, như được thực hiện trong CCI hoặc các giá trị 30 và 70 cho khu vực đảo ngược trong chỉ số RSI. các mức động điều chỉnh cho các đỉnh trong các giá trị dao động và cho phép bạn tìm điểm đảo ngược giá thường xuyên hơn và không kém hiệu quả.

.:: Trình dao động tổng hợp (3 trong 1) Đường dao động bao gồm ba phép đo của chỉ số RSI, CCI, Stoch cùng một lúc trong một tỷ lệ phần trăm rộng. Đồng thời, nhờ các cài đặt, bạn có thể dễ dàng loại bỏ một trong các chỉ số.

.:: Đặt CCI + RSI + Stoch ratio Mỗi chỉ số tự nhiên có trọng lượng riêng trong công thức tính toán: w2 * cci ( + w1 * (rsi - 50) + (1 - w2 - w1) * (stoch - 50), điều này cho phép bạn xem một dao động cho bất kỳ các chỉ số khác nhau hoặc trọng lượng sắc nét cho mỗi

.:: Mức độ và đường thẳng của dao động: Làm mịn các giá trị dao động cho phép bạn lọc ra tiếng ồn và có được dữ liệu chính xác hơn.

.:: Hoạt động trong căn hộ: Tạo năng động của các mức cho phép bạn tìm thấy trong khu vực đảo ngược giá, ngay cả khi giá là trong một phẳng (phẳng)


Cài đặt

.:: trọng lượng RSI / trọng lượng CCI Các hệ số kiểm soát trọng lượng cho các chỉ số RSI và CCI, tương ứng. Khi bạn đặt RSI trọng lượng = 0, cân bằng các combo của CCI và Stoch, khi RSI trọng lượng bằng không và CCI trọng lượng bằng với giá trị dao động sẽ được vẽ Chỉ từ Stoch. Các giá trị trung gian có mức độ đo lường cao của mỗi ba dao động trong tỷ lệ phần trăm từ 0 đến 100. trong đó w1 là trọng lượng RSI và w2 là trọng lượng CCI, trọng lượng Stoch được tính trên bay như (1 - w2 - w1), vì vậy tổng của w1 + w2 không nên vượt quá 1, trong trường hợp này Stoch sẽ hoạt động trái ngược với CCI và RSI.

.:: Thời gian dao động: Đây là thời gian của tất cả các dao động, nó được thiết lập bởi một tham số cho tất cả.

.:: Oscilloscope M.A. Thời gian Đơn giản hóa định kỳ của đường dao động. Phục vụ cho điều chỉnh tinh tế hơn để loại bỏ tiếng ồn. Nếu bạn chọn một giá trị 0, làm mịn sẽ bị vô hiệu hóa và cài đặt Các mẫu dao động sẽ tự động ngừng hoạt động.

.:: mẫu hình sóng: thiết lập cho phép bạn đặt số lượng làm mịn cho đường dao động.

.:: Oscilloscope MA Type: Loại tần số trung bình động cho đường trượt dao động

.:: Thời kỳ mốc: Trung bình động định kỳ được sử dụng để tạo ra các mức (vùng) của chỉ số Rainbow Oscillator

.:: Động độ: Cài đặt bổ sung để thay đổi mức từ điểm 0, có thể hữu ích để hấp thụ mức và lọc tín hiệu đầu vào. mặc định là 0.

.:: cấp độ dư thừa: Nó đặc trưng cho mức độ nghiêm trọng của tình trạng ở mỗi lần lặp lại của mức độ bệnh. Nếu được đặt thành 1 - mức độ sẽ không giảm khi các giá trị dao động giảm. Nếu nó có giá trị 0,99 - mức giảm 0,01 mỗi người có một dao động trong 1% trường hợp và được nhấn vào 0 bởi những người hung hăng hơn.

.:: Các mẫu của các mức mịn mịn thiết lập cho phép bạn thiết lập số lượng các nhịp mỗi cấp độ. đo số lượng trung bình với định nghĩa các loại trung bình động

.:: Loại cấp MA: Loại trung bình động, trung bình để hình thành vùng mua quá nhiều và bán quá nhiều

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)

Có liên quan

Thêm nữa