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

چلتی اوسط کراس اوور حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-10-27 16:19:00
ٹیگز:

img

جائزہ

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

حکمت عملی منطق

اس حکمت عملی میں 3 حرکت پذیر اوسط استعمال کیے جاتے ہیں:

  • ای ایم اے1: ایک مختصر مدت کی ایکسپونینشل چلتی اوسط ، جو فاسٹ لائن کی حیثیت سے کام کرتی ہے
  • ایس ایم اے1: ایک لمبی مدت کا سادہ چلتا ہوا اوسط ، جو سست لائن کی حیثیت سے کام کرتا ہے
  • ایس ایم اے2: ایک اور بھی طویل مدت کا سادہ چلتا ہوا اوسط ، جو رجحان کی سمت کا تعین کرتا ہے

حکمت عملی EMA1، SMA1 اور SMA2 کے درمیان تعلقات کی بنیاد پر رجحان کا جائزہ لیتی ہے:

  • اپ ٹرینڈ: EMA1 > SMA1 > SMA2
  • نیچے کا رجحان: EMA1 < SMA1 < SMA2

داخلہ سگنل:

  • لمبا اندراج: جب تیز رفتار لائن سست لائن کے اوپر سے گزرتی ہے
  • مختصر اندراج: جب تیز رفتار لائن سست لائن سے نیچے گزرتی ہے

باہر نکلنے کا اشارہ:

  • طویل بندش: جب تیز لائن سست لائن سے نیچے گزرتی ہے
  • مختصر بندش: جب تیز رفتار لائن سست لائن کے اوپر سے گزرتی ہے

حکمت عملی داخلہ اور باہر نکلنے کے لئے اپنی مرضی کے مطابق چلتی اوسط کے ساتھ، متعدد پیرامیٹر ترتیب فراہم کرتا ہے.

فوائد کا تجزیہ

اس حکمت عملی کے فوائد:

  1. رفتار پکڑتا ہے: رجحان کی تبدیلیوں کا پتہ لگاتا ہے، رفتار کی حکمت عملی
  2. لچکدار ترتیب: متعدد MA انتخاب فراہم کرتا ہے، لچکدار پیرامیٹر ٹیوننگ
  3. رجحان فلٹرنگ: رجحان کا تعین کرنے کے لئے طویل مدتی ایم اے کا استعمال کرتا ہے ، مخالف رجحان کی تجارت سے گریز کرتا ہے
  4. خطرے کا انتظام: اسٹاپ نقصان اور منافع لینے کے کنٹرول کو ترتیب دینے کے قابل

خطرے کا تجزیہ

اس حکمت عملی کے خطرات:

  1. وِپساؤز: بریک آؤٹ سے پہلے طویل عرصے تک چھیڑنے سے متعدد جھوٹے سگنل پیدا ہو سکتے ہیں۔
  2. ایم اے پیرامیٹرز کے لئے حساس: ایم اے کے ادوار کی غلط ترتیب سے حساسیت یا سست روی پیدا ہوسکتی ہے۔
  3. تاخیر: حرکت پذیر اوسط کی فطری تاخیر کی نوعیت ، بہترین انٹری ٹائمنگ سے محروم ہوسکتی ہے
  4. کوئی بنیادی اصول نہیں: خالصتاً تکنیکی اشارے پر مبنی، بنیادی اصولوں پر کوئی غور نہیں

Whipsaw خطرے کو MA ادوار کو ایڈجسٹ کرکے کم کیا جاسکتا ہے۔ پیرامیٹر حساسیت کو اصلاح کے ذریعے حل کیا جاسکتا ہے۔ دیگر اہم اشارے کو شامل کرکے تاخیر کا خطرہ کم کیا جاسکتا ہے۔

اصلاح کی ہدایات

ممکنہ اصلاحات:

  1. سگنل کے معیار کو بہتر بنانے کے لئے RSI، بولنگر بینڈ جیسے دیگر تکنیکی فلٹرز شامل کریں
  2. زیادہ سے زیادہ پیرامیٹرز تلاش کرنے کے لئے ایم اے کی مدت کو بہتر بنائیں
  3. رجحان اور سگنل کی وشوسنییتا کا اندازہ کرنے کے لئے مشین لرننگ ماڈلز کو شامل کریں
  4. کم حجم کے حالات میں جھوٹے بریک آؤٹ سے بچنے کے لئے تجارتی حجم پر غور کریں
  5. معاشی سائیکلوں کے خلاف تجارت سے بچنے کے لئے بنیادی عوامل کو شامل کریں

نتیجہ

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


/*backtest
start: 2023-09-26 00:00:00
end: 2023-10-26 00:00: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/
// © Decam9

//@version=5
strategy(title = "Moving Average Crossover", shorttitle = "MA Crossover Strategy", overlay=true,
     initial_capital = 100000,default_qty_type = strategy.percent_of_equity, default_qty_value = 10)

//Moving Average Inputs
EMA1 = input.int(title="Fast EMA", group = "Moving Averages:", 
     inline = "EMAs", defval=5, minval = 1)
isDynamicEMA = input.bool(title = "Dynamic Exponential Moving Average?", defval = true,
     inline = "EMAs", group = "Moving Averages:", tooltip = "Changes the source of the MA based on trend")

SMA1 = input.int(title = "Slow SMA", group = "Moving Averages:",
     inline = "SMAs", defval = 10, minval = 1)
isDynamicSMA = input.bool(title = "Dynamic Simple Moving Average?", defval = false,
     inline = "SMAs", group = "Moving Averages:", tooltip = "Changes the source of the MA based on trend")

SMA2 = input.int(title="Trend Determining SMA", group = "Moving Averages:",
     inline = "MAs", defval=13, minval = 1)

//Moving Averages
Trend = ta.sma(close, SMA2)
Fast = ta.ema(isDynamicEMA ? (close > Trend ? low : high) : close, EMA1)
Slow = ta.sma(isDynamicSMA ? (close > Trend ? low : high) : close, SMA1)

//Allowed Entries
islong = input.bool(title = "Long", group = "Allowed Entries:",
     inline = "Entries",defval = true)
isshort = input.bool(title = "Short", group = "Allowed Entries:",
     inline = "Entries", defval= true)

//Entry Long Conditions
buycond = input.string(title="Buy when", group = "Entry Conditions:", 
     inline = "Conditions",defval="Fast-Slow Crossing", 
     options=["Fast-Slow Crossing", "Fast-Trend Crossing","Slow-Trend Crossing"])
     
intrendbuy = input.bool(title = "In trend", defval = true, group = "Entry Conditions:",
     inline = "Conditions", tooltip = "In trend if price is above SMA 2")

//Entry Short Conditions
sellcond = input.string(title="Sell when", group = "Entry Conditions:", 
     inline = "Conditions2",defval="Fast-Slow Crossing", 
     options=["Fast-Slow Crossing", "Fast-Trend Crossing","Slow-Trend Crossing"])
     
intrendsell = input.bool(title = "In trend",defval = true, group = "Entry Conditions:",
     inline = "Conditions2", tooltip = "In trend if price is below SMA 2?")

//Exit Long Conditions
closebuy = input.string(title="Close long when", group = "Exit Conditions:", 
     defval="Fast-Slow Crossing", options=["Fast-Slow Crossing", "Fast-Trend Crossing","Slow-Trend Crossing"])

//Exit Short Conditions
closeshort = input.string(title="Close short when", group = "Exit Conditions:", 
     defval="Fast-Slow Crossing", options=["Fast-Slow Crossing", "Fast-Trend Crossing","Slow-Trend Crossing"])
     

//Filters
filterlong =input.bool(title = "Long Entries", inline = 'linefilt', group = 'Apply Filters to', 
     defval = true)
filtershort =input.bool(title = "Short Entries", inline = 'linefilt', group = 'Apply Filters to', 
     defval = true)
filterend =input.bool(title = "Exits", inline = 'linefilt', group = 'Apply Filters to', 
     defval = true)
usevol =input.bool(title = "", inline = 'linefiltvol', group = 'Relative Volume Filter:', 
     defval = false)
rvol = input.int(title = "Volume >", inline = 'linefiltvol', group = 'Relative Volume Filter:', 
     defval = 1)
len_vol = input.int(title = "Avg. Volume Over Period", inline = 'linefiltvol', group = 'Relative Volume Filter:', 
     defval = 30, minval = 1,
     tooltip="The current volume must be greater than N times the M-period average volume.")
useatr =input.bool(title = "", inline = 'linefiltatr', group = 'Volatility Filter:', 
     defval = false)
len_atr1 = input.int(title = "ATR", inline = 'linefiltatr', group = 'Volatility Filter:', 
     defval = 5, minval = 1)
len_atr2 = input.int(title = "> ATR", inline = 'linefiltatr', group = 'Volatility Filter:', 
     defval = 30, minval = 1,
     tooltip="The N-period ATR must be greater than the M-period ATR.")
usersi =input.bool(title = "", inline = 'linersi', group = 'Overbought/Oversold Filter:', 
     defval = false)
rsitrhs1 = input.int(title = "", inline = 'linersi', group = 'Overbought/Oversold Filter:', 
     defval = 0, minval=0, maxval=100)
rsitrhs2 = input.int(title = "< RSI (14) <", inline = 'linersi', group = 'Overbought/Oversold Filter:', 
     defval = 100, minval=0, maxval=100,
     tooltip="RSI(14) must be in the range between N and M.")
issl =  input.bool(title = "SL", inline = 'linesl1', group = 'Stop Loss / Take Profit:', 
     defval = false)
slpercent =  input.float(title = ", %", inline = 'linesl1', group = 'Stop Loss / Take Profit:', 
     defval = 10, minval=0.0)
istrailing =  input.bool(title = "Trailing", inline = 'linesl1', group = 'Stop Loss / Take Profit:', 
     defval = false)
istp =  input.bool(title = "TP", inline = 'linetp1', group = 'Stop Loss / Take Profit:', 
     defval = false)
tppercent =  input.float(title = ", %", inline = 'linetp1', group = 'Stop Loss / Take Profit:', 
     defval = 20)
     
//Conditions for Crossing
fscrossup = ta.crossover(Fast,Slow)
fscrossdw = ta.crossunder(Fast,Slow)
ftcrossup = ta.crossover(Fast,Trend)
ftcrossdw = ta.crossunder(Fast,Trend)
stcrossup = ta.crossover(Slow,Trend)
stcrossdw = ta.crossunder(Slow,Trend)

//Defining in trend
uptrend = Fast >= Slow and Slow >= Trend
downtrend = Fast <= Slow and Slow <= Trend
justCrossed = ta.cross(Fast,Slow) or ta.cross(Slow,Trend)


//Entry Signals
crosslong = if intrendbuy
    (buycond =="Fast-Slow Crossing" and uptrend ? fscrossup:(buycond =="Fast-Trend Crossing" and uptrend ? ftcrossup:(buycond == "Slow-Trend Crossing" and uptrend ? stcrossup : na))) 
else
    (buycond =="Fast-Slow Crossing"?fscrossup:(buycond=="Fast-Trend Crossing"?ftcrossup:stcrossup))

crossshort = if intrendsell
    (sellcond =="Fast-Slow Crossing" and downtrend ? fscrossdw:(sellcond =="Fast-Trend Crossing" and downtrend ? ftcrossdw:(sellcond == "Slow-Trend Crossing" and downtrend ? stcrossdw : na))) 
else
    (sellcond =="Fast-Slow Crossing"?fscrossdw:(buycond=="Fast-Trend Crossing"?ftcrossdw:stcrossdw))
crossexitlong = (closebuy =="Fast-Slow Crossing"?fscrossdw:(closebuy=="Fast-Trend Crossing"?ftcrossdw:stcrossdw))
crossexitshort = (closeshort =="Fast-Slow Crossing"?fscrossup:(closeshort=="Fast-Trend Crossing"?ftcrossup:stcrossup))


// Filters
rsifilter = usersi?(ta.rsi(close,14) > rsitrhs1 and ta.rsi(close,14) < rsitrhs2):true
volatilityfilter = useatr?(ta.atr(len_atr1) > ta.atr(len_atr2)):true
volumefilter = usevol?(volume > rvol*ta.sma(volume,len_vol)):true
totalfilter = volatilityfilter and volumefilter and rsifilter

//Filtered signals
golong  = crosslong  and islong  and (filterlong?totalfilter:true) 
goshort = crossshort and isshort and (filtershort?totalfilter:true)
endlong  = crossexitlong and (filterend?totalfilter:true)
endshort = crossexitshort and (filterend?totalfilter:true)

// Entry price and TP
startprice = ta.valuewhen(condition=golong or goshort, source=close, occurrence=0)
pm = golong?1:goshort?-1:1/math.sign(strategy.position_size)
takeprofit = startprice*(1+pm*tppercent*0.01)
// fixed stop loss
stoploss = startprice * (1-pm*slpercent*0.01)
// trailing stop loss
if istrailing and strategy.position_size>0
    stoploss := math.max(close*(1 - slpercent*0.01),stoploss[1])
else if istrailing and strategy.position_size<0
    stoploss := math.min(close*(1 + slpercent*0.01),stoploss[1])
    
if golong and islong
    strategy.entry("long",   strategy.long )
if goshort and isshort
    strategy.entry("short",  strategy.short)
if endlong
    strategy.close("long")
if endshort
    strategy.close("short")

// Exit via SL or TP
strategy.exit(id="sl/tp long", from_entry="long", stop=issl?stoploss:na, 
              limit=istp?takeprofit:na)
strategy.exit(id="sl/tp short",from_entry="short",stop=issl?stoploss:na, 
              limit=istp?takeprofit:na)



مزید