레인보우 오시레이터 거래 전략

저자:차오장, 날짜: 2024-02-23 14:57:43
태그:

img

전반적인 설명

레인보우 오시일레이터 (Rainbow Oscillator) 거래 전략은 주로 다층 오시일레이션 채널을 구축하고 명확한 장기/단기 신호를 생성하기 위해 여러 매끄러운 이동 평균 및 오시일레이션 지표를 사용합니다. 트렌드를 따르는 전략 범주에 속합니다. 이 전략은 RSI, CCI, 스토카스틱 및 MA 복합 지표를 결합하여 전체 시장 추세와 과잉 구매 / 과잉 판매 지역을 결정합니다. 그것은 다중 요인 등급 전략입니다.

원칙

  1. RSI, CCI 및 스토카스틱의 가중평균을 계산하여 Magic라는 결합 오스실레이션 지표를 만듭니다.
  2. Magic에 기하급수 평형을 여러 번 적용하여 sampledMagicFast와 sampledMagicSlow라는 두 줄을 생성합니다.
  3. sampledMagicFast는 빠른 EMA 라인을 나타내고 sampledMagicSlow는 느린 EMA 라인을 나타냅니다.
  4. 샘플링된 매직Fast가 샘플링된 매직Slow 위에 넘어가면 구매 신호가 생성됩니다.
  5. 샘플링된 MagicFast가 샘플링된 MagicSlow 아래를 넘어가면 판매 신호가 생성됩니다.
  6. 현재 트렌드를 결정하기 위해 마지막 막대기의 방향을 계산합니다.
  7. 샘플링된 매직 패스트와 샘플링된 매직 슬로우 사이의 트렌드 방향과 교차 상황을 기반으로 입구와 출구점을 결정합니다.

장점

  1. 시장의 전반적인 흐름을 결정하기 위해 여러 지표를 결합하면 신호 정확도가 향상됩니다.
  2. 매끄러운 MA는 소음을 효과적으로 필터링합니다.
  3. 다층 오시슬레이션 신호는 명확한 작동 지침을 제공합니다.
  4. 트렌드 필터를 활성화/실용함으로써 트렌드 추종 또는 평균 역행으로 구성할 수 있다.
  5. 유연성을 위해 과반 구매/ 과반 판매 강도를 조정할 수 있습니다.

위험성

  1. 지나치게 부드러운 곡선으로 인해 가장 좋은 입구점이 빠질 수 있습니다.
  2. 부적절한 과잉 구매/ 과잉 판매 영역 설정은 포지션을 너무 오랫동안 닫게 할 수 있습니다.
  3. 등급 모델의 일부 요소가 실패하면 신호가 약해질 수 있습니다.

해결책:

  1. 적절한 평형 정도를 위해 매개 변수를 최적화합니다.
  2. 평평한 위치에 있는 시간을 줄이기 위해 과반 구매/ 과반 판매 부위의 강도를 조정합니다.
  3. 각 지표의 예측 능력을 테스트하고 가중합니다.

최적화 방향

  1. 시장 조건에 따라 지표 매개 변수를 동적으로 조정합니다.
  2. 기계 학습 방법을 도입하여 자동으로 표시자 조합을 최적화합니다.
  3. 입문 신호에 볼륨과 변동성 필터 같은 요소를 추가합니다.

결론

레인보우 오시일레이터 전략은 여러 지표의 신호를 결합하고 안정성을 향상시키기 위해 기하급수 평형을 사용합니다. 트렌딩 및 측면 시장 또는 특정 제품에 모두 구성 할 수 있습니다. 매개 변수 조정 및 지표 확장으로 추가 개선이 가능합니다. 전반적으로 이것은 명확하고 사용하기 쉬운 전략입니다.


// 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
strategy("Rainbow Oscillator [Strategy]", overlay=false, margin_long=100, margin_short=100, initial_capital = 2000)

bool trendFilter = input.bool(true, 'Use trend filter')
float w1 = input.float(0.33, 'RSI Weight', 0, 1, 0.01)
float w2 = input.float(0.33, 'CCI Weight', 0, 1, 0.01)
float w3 = input.float(0.33, 'Stoch Weight', 0, 1, 0.01)
int fastPeriod = input.int(16, 'Ocillograph Fast Period', 4, 60, 1)
int slowPeriod = input.int(22, 'Ocillograph Slow Period', 4, 60, 1)
int oscillographSamplePeriod = input.int(8, 'Oscillograph Samples Period', 1, 30, 1)
int oscillographSamplesCount = input.int(2, 'Oscillograph Samples Count', 0, 4, 1)
string oscillographMAType = input.string("RMA", "Oscillograph Samples Type", options = ["EMA", "SMA", "RMA", "WMA"])
int levelPeriod = input.int(26, 'Level Period', 2, 100)
int levelOffset = input.int(0, 'Level Offset', 0, 200, 10)
float redunant = input.float(0.5, 'Level Redunant', 0, 1, 0.01)
int levelSampleCount = input.int(2, '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(5, "% Take profit", 0.8, 100, step = 0.1)  / 100
float stopLoss = input.float(2, "% Stop Loss", 0.8, 100, step = 0.1) / 100
float magicFast = w2 * ta.cci(close, fastPeriod) + w1 * (ta.rsi(close, fastPeriod) - 50) + w3 * (ta.stoch(close, high, low, fastPeriod) - 50)
float magicSlow = w2 * ta.cci(close, slowPeriod) + w1 * (ta.rsi(close, slowPeriod) - 50) + w3 * (ta.stoch(close, high, low, slowPeriod) - 50)
float sampledMagicFast = getSample(magicFast, oscillographSamplesCount, oscillographMAType, oscillographSamplePeriod)
float sampledMagicSlow = getSample(magicSlow, oscillographSamplesCount, oscillographMAType, oscillographSamplePeriod)
float lastUpperValue = 0
float lastLowerValue = 0

if (magicFast > 0)
    lastUpperValue := math.max(magicFast, magicFast[1])
else 
    lastUpperValue := math.max(0, lastUpperValue[1]) * redunant

    
if (magicFast <= 0)
    lastLowerValue := math.min(magicFast, magicFast[1])
else
    lastLowerValue := math.min(0, lastLowerValue[1]) * redunant

float level1up = getSample( (magicFast >= 0 ? magicFast : lastUpperValue) / 4, levelSampleCount, levelType, levelPeriod) + levelOffset
float level2up = getSample( (magicFast >= 0 ? magicFast : lastUpperValue) / 2, levelSampleCount, levelType, levelPeriod) + levelOffset
float level3up = getSample( magicFast >= 0 ? magicFast : lastUpperValue, levelSampleCount, levelType, levelPeriod) + levelOffset
float level4up = getSample( (magicFast >= 0 ? magicFast : lastUpperValue) * 2, levelSampleCount, levelType, levelPeriod) + levelOffset

float level1low = getSample( (magicFast <= 0 ? magicFast : lastLowerValue) / 4, levelSampleCount, levelType, levelPeriod) - levelOffset
float level2low = getSample( (magicFast <= 0 ? magicFast : lastLowerValue) / 2, levelSampleCount, levelType, levelPeriod) - levelOffset
float level3low = getSample( magicFast <= 0 ? magicFast : lastLowerValue, levelSampleCount, levelType, levelPeriod) - levelOffset
float level4low = getSample( (magicFast <= 0 ? magicFast : 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)

fastColor = color.new(color.teal, 60)
slowColor = color.new(color.red, 60)
fastPlotId = plot(sampledMagicFast, 'fast', color = fastColor)
slowPlotId = plot(sampledMagicSlow, 'slow', color = slowColor)

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)

upTrend = sampledMagicFast > sampledMagicFast[1]
buySignal = ((upTrend or not trendFilter) and ta.crossunder(sampledMagicSlow, sampledMagicFast)) ? sampledMagicSlow : na
sellSignal = ((not upTrend or not trendFilter) and ta.crossover(sampledMagicSlow, sampledMagicFast)) ? sampledMagicSlow : na
diff = sampledMagicSlow - sampledMagicFast

fill(fastPlotId, slowPlotId, upTrend ? fastColor : slowColor)
plot(buySignal, color = color.aqua, style = plot.style_circles, linewidth = 4)
plot(sellSignal, color = color.red, style = plot.style_circles, linewidth = 4)


// longCondition = upTrend != upTrend[1] and upTrend
long_take_level = strategy.position_avg_price * (1 + takeProfit)
long_stop_level = strategy.position_avg_price * (1 - stopLoss)

short_take_level = strategy.position_avg_price * (1 - takeProfit)
short_stop_level = strategy.position_avg_price * (1 + stopLoss)

strategy.close(id="Long", when=sellSignal, comment = "Exit")
strategy.close(id="Short", when=buySignal, comment = "Exit")

strategy.entry("Long", strategy.long, when=buySignal)
strategy.entry("Short", strategy.short, when=sellSignal)

strategy.exit("Take Profit/ Stop Loss","Long", stop=long_stop_level, limit=long_take_level)
strategy.exit("Take Profit/ Stop Loss","Short", stop=short_stop_level, limit=short_take_level)


// plot(long_stop_level, color=color.red, overlay=true)
// plot(long_take_level, color=color.green)


더 많은