레인보우 오실레이터 트레이딩 전략


생성 날짜: 2024-02-23 14:57:43 마지막으로 수정됨: 2024-02-23 14:57:43
복사: 4 클릭수: 706
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

레인보우 오실레이터 트레이딩 전략

개요

무지개 진동기 거래 전략은 주로 여러 지수 평평한 이동 평균과 진동 지표를 사용하여 여러 층의 진동 통로를 구축하여 레벨이 명확한 다중 공백 신호를 형성합니다. 이 전략은 RSI, CCI, Stochastic 및 MA 복합 지표를 사용하여 시장의 전반적인 움직임을 판단하고 과매도 과매도 지역을 판단하는 전략입니다.

전략 원칙

  1. RSI, CCI, Stochastic의 3가지 지표값의 중도 평균을 계산하여 종합적인 흔들림 지표 Magic을 구성합니다.
  2. 매직 지수를 여러 번 지수적으로 부드럽게 처리하면 샘플링 된 매직 패스트와 샘플링 된 매직 슬로우 두 곡선을 얻을 수 있습니다.
  3. sampledMagicFast은 빠른 평균을, sampledMagicSlow은 느린 평균을 나타냅니다.
  4. 샘플링 마지크 패스트에 샘플링 마지크 슬로우를 착용할 때 구매 신호가 발생한다.
  5. 샘플링 마지크 패스트 아래에서 샘플링 마지크 슬로우를 착용할 때 판매 신호가 발생한다.
  6. 마지막 바의 sampledMagicFast의 방향이 이전 바와 비교되어 현재 트렌드를 판단하기 위해 계산합니다.
  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)