وسائل لوڈ ہو رہے ہیں... لوڈنگ...

رینبو اوسیلیٹر ٹریڈنگ حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2024-02-23 14:57:43
ٹیگز:

img

جائزہ

رینبو آسکیلیٹر ٹریڈنگ حکمت عملی بنیادی طور پر ایک سے زیادہ ہموار حرکت پذیر اوسط اور آسکیلیشن اشارے استعمال کرتی ہے تاکہ ایک کثیر پرت آسکیلیشن چینل بنایا جاسکے اور واضح لانگ / شارٹ سگنل پیدا کیے جاسکے۔ یہ رجحان کی پیروی کرنے والی حکمت عملی کی قسم سے تعلق رکھتا ہے۔ یہ حکمت عملی مجموعی مارکیٹ کے رجحان اور زیادہ خرید / فروخت والے علاقوں کا تعین کرنے کے لئے آر ایس آئی ، سی سی آئی ، اسٹوکاسٹک اور ایم اے جامع اشارے کو یکجا کرتی ہے۔ یہ ایک کثیر عنصر کی درجہ بندی کی حکمت عملی ہے۔

اصول

  1. آر ایس آئی، سی سی آئی اور اسٹوکاسٹک کا وزن شدہ اوسط حساب کریں تاکہ جادو نامی ایک مشترکہ نوسٹالیشن اشارے کی تعمیر کی جاسکے۔
  2. دو لائنوں sampledMagicFast اور sampledMagicSlow کہا جاتا پیدا کرنے کے لئے کئی بار جادو کرنے کے exponential smoothing کا اطلاق؛
  3. sampledMagicFast تیز EMA لائن کی نمائندگی کرتا ہے، sampledMagicSlow سست EMA لائن کی نمائندگی کرتا ہے؛
  4. ایک خرید سگنل پیدا کیا جاتا ہے جب sampleledMagicFast sampleledMagicSlow کے اوپر عبور کرتا ہے۔
  5. ایک فروخت سگنل پیدا ہوتا ہے جب sampleledMagicFast sampleledMagicSlow کے نیچے کراس کرتا ہے؛
  6. موجودہ رجحان کا تعین کرنے کے لئے پچھلے بار کے سلسلے میں آخری بار کی سمت کا حساب لگائیں۔
  7. داخلہ اور باہر نکلنے کے پوائنٹس کا تعین نمونہ ماجک فاسٹ اور نمونہ ماجک سلو کے درمیان رجحان کی سمت اور کراسنگ کی صورت حال کی بنیاد پر کیا جاتا ہے۔

فوائد

  1. مجموعی طور پر مارکیٹ کے رجحان کا تعین کرنے کے لئے متعدد اشارے کا امتزاج سگنل کی درستگی کو بہتر بناتا ہے۔
  2. ہموار MA مؤثر طریقے سے شور کو فلٹر کرتا ہے۔
  3. ایک سے زیادہ پرتوں کے آکسیلیشن سگنل آپریشن کی واضح رہنمائی فراہم کرتے ہیں۔
  4. ٹرینڈ فلٹر کو فعال / غیر فعال کرکے ٹرینڈ کی پیروی یا اوسط ریورس کے لئے تشکیل دیا جاسکتا ہے۔
  5. لچک کے لئے اپنی مرضی کے مطابق overbought / oversold طاقت.

خطرات

  1. زیادہ ہموار منحنی خطوط بہترین انٹری پوائنٹس کی کمی کا سبب بن سکتے ہیں۔
  2. غیر مناسب حد سے زیادہ خرید/فروخت کے علاقے کی ترتیب سے پوزیشن کو زیادہ دیر تک بند رکھا جا سکتا ہے۔
  3. ریٹنگ ماڈل میں کچھ عوامل کی ناکامی سگنل کو کمزور کر سکتی ہے۔

حل:

  1. مناسب ہموار کرنے کی حد کے لئے پیرامیٹرز کو بہتر بنائیں؛
  2. فلیٹ پوزیشن میں وقت کو کم کرنے کے لئے overbought / oversold علاقے کی طاقت کو ایڈجسٹ کریں؛
  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)


مزید