রেইনবো অসিলেটর ট্রেডিং কৌশল


সৃষ্টির তারিখ: 2024-02-23 14:57:43 অবশেষে সংশোধন করুন: 2024-02-23 14:57:43
অনুলিপি: 4 ক্লিকের সংখ্যা: 706
1
ফোকাস
1617
অনুসারী

রেইনবো অসিলেটর ট্রেডিং কৌশল

ওভারভিউ

রংধনু ঝাঁকুনি ব্যবসায়ের কৌশলটি মূলত একাধিক সূচক সমতল চলমান গড় এবং ঝাঁকুনির সূচকগুলি ব্যবহার করে একাধিক স্তরের ঝাঁকুনির চ্যানেল তৈরি করে, স্তরটি স্পষ্টভাবে বহু-হাল সংকেত তৈরি করে, এটি প্রবণতা অনুসরণকারী কৌশলগুলির মধ্যে একটি। এই কৌশলটি আরএসআই, সিসিআই, স্টোক্যাস্টিক এবং এমএ সমন্বিত সূচকগুলি ব্যবহার করে বাজারের সামগ্রিক গতি এবং ওভারবয় ওভারসেল অঞ্চলগুলি বিচার করার জন্য, এটি একটি মাল্টি ফ্যাক্টর রেটিং টাইপের কৌশলগুলির মধ্যে একটি।

কৌশল নীতি

  1. আরএসআই, সিসিআই এবং স্টোক্যাস্টিকের তিনটি সূচকের মানের ভারসাম্যযুক্ত গড় গণনা করে একটি সমন্বিত কম্পন সূচক ম্যাজিক তৈরি করুন;
  2. ম্যাজিক সূচকের উপর একাধিক সূচকীয় মসৃণকরণ করা হয়, যা দুটি কার্ভ, স্যাম্পলড ম্যাজিক ফাস্ট এবং স্যাম্পলড ম্যাজিক স্লো প্রদান করে;
  3. sampledMagicFast দ্রুত গড়, sampledMagicSlow ধীর গড়;
  4. স্যাম্পলড ম্যাজিক ফাস্টে স্যাম্পলড ম্যাজিকস্লো পরার সময় কেনার সংকেত দেওয়া হয়;
  5. স্যাম্পলড ম্যাজিক ফাস্টের নীচে স্যাম্পলড ম্যাজিকস্লো ব্যবহার করার সময় বিক্রয় সংকেত তৈরি হয়;
  6. বর্তমান প্রবণতা নির্ণয় করতে শেষ বারের স্যাম্পলড ম্যাজিক ফাস্টের পরিবর্তিত দিকটি পূর্ববর্তী বারের তুলনায় গণনা করুন;
  7. ট্রেন্ডের দিকনির্দেশনা এবং স্যাম্পলড ম্যাজিকফাস্ট এবং স্যাম্পলড ম্যাজিকস্লোর ক্রস-পরিস্থিতির উপর ভিত্তি করে প্রবেশ এবং প্রস্থান সময় নির্ধারণ করুন।

কৌশলগত সুবিধা

  1. মার্কেটের সামগ্রিক প্রবণতা বোঝার জন্য একাধিক সূচককে একত্রিত করা, সংকেতের নির্ভুলতা বাড়ানো;
  2. স্মুথড এমএ সূচকের উপর ভিত্তি করে কার্যকরভাবে সিগন্যাল-শব্দের নিমজ্জন;
  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)