
یہ حکمت عملی ایک تجرباتی مقداری ٹریڈنگ حکمت عملی ہے جو ٹریڈنگ سگنل پیدا کرنے کے لئے مشین لرننگ کے KNN الگورتھم کے ساتھ ایک متحرک اوسط اشارے کو جوڑتی ہے۔ یہ حکمت عملی رجحان کی سمت کا تعین کرنے کے لئے دو مختلف ادوار کی VWMA اوسط کی کراسنگ کا استعمال کرتی ہے ، اور ایم ایف آئی اور اے ڈی ایکس دونوں اشارے کے ساتھ مل کر اس سگنل کو بہتر بنانے کے لئے KNN الگورتھم کے ذریعہ سگنل کو فلٹر کرتی ہے۔
اس حکمت عملی کا بنیادی اشارے دو مختلف پیرامیٹرز کے ساتھ وی ڈبلیو ایم اے کی اوسط لائن ہے ، جو بالترتیب تیز اور آہستہ لائن ہے۔ جب تیز لائن پر آہستہ لائن عبور ہوتی ہے تو خرید کا اشارہ پیدا ہوتا ہے ، اور جب تیز لائن کے نیچے آہستہ لائن عبور ہوتی ہے تو فروخت کا اشارہ پیدا ہوتا ہے۔ اس کے علاوہ ، اس حکمت عملی میں ایم ایف آئی اور اے ڈی ایکس کے دو معاون اشارے متعارف کروائے گئے ہیں ، جو موجودہ مارکیٹ کے حالات میں اس سگنل کی وشوسنییتا کا فیصلہ کرنے کے لئے کے این این درجہ بندی کے الگورتھم کے ذریعہ ہیں۔
kNN الگورتھم کا خیال یہ ہے کہ نئے اعداد و شمار کو تاریخی اعداد و شمار کے ساتھ موازنہ کیا جائے ، جس کے نتیجے میں قریب ترین k تاریخی اعداد و شمار کے مطابق نتائج کا تعین کیا جائے ، اور اس کے مطابق اکثریت کے ووٹ کے مطابق درجہ بندی کی جائے۔ اس حکمت عملی میں MFI اور ADX کو kNN الگورتھم کے دو ان پٹ پیرامیٹرز کے طور پر استعمال کیا گیا ہے ، جس کا فیصلہ کیا گیا ہے کہ ان دونوں اشارے کے امتزاج کے وقت تاریخی قیمتوں میں کیا ہوا ہے (بڑھنے یا گرنے) ، تاکہ موجودہ سگنل کو فلٹر کیا جاسکے ، سگنل کے معیار کو بہتر بنایا جاسکے۔
ردعمل:
اس حکمت عملی کو بہتر بنانے کے لئے بہت زیادہ جگہ ہے:
مزید اشارے اور مشین لرننگ الگورتھم متعارف کرانے سے حکمت عملی کی استحکام اور منافع میں مزید اضافہ ہونے کا امکان ہے۔
یہ حکمت عملی ایک تجرباتی مقداری تجارتی حکمت عملی ہے جو وی ڈبلیو ایم اے اوسط اشارے اور کے این این مشین لرننگ الگورتھم پر مبنی ہے۔ اس میں رجحان کی پیروی کرنے کی مضبوط صلاحیت ہے ، اور مشین لرننگ کے ذریعہ سگنل فلٹرنگ کی خصوصیات ہیں۔ اس حکمت عملی کی گنجائش وسیع ہے ، اور زیادہ خصوصیات اور بہتر الگورتھم متعارف کرانے سے بہتر نتائج برآمد کرنے کا امکان ہے۔ لیکن ایک نئی قسم کی حکمت عملی کے طور پر ، اس میں کچھ خطرات بھی ہیں جن کی مزید جانچ پڑتال اور بہتری کی ضرورت ہے۔ مجموعی طور پر ، اس حکمت عملی میں بہت بڑی اختراعی صلاحیت ہے۔
/*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)