ملٹی فیکٹر حکمت عملی ان کی طاقتوں کو جوڑ کر آسکیلیٹنگ ، رجحان کی پیروی اور بریک آؤٹ حکمت عملیوں کو ایک میں ضم کرتی ہے۔ اس سے مختلف مارکیٹ کے حالات میں بہتر کارکردگی حاصل کرنے کی اجازت ملتی ہے۔
ملٹی فیکٹر حکمت عملی بنیادی طور پر مندرجہ ذیل پہلوؤں پر مبنی ہے:
آسکیلیٹنگ حصہ اسٹوکاسٹک آسکیلیٹر کا استعمال خرید و فروخت کے سگنلز کی نشاندہی کرنے کے لئے کرتا ہے۔ خاص طور پر ، خرید کا سگنل اس وقت پیدا ہوتا ہے جب %K لائن اوور سیل زون سے %D لائن کو عبور کرتی ہے۔ فروخت کا سگنل اس وقت پیدا ہوتا ہے جب %K لائن اوور شاپ زون سے %D لائن سے نیچے عبور کرتی ہے۔
رجحان کے بعد کا حصہ رجحان کی سمت کا تعین کرنے کے لئے ایس ایم اے کے سنہری صلیب کا استعمال کرتا ہے۔ جب تیز ایس ایم اے سست ایس ایم اے سے اوپر عبور کرتا ہے تو خرید کا اشارہ پیدا ہوتا ہے۔ جب تیز ایس ایم اے سست ایس ایم اے سے نیچے عبور کرتا ہے تو فروخت کا اشارہ پیدا ہوتا ہے۔
بریک آؤٹ کا حصہ اس بات کی نگرانی کرتا ہے کہ آیا قیمت ایک مخصوص مدت میں سب سے زیادہ قیمت سے اوپر ٹوٹ جاتی ہے یا سب سے کم قیمت سے نیچے ٹوٹ جاتی ہے۔ جب قیمت سب سے زیادہ قیمت سے اوپر ٹوٹ جاتی ہے تو یہ خریدنے کو متحرک کرے گا ، اور جب قیمت سب سے کم قیمت سے نیچے ٹوٹ جاتی ہے تو فروخت کرے گا۔
ADX اشارے کا استعمال رجحان کی طاقت کی پیمائش کرنے کے لئے کیا جاتا ہے۔ رجحان کی تجارت کے سگنل صرف اس وقت پیدا ہوتے ہیں جب رجحان کافی مضبوط ہوتا ہے۔
سٹاپ نقصان اور لے منافع لائنز منافع بخش کو بہتر بنانے کے لئے لاگو کیا جاتا ہے.
خلاصہ میں، کثیر عوامل کی حکمت عملی مندرجہ ذیل منطق پر عمل کرتی ہے:
جب ADX ایک حد سے اوپر ہوتا ہے تو ، رجحان کو مضبوط سمجھا جاتا ہے۔ رجحان کی پیروی کرنے والی حکمت عملی اثر انداز ہوتی ہے۔ جب ADX حد سے نیچے ہوتا ہے تو ، مارکیٹ کی حد ہوتی ہے۔ صرف آسکیلیٹنگ حکمت عملی اثر انداز ہوتی ہے۔
ایک رجحان سازی مارکیٹ میں، SMA گولڈن کراس ایک طویل اندراج کو متحرک کرتا ہے اور موت کراس پوزیشنوں سے باہر نکلنے کو متحرک کرتا ہے.
ایک رینجنگ مارکیٹ میں، اسٹوکاسٹک آسکیلیٹر سے ٹریڈنگ سگنل کی پیروی کی جاتی ہے.
بریک آؤٹ کی حکمت عملی مضبوط رفتار پر عمل کرنے کے لئے دونوں مارکیٹ کے حالات میں لاگو ہوتا ہے.
سٹاپ نقصان اور منافع لینے کی لائنیں منافع میں مقفل کرنے اور نقصانات کو محدود کرنے کے لئے مقرر کی جاتی ہیں.
ملٹی فیکٹر حکمت عملی کا سب سے بڑا فائدہ یہ ہے کہ یہ مختلف حکمت عملیوں کی طاقتوں کو جوڑتا ہے اور رجحان سازی اور رینج مارکیٹوں دونوں میں اچھی کارکردگی حاصل کرتا ہے۔ اہم فوائد یہ ہیں:
یہ رجحانات کو اچھی طرح سے چلاتا ہے اور رجحانات کی مارکیٹوں میں اعلی جیت کی شرح حاصل کرتا ہے.
یہ رینج سے منسلک مارکیٹوں سے فائدہ اٹھا سکتا ہے اور پوزیشنوں میں پھنس جانے سے بچتا ہے.
اس میں مناسب طریقے سے مقرر سٹاپ نقصان اور منافع لینے کے ساتھ اعلی منافع کے عوامل ہیں.
یہ غلط سگنل سے نقصانات کو کم کرنے کے لئے رجحان کی طاقت پر غور کرتا ہے.
متعدد اشارے کا امتزاج مضبوط تجارتی سگنلز کا باعث بنتا ہے۔
بہتر کارکردگی کے لئے پیرامیٹرز کو بہتر بنایا جا سکتا ہے.
کثیر عوامل کی حکمت عملی سے وابستہ خطرات بھی ہیں:
عوامل کا غلط امتزاج متضاد تجارتی سگنل کا باعث بن سکتا ہے۔ بہترین امتزاج تلاش کرنے کے لئے وسیع پیمانے پر جانچ کی ضرورت ہے۔
متعدد پیرامیٹرز سے اصلاح کی مشکل بڑھ جاتی ہے اور کافی تاریخی اعداد و شمار کی ضرورت ہوتی ہے۔
جب رجحان الٹ جاتا ہے تو یہ پوزیشنوں کو وقت پر ختم کرنے میں ناکام ہوسکتا ہے، جس سے بڑے نقصانات ہوتے ہیں.
ADX اشارے کے اثرات میں تاخیر ہوتی ہے اور یہ رجحان کے موڑ کے مقامات کو یاد کر سکتا ہے۔
بریکآؤٹ ٹریڈنگ نقصان دہ پوزیشنوں میں پھنس جانے کا شکار ہے۔ معقول سٹاپ نقصان کی ضرورت ہے۔
خطرات کو مندرجہ ذیل طریقوں سے کم کیا جاسکتا ہے:
عوامل کے استحکام کا بیک ٹیسٹنگ اور مستحکم لوگوں کو منتخب کرنا.
زیادہ سے زیادہ پیرامیٹرز تلاش کرنے کے لئے ہیورسٹک اصلاح کے الگورتھم کا استعمال کرتے ہوئے.
زیادہ سے زیادہ ڈراؤنڈ کو کنٹرول کرنے کے لئے مناسب سٹاپ نقصان کی ترتیب.
رجحان کی تبدیلی کا پتہ لگانے کے لئے اضافی اشارے شامل کرنا۔
بریک آؤٹ ٹریڈنگ کے لئے سٹاپ نقصان کے قوانین کو بہتر بنانا۔
کثیر عوامل کی حکمت عملی میں ابھی بھی بہتری کی گنجائش ہے:
بہتر مجموعے تلاش کرنے کے لئے زیادہ سے زیادہ عوامل جیسے اتار چڑھاؤ، حجم وغیرہ کی جانچ کرنا.
فیکٹر وزن کو متحرک طور پر بہتر بنانے کے لئے مشین لرننگ کی تکنیک کا استعمال کرتے ہوئے
تیز رفتار پیرامیٹر کی اصلاح کے لئے ہیورسٹک الگورتھم کا فائدہ اٹھانا۔
مختلف انعقاد کی مدت کے تحت منافع کی جانچ.
متحرک سٹاپ نقصان کے قوانین کی تلاش کرنا۔ مثال کے طور پر، کچھ منافع حاصل کرنے کے بعد سٹاپ نقصان کو بڑھانا۔
سگنل کے معیار کو بہتر بنانے کے لیے زیادہ فلٹرز جیسے حجم کے چوٹیوں کو شامل کرنا۔
ADX پیرامیٹرز کو بہتر بنانا یا زیادہ اعلی درجے کی رجحان کا پتہ لگانے والے اشارے کا استعمال کرنا۔
ملٹی فیکٹر حکمت عملی میں رجحان ، اوسط الٹ ، اور بریک آؤٹ جیسے متعدد تجارتی منطق کو یکجا کیا گیا ہے۔ یہ رجحان اور رینج مارکیٹوں دونوں میں اچھی کارکردگی حاصل کرتا ہے۔ سنگل فیکٹر حکمت عملی کے مقابلے میں ، یہ زیادہ مستحکم واپسی فراہم کرتا ہے اور اپ گریڈ کے لئے بہت زیادہ صلاحیت رکھتا ہے۔ تاہم ، پیرامیٹر کی اصلاح مشکل ہوسکتی ہے اور اس کے لئے کافی تاریخی اعداد و شمار کی ضرورت ہوتی ہے۔ مجموعی طور پر ، ملٹی فیکٹر حکمت عملی ایک بہت ہی موثر الگورتھمک تجارتی تکنیک ہے جس کی مزید تحقیق اور اصلاح کے قابل ہے۔
/*backtest start: 2023-09-30 00:00:00 end: 2023-10-30 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // strategy("Strategy_1", shorttitle="Strategy1",overlay=true ,pyramiding = 12, initial_capital=25000, currency='EUR', commission_type = strategy.commission.cash_per_order, commission_value = 3, default_qty_type = strategy.percent_of_equity, default_qty_value = 20) // Revision: 1 // Author: Jonas // === INPUT === // > BACKTEST RANGE < FromMonth = input(defval=1, title="From Month", minval=1, maxval=12) FromDay = input(defval=1, title="From Day", minval=1, maxval=31) FromYear = input(defval=2017, title="From Year", minval=2010) ToMonth = input(defval=1, title="To Month", minval=1, maxval=12) ToDay = input(defval=1, title="To Day", minval=1, maxval=31) ToYear = input(defval=9999, title="To Year", minval=2010) // > STRATEGY SETTINGS < bolOS = input(defval = false, type=input.bool, title="Oscillating Strategy") bolTS = input(defval = true, type=input.bool, title="Trend Strategy") bolBO = input(defval = false, type=input.bool, title="Breakout Strategy") strStrategy = input(defval = "Long", type=input.string, title="Trade Strategy",options = ["Long", "Short","Long & Short"]) flStopLoss = input(defval = 2.0, title="Stop Loss %", type=input.float)/100 flTakeProfit = input(defval = 4.0, title="Take Profit %", type=input.float)/100 // > SMA < fastMA = input(defval=8, type=input.integer, title="FastMA length", minval=1, step=1) slowMA = input(defval=21, type=input.integer, title="SlowMA length", minval=1, step=1) // > ADX < adx_len = input(defval=10, type=input.integer, title="ADX length", minval=1, step=1) adx_trend = input(defval=30, type=input.integer, title="ADX Tr", minval=1, step=1) adx_choppy = adx_trend adx_limit = adx_trend // > TRENDSCORE < ts_fromIndex = input(title="From", type=input.integer, minval=1, defval=10) ts_toIndex = input(title="To", type=input.integer, minval=1, defval=14) ts_src = input(title="Source", type=input.source, defval=close) // > Oscillator < stoch_length = 14 stoch_OverBought = 75 stoch_OverSold = 25 stoch_smoothK = 3 stoch_smoothD = 3 // === BACK TEST RANGE FUNCTION === window_start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window window_finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => // create function "within window of time" time >= window_start and time <= window_finish ? true : false //plot(stop_level_Long, title="TEST",color=color.red, style=plot.style_linebr, linewidth=2) //plot(take_level_Long, color=color.green, style=plot.style_linebr, linewidth=2) // === ADX === adx_up = change(high) adx_down = -change(low) adx_trur = rma(tr, adx_len) adx_plus = fixnan(100 * rma(adx_up > adx_down and adx_up > 0 ? adx_up : 0, adx_len) / adx_trur) adx_minus = fixnan(100 * rma(adx_down > adx_up and adx_down > 0 ? adx_down : 0, adx_len) / adx_trur) adx_sum = adx_plus + adx_minus ADX = 100 * rma(abs(adx_plus - adx_minus) / (adx_sum == 0 ? 1 : adx_sum), adx_len) //=== TRENDSCORE === trendscore(ts_src, ts_fromIndex, ts_toIndex) => ts_sum = 0.0 for i = ts_fromIndex to ts_toIndex ts_sum := ts_sum + (ts_src >= nz(ts_src[i]) ? 1 : -1) ts_sum intTS = trendscore(ts_src, ts_fromIndex, ts_toIndex) // Long if TrendDirection = 1, Short if TrendDirection = -1; Indifferent if TrendDirection = 0 intTrendDirection = (intTS > (ts_toIndex-ts_fromIndex)) ? 1 : (intTS < (ts_fromIndex-ts_toIndex)) ? -1 : 0 // > TREND CONDITION < adx_growing = ADX > highest(ADX[1],3) intTrend = ((ADX >= adx_limit) and (ADX[1] >= adx_limit) and adx_growing) ? intTrendDirection : 0 // === ATR === ATR = sma(tr,10) ATR_100 = ATR /abs(high - low) // === STOCHASTICS === stoch_k = sma(stoch(close, high, low, stoch_length), stoch_smoothK) stoch_d = sma(stoch_k, stoch_smoothD) // === FILTER & CONDITIONS === // > STOCHASTICS < bolFilter_OS1 = close[1] > hl2[1] bolSigOsc_long_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossover(stoch_d,stoch_OverSold) and stoch_k > stoch_d) ? true:false bolSigOsc_short_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossunder(stoch_d,stoch_OverBought) and stoch_k < stoch_d) ? true:false bolLongOpenOS = bolSigOsc_long_1 and bolFilter_OS1 bolLongCloseOS = bolSigOsc_short_1 bolShortOpenOS = bolSigOsc_short_1 and bolFilter_OS1 bolShortCloseOS = bolSigOsc_long_1 // > TREND < bolFilter_TS1 = close[1] > hl2[1] and open[1] < hl2[1] bolFilter_TS2 = sma(close,50)>sma(close,50)[10] bolFilter_TS3 = close[1] < hl2[1] and open[1] > hl2[1] bolSigTrendLO1 = sma(close, fastMA) > sma(close, slowMA) bolSigTrendLO2 = close > sma(close,fastMA) bolSigTrendLO3 = bolSigTrendLO1 and bolSigTrendLO2 bolSigTrendLC1 = sma(close, fastMA) < sma(close, slowMA) bolSigTrendLC2 = close < sma(close, fastMA) bolSigTrendLC3 = bolSigTrendLC1 and bolSigTrendLC2 bolSigTrendSO1 = bolSigTrendLC3 bolSigTrendSC1 = bolSigTrendLO1 bolLongOpenTS = bolSigTrendLO3 and bolFilter_TS1 bolLongCloseTS = bolSigTrendLC3 and bolFilter_TS3 bolShortOpenTS = bolSigTrendSO1 and bolFilter_TS3 bolShortCloseTS = bolLongOpenTS and bolFilter_TS1 plot(sma(close, fastMA), title='FastMA', color=color.green, linewidth=2, style=plot.style_line) // plot FastMA plot(sma(close, slowMA), title='SlowMA', color=color.red, linewidth=2, style=plot.style_line) // plot SlowMA // > BREAKOUT < flFilter_BS1 = 0.5 * stdev(close,slowMA)[1] bolFilter_BS2 = volume > sma(volume,slowMA)*1.25 bolSigBreakoutLO1 = close > (highestbars(high,slowMA)[1] + flFilter_BS1) bolSigBreakoutLC1 = barssince(bolSigBreakoutLO1)==5 bolSigBreakoutSO1 = close < lowestbars(low,slowMA)[1] - flFilter_BS1 bolSigBreakoutSC1 = barssince(bolSigBreakoutSO1)==5 bolLongOpenBO = bolSigBreakoutLO1 and bolFilter_BS2 bolLongCloseBO = bolSigBreakoutLC1 bolShortOpenBO = bolSigBreakoutSO1 and bolFilter_BS2 bolShortCloseBO = bolSigBreakoutSC1 //=== STRATEGIES ENTRIES & EXITS === // > STOPS & LIMITS < stop_level_Long = strategy.position_avg_price * (1 - flStopLoss) take_level_Long = strategy.position_avg_price * (1 + flTakeProfit) stop_level_Short = strategy.position_avg_price * (1 + flStopLoss) take_level_Short = strategy.position_avg_price * (1 - flTakeProfit) // > ENTRIES / CLOSES / EXITS < if window() //only in backtest-window if (bolOS == true) if (intTrend == 0) if(strStrategy == "Long" or strStrategy == "Long & Short") strategy.entry("Lng Osc", strategy.long, when=bolLongOpenOS) // buy long when "within window of time" AND crossover if(strStrategy == "Short" or strStrategy == "Long & Short") strategy.entry("Short Osc", strategy.short, when=bolShortOpenOS) strategy.close("Lng Osc", when=(bolLongCloseOS)) //strategy.exit("Exit L OS/STD", "Lng Osc", stop = strategy.position_avg_price - 2*stdev(close,10)) strategy.exit("Exit L OS/%", "Lng Osc", stop=stop_level_Long) strategy.close("Short Osc", when=(bolShortCloseOS)) //strategy.exit("Exit S OS/STD", "Short Osc", stop = strategy.position_avg_price + 2*stdev(strategy.position_avg_price,10)) strategy.exit("Exit S OS/%", "Short Osc", stop=stop_level_Short) if (bolTS == true) if (not(intTrend == 0)) if((strStrategy == "Long") or (strStrategy == "Long & Short")) strategy.entry("Lng TD", strategy.long, when=bolLongOpenTS) // buy long when "within window of time" AND crossover if((strStrategy == "Short") or (strStrategy == "Long & Short")) strategy.entry("Short TD", strategy.short, when=(bolShortOpenTS and bolTS)) // buy long when "within window of time" AND crossover strategy.exit("Exit L TD", "Lng TD", stop=stop_level_Long) strategy.close("Lng TD", when=bolLongCloseTS) strategy.exit("Exit S TD", "Short TD", stop=stop_level_Short) strategy.close("Short TD", when=bolShortCloseTS) if (bolBO == true) if((strStrategy == "Long") or (strStrategy == "Long & Short")) strategy.entry("Lng BO", strategy.long, when=bolLongOpenBO) // buy long when "within window of time" AND crossover strategy.close("Lng BO", when=bolLongCloseBO) //strategy.exit("Exit L BO/STD", "Lng BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10)) strategy.exit("Exit L BO/2.5%", "Lng BO", stop=stop_level_Long) if((strStrategy == "Short") or (strStrategy == "Long & Short")) strategy.entry("Short BO", strategy.short, when=bolShortOpenBO) // buy long when "within window of time" AND crossover strategy.close("Short BO", when=bolShortCloseBO) //strategy.exit("Exit S BO/STD", "Short BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10)) strategy.exit("Exit S BO/%", "Short BO", stop=stop_level_Short)