یہ ایک تجرباتی مقداری تجارتی حکمت عملی ہے جو تجارتی سگنل پیدا کرنے کے لئے حرکت پذیر اوسط اشارے اور کے این این مشین لرننگ الگورتھم کو جوڑتی ہے۔ یہ رجحان کی سمت کا تعین کرنے کے لئے مختلف ادوار کے ساتھ دو وی ڈبلیو ایم اے لائنوں کے کراس اوورز کا استعمال کرتی ہے ، اور سگنلز کی وشوسنییتا کو بہتر بنانے کے لئے کے این این الگورتھم کے ذریعہ سگنلز کو فلٹر کرنے کے لئے ایم ایف آئی اور اے ڈی ایکس اشارے استعمال کرتی ہے۔
اس حکمت عملی کے بنیادی اشارے دو VWMA لائنیں ہیں جن کے مختلف پیرامیٹرز ہیں ، یعنی فاسٹ لائن اور سست لائن۔ جب فاسٹ لائن سست لائن سے اوپر عبور کرتی ہے تو ، خرید کا اشارہ پیدا ہوتا ہے۔ جب فاسٹ لائن سست لائن سے نیچے عبور کرتی ہے تو ، فروخت کا اشارہ پیدا ہوتا ہے۔ اس کے علاوہ ، اس حکمت عملی میں دو معاون اشارے ، ایم ایف آئی اور اے ڈی ایکس متعارف کرایا گیا ہے ، تاکہ موجودہ مارکیٹ کے حالات میں موجودہ سگنل کی وشوسنییتا کا اندازہ کیا جاسکے۔
kNN الگورتھم کے پیچھے خیال یہ ہے کہ نئے اعداد و شمار کو تاریخی اعداد و شمار کے ساتھ موازنہ کیا جائے تاکہ k سب سے زیادہ مماثل تاریخی اعداد و شمار کے مطابق نتائج کا تعین کیا جاسکے ، اور ان k تاریخی نتائج کی اکثریت کی بنیاد پر درجہ بندی کی جاسکے۔ اس حکمت عملی میں MFI اور ADX کو kNN الگورتھم کے دو ان پٹ پیرامیٹرز کے طور پر استعمال کیا جاتا ہے تاکہ اشارے کے اس مجموعے کے تحت تاریخی قیمت کی نقل و حرکت (اعلی رجحان یا نیچے کا رجحان) کا تعین کیا جاسکے ، اس طرح سگنل کے معیار کو بہتر بنانے کے لئے موجودہ سگنل کو فلٹر کیا جاسکے۔
تخفیف:
اس حکمت عملی کو بہتر بنانے کے لیے کافی گنجائش موجود ہے:
مزید اشارے اور مشین لرننگ الگورتھم متعارف کرانے سے حکمت عملی کے استحکام اور منافع میں مزید بہتری آسکتی ہے۔
یہ VWMA اشارے اور kNN مشین لرننگ الگورتھم پر مبنی ایک تجرباتی مقداری تجارتی حکمت عملی ہے۔ اس میں مشین لرننگ کے ذریعہ سگنلز کو فلٹر کرتے ہوئے مضبوط رجحان کی پیروی کرنے کی صلاحیت کا فائدہ ہے۔ بہتر نتائج کے ل more اس حکمت عملی میں مزید خصوصیات اور اصلاح کے الگورتھم متعارف کرانے سے توسیع کے لئے بہت زیادہ گنجائش ہے۔ لیکن ایک نئی حکمت عملی کے طور پر ایسے خطرات بھی ہیں جن کی مزید تصدیق اور بہتری کی ضرورت ہے۔ مجموعی طور پر اس حکمت عملی میں بڑی جدت طرازی کی صلاحیت ہے۔
/*backtest start: 2023-11-21 00:00:00 end: 2023-12-21 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/ // © lastguru //@version=4 strategy(title="VWMA with kNN Machine Learning: MFI/ADX", shorttitle="VWMA + kNN: MFI/ADX", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100) ///////// // kNN // ///////// // Define storage arrays for: parameter 1, parameter 2, price, result (up = 1; down = -1) var knn1 = array.new_float(1, 0) var knn2 = array.new_float(1, 0) var knnp = array.new_float(1, 0) var knnr = array.new_float(1, 0) // Store the previous trade; buffer the current one until results are in _knnStore (p1, p2, src) => var prevp1 = 0.0 var prevp2 = 0.0 var prevsrc = 0.0 array.push(knn1, prevp1) array.push(knn2, prevp2) array.push(knnp, prevsrc) array.push(knnr, src >= prevsrc ? 1 : -1) prevp1 := p1 prevp2 := p2 prevsrc := src // Sort two arrays (MUST be of the same size) based on the first. // In other words, when an element in the first is moved, the element in the second moves as well. _knnGet(arr1, arr2, k) => sarr = array.copy(arr1) array.sort(sarr) ss = array.slice(sarr, 0, min(k, array.size(sarr))) m = array.max(ss) out = array.new_float(0) for i = 0 to array.size(arr1) - 1 if (array.get(arr1, i) <= m) array.push(out, array.get(arr2, i)) out // Create a distance array from the two given parameters _knnDistance(p1, p2) => dist = array.new_float(0) n = array.size(knn1) - 1 for i = 0 to n d = sqrt( pow(p1 - array.get(knn1, i), 2) + pow(p2 - array.get(knn2, i), 2) ) array.push(dist, d) dist // Make a prediction, finding k nearest neighbours _knn(p1, p2, k) => slice = _knnGet(_knnDistance(p1, p2), array.copy(knnr), k) knn = array.sum(slice) //////////// // Inputs // //////////// SRC = input(title="Source", type=input.source, defval=open) FAST = input(title="Fast Length", type=input.integer, defval=13) SLOW = input(title="Slow Length", type=input.integer, defval=19) FILTER = input(title="Filter Length", type=input.integer, defval=13) SMOOTH = input(title="Filter Smoothing", type=input.integer, defval=6) KNN = input(title="kNN nearest neighbors (k)", type=input.integer, defval=23) BACKGROUND = input(false,title = "Draw background") //////// // MA // //////// fastMA = vwma(SRC, FAST) slowMA = vwma(SRC, SLOW) ///////// // DMI // ///////// // Wilder's Smoothing (Running Moving Average) _rma(src, length) => out = 0.0 out := ((length - 1) * nz(out[1]) + src) / length // DMI (Directional Movement Index) _dmi (len, smooth) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) trur = _rma(tr, len) plus = fixnan(100 * _rma(plusDM, len) / trur) minus = fixnan(100 * _rma(minusDM, len) / trur) sum = plus + minus adx = 100 * _rma(abs(plus - minus) / (sum == 0 ? 1 : sum), smooth) [plus, minus, adx] [diplus, diminus, adx] = _dmi(FILTER, SMOOTH) ///////// // MFI // ///////// // common RSI function _rsi(upper, lower) => if lower == 0 100 if upper == 0 0 100.0 - (100.0 / (1.0 + upper / lower)) mfiUp = sum(volume * (change(ohlc4) <= 0 ? 0 : ohlc4), FILTER) mfiDown = sum(volume * (change(ohlc4) >= 0 ? 0 : ohlc4), FILTER) mfi = _rsi(mfiUp, mfiDown) //////////// // Filter // //////////// longCondition = crossover(fastMA, slowMA) shortCondition = crossunder(fastMA, slowMA) if (longCondition or shortCondition) _knnStore(adx, mfi, SRC) filter = _knn(adx, mfi, KNN) ///////////// // Actions // ///////////// bgcolor(BACKGROUND ? filter >= 0 ? color.green : color.red : na) plot(fastMA, color=color.red) plot(slowMA, color=color.green) if (longCondition and filter >= 0) strategy.entry("Long", strategy.long) if (shortCondition and filter < 0) strategy.entry("Short", strategy.short)