VWMA اور MFI/ADX پر مبنی kNN مشین لرننگ مقداری تجارتی حکمت عملی


تخلیق کی تاریخ: 2023-12-22 14:13:27 آخر میں ترمیم کریں: 2023-12-22 14:13:27
کاپی: 0 کلکس کی تعداد: 762
1
پر توجہ دیں
1623
پیروکار

VWMA اور MFI/ADX پر مبنی kNN مشین لرننگ مقداری تجارتی حکمت عملی

جائزہ

یہ حکمت عملی ایک تجرباتی مقداری ٹریڈنگ حکمت عملی ہے جو ٹریڈنگ سگنل پیدا کرنے کے لئے مشین لرننگ کے KNN الگورتھم کے ساتھ ایک متحرک اوسط اشارے کو جوڑتی ہے۔ یہ حکمت عملی رجحان کی سمت کا تعین کرنے کے لئے دو مختلف ادوار کی VWMA اوسط کی کراسنگ کا استعمال کرتی ہے ، اور ایم ایف آئی اور اے ڈی ایکس دونوں اشارے کے ساتھ مل کر اس سگنل کو بہتر بنانے کے لئے KNN الگورتھم کے ذریعہ سگنل کو فلٹر کرتی ہے۔

حکمت عملی کا اصول

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

kNN الگورتھم کا خیال یہ ہے کہ نئے اعداد و شمار کو تاریخی اعداد و شمار کے ساتھ موازنہ کیا جائے ، جس کے نتیجے میں قریب ترین k تاریخی اعداد و شمار کے مطابق نتائج کا تعین کیا جائے ، اور اس کے مطابق اکثریت کے ووٹ کے مطابق درجہ بندی کی جائے۔ اس حکمت عملی میں MFI اور ADX کو kNN الگورتھم کے دو ان پٹ پیرامیٹرز کے طور پر استعمال کیا گیا ہے ، جس کا فیصلہ کیا گیا ہے کہ ان دونوں اشارے کے امتزاج کے وقت تاریخی قیمتوں میں کیا ہوا ہے (بڑھنے یا گرنے) ، تاکہ موجودہ سگنل کو فلٹر کیا جاسکے ، سگنل کے معیار کو بہتر بنایا جاسکے۔

اسٹریٹجک فوائد

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

خطرات اور ان کا مقابلہ

  • وی ڈبلیو ایم اے کی اوسط لائن میں تاخیر کا خطرہ
  • ایم ایف آئی اور اے ڈی ایکس میں کچھ تاخیر ہے ، جس سے مارکیٹ کی صورتحال کو غلط سمجھا جاسکتا ہے
  • kNN الگورتھم کے پیرامیٹرز کی ترتیب (جیسے k قدر کا انتخاب) نتائج پر بہت زیادہ اثر ڈالتی ہے
  • تجرباتی حکمت عملی جو عملی طور پر کام نہیں کر سکتی

ردعمل:

  • میڈین لائن پیرامیٹرز کو ایڈجسٹ کریں تاکہ تاخیر کو کم کیا جاسکے
  • رجحانات کی درستگی کو بہتر بنانے کے لئے اشارے کے الگورتھم میں بہتری
  • کے این این الگورتھم کے پیرامیٹرز کو بہتر بنانا اور مماثلت کو بہتر بنانا
  • ریٹرننگ اور رئیل سسٹم کے ساتھ حکمت عملی کی توثیق کریں

اصلاح کی سمت

اس حکمت عملی کو بہتر بنانے کے لئے بہت زیادہ جگہ ہے:

  • مزید مساوی اشارے شامل کریں اور مساوی پورٹ فولیو بنائیں
  • MACD، KDJ، وغیرہ جیسے مختلف معاون اشارے آزمائیں
  • مختلف فاصلے کی پیمائش کے طریقوں کا استعمال کرتے ہوئے کے این این الگورتھم میں بہتری
  • ایس وی ایم، رینڈم جنگل وغیرہ جیسے مشین لرننگ الگورتھم کو آزمائیں
  • پیرامیٹرز کو بہتر بنانے کے لئے، بہترین پیرامیٹرز کا مجموعہ تلاش کریں

مزید اشارے اور مشین لرننگ الگورتھم متعارف کرانے سے حکمت عملی کی استحکام اور منافع میں مزید اضافہ ہونے کا امکان ہے۔

خلاصہ کریں۔

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

حکمت عملی کا ماخذ کوڈ
/*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)