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

اسٹوکاسٹک آر ایس آئی مومنٹم آسسیلیشن ٹریڈنگ حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-12-26 12:11:21
ٹیگز:

img

جائزہ

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

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

حکمت عملی کا بنیادی اشارے اسٹوکاسٹک آر ایس آئی ہے۔ اسٹوکاسٹک آر ایس آئی کا حساب کتاب کا فارمولا یہ ہے:

اسٹوکاسٹک RSI = (RSI - RSI کم) / (RSI اعلی - RSI کم) * 100

جہاں RSI کا حساب lengthRSI پیرامیٹر (ڈیفالٹ 12) کا استعمال کرتے ہوئے کیا جاتا ہے ، اور اسٹوکاسٹک RSI کا حساب lengthStoch پیرامیٹر (ڈیفالٹ 12) کا استعمال کرتے ہوئے کیا جاتا ہے۔

جب اسٹوکاسٹک آر ایس آئی جامنی رنگ کے بھرے علاقے سے زیادہ ہے، تو یہ oversold area ہے، پھر مختصر ہو؛ جب اسٹوکاسٹک آر ایس آئی جامنی رنگ کے بھرے علاقے سے کم ہے، تو یہ oversold area ہے، پھر طویل ہو.

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

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

ایک واحد RSI حکمت عملی کے مقابلے میں، یہ حکمت عملی اسٹوکاسٹک اشارے کو زیادہ واضح طور پر overbought / oversold علاقوں کی شناخت کرنے کے لئے یکجا کرتی ہے، اس طرح سگنل کی وشوسنییتا کو بہتر بناتا ہے.

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

چلتی اوسط فلٹر کی حالت کو مؤثر طریقے سے مخالف رجحان کی پوزیشنوں کی تعمیر سے بچنے کے لئے مقرر کیا گیا ہے، اس طرح غیر ضروری نقصانات کو کم کرنا.

پوزیشن ہولڈنگ ٹائم ڈیلے کو غلط بریک آؤٹ سے روکنے کے لیے سیٹ کیا گیا ہے۔

اسٹریٹجی کے خطرات

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

اسٹوکاسٹک آر ایس آئی اشارے میں خود ایک خاص تاخیر ہے اور قلیل مدتی میں قیمتوں میں شدید تبدیلیوں کے بعد سگنل کو یاد کر سکتے ہیں۔

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

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

  1. اسٹوکاسٹک آر ایس آئی کی لمبائی، K اور D اقدار کو مزید بہتر بنانے کے لئے مختلف پیرامیٹر مجموعوں کی جانچ کی جاسکتی ہے۔

  2. مختلف آر ایس آئی لمبائی پیرامیٹرز کو زیادہ مناسب آر ایس آئی سائیکل تلاش کرنے کے لئے ٹیسٹ کیا جا سکتا ہے.

  3. سگنل کی درستگی کو مزید بہتر بنانے کے لئے دوسرے اشارے کے ساتھ مل کر کوشش کریں ، جیسے ایم اے سی ڈی ، بولنگر بینڈ وغیرہ۔

  4. مختلف پوزیشن تھام تاخیر کے پیرامیٹرز کو ٹیسٹ کریں تاکہ زیادہ مناسب باہر نکلنے کا وقت تلاش کیا جاسکے۔

نتیجہ

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


/*backtest
start: 2023-11-25 00:00:00
end: 2023-12-25 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/
// © Drun30 (Federico Magnani)

//@version=4
//STRATEGIA PRINCIPALE
capitaleIniziale=10000

var sizeordineInit= 50 // → % di capitale investita per ogni trade
var deltaSize = 25 // → delta% di capitale investito se trade precedente è stato in perdita
var sizeLimite = 100 //il trade non userà mai questa percentuale di capitale investito
var sizeordine = sizeordineInit

//Parametri ottimali 30 min
usiShort=false
usiLong=true
ipercomprato=85.29
ipervenduto=30.6
//

strategy("Momentum Strategy (V7.B.4)", initial_capital=capitaleIniziale, currency="USD", default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.1, slippage = 5, default_qty_value=sizeordineInit, overlay=false, pyramiding=0)

backtest = input(title="------------------------Backtest Period------------------------", defval = false)
start = timestamp(input(2020, "start year"), input(1, "start month"), input(1, "start day"), 00, 00)
end = timestamp(input(0, "end year"), input(0, "end month"), input(0, "end day"), 00, 00) 

siamoindata=time > start?true:false
if end > 0
    siamoindata:=time > start and time <= end?true:false

basicParameters = input(title="------------------------Basic Parameters------------------------", defval = false)
smoothK = input(3, minval=1)
smoothD = input(6, minval=1)
lengthRSI = input(12, minval=1) 
src = input(close, title="RSI Source")
rsi1 = rsi(src, lengthRSI)
lengthStoch = input(12, minval=1)
k = ema(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ema(k, smoothD)
altezzaipercomprato= input(ipercomprato, title="Overbought Height", minval=1, type=input.float)
altezzaipervenduto= input(ipervenduto, title="Oversold Height", minval=1,type=input.float) 

BarsDelay = input(6,title="Bars delay",minval=0) 

GambleSizing = input(true, title = "Gamble Sizing?",type=input.bool)
gambleAdd = input(deltaSize,title="Gamble Add (%)",minval=0,type=input.integer)
gambleLimit = input(sizeLimite,title="Gamble MAX (%)",minval=0,type=input.integer)
if GambleSizing and strategy.closedtrades[0]>strategy.closedtrades[1]
    if strategy.losstrades[0]>strategy.losstrades[1] and sizeordine<gambleLimit
        sizeordine:=sizeordine+gambleAdd
    if strategy.wintrades[0]>strategy.wintrades[1]
        sizeordine:=sizeordineInit

periodomediamobile_fast = input(1, title="Fast EMA length",minval=1)
periodomediamobile_slow = input(60, title="Slow EMA length",minval=1)

plot(k, color=color.blue)
plot(d, color=color.orange)
h0 = hline(altezzaipercomprato)
h1 = hline(altezzaipervenduto)
fill(h0, h1, color=color.purple, transp=80)
// n=input(Vicinanzadalcentro,title="Vicinanza dal centro",minval=0) 
//sarebbe il livello di D in cui si acquista o si vende, maggiore è la vicinanza maggiore sarà la frequenza dei trades, SE 0 è DISABILITATO

//     siamoinipervenduto= d<=altezzaipervenduto and d<=d[n] and d>d[1]?true:false //and d<d[3] and d>d[1]
//     siamoinipercomprato= d>=altezzaipercomprato and d>=d[n] and d<d[1]?true:false //and d>d[3] and d<d[1]
goldencross = crossover(k,d)
deathcross = crossunder(k,d)
// METTI VARIABILE IN CUI AVVIENE CROSSOVER O CROSSUNDER
valoreoro = valuewhen(goldencross,d,0)
valoremorte = valuewhen(deathcross,d,0)

siamoinipervenduto = goldencross and valoreoro<=altezzaipervenduto?true:false//d<=altezzaipervenduto?true:false
siamoinipercomprato = deathcross and valoremorte>=altezzaipercomprato?true:false//d>=altezzaipercomprato?true:false

long_separator = input(title="------------------------LONG------------------------", defval = usiLong)

sl_long_inp = input(10, title="Stop Loss LONG %", type=input.float) 
tp_long_inp = input(8, title="Take Profit LONG %",type=input.float)
stop_level_long = strategy.position_avg_price * (1 - (sl_long_inp/100)) //strategy.position_avg_price corrisponde al prezzo con cui si è aperta la posizione
take_level_long = strategy.position_avg_price * (1 + (tp_long_inp/100))

//BINANCE
JSON_long = 'OPEN LONG: PUT THE JSON HERE FOR THE API CALL'
JSON_chiusura = 'CLOSE POSITION: PUT THE JSON HERE FOR THE API CALL' 

webhookLong = JSON_long
webhookClose= JSON_chiusura

trendFilterL = input(title="TREND FILTER LONG?", defval = true)

EMAfast=ema(close,periodomediamobile_fast)
EMAslow=ema(close,periodomediamobile_slow)

siamoinuptrend_ema=EMAfast>EMAslow?true:false //close>=EMAfast and EMAfast>EMAslow
siamoinuptrend = siamoinuptrend_ema

// CondizioneAperturaLong = siamoinipervenduto and siamoindata // and siamoinuptrend
CondizioneAperturaLong = siamoinipervenduto and siamoindata and long_separator
if trendFilterL
    CondizioneAperturaLong := siamoinipervenduto and siamoindata and long_separator and siamoinuptrend

CondizioneChiusuraLong = siamoinipercomprato and siamoindata 

possiamoAprireLong=0
if trendFilterL and siamoinuptrend
    possiamoAprireLong:=5
plot(possiamoAprireLong,color=color.green)

sonPassateLeBarreG = barssince(CondizioneAperturaLong) == BarsDelay?true:false
sonPassateLeBarreD = barssince(CondizioneChiusuraLong) == BarsDelay?true:false

haiUnLongAncoraAperto = false
haiUnLongAncoraAperto := strategy.position_size>0?true:false

// Se l'ultimo valore della serie "CondizioneAperturaLong" è TRUE, allora hai un long ancora aperto
// Se l'ultimo valore della serie "CondizioneAperturaLong" è FALSE, allora:
//       Se l'ultimo valore della serie "CondizioneChiusuraLong" è TRUE, allora NON hai un long ancora aperto 
//       Se l'ultimo valore della serie "CondizioneChiusuraLong" è FALSE, allora restituisce l'ultimo valore della serie "haiUnLongAncoraAperto"

haiUnLongAncoraAperto_float = if(haiUnLongAncoraAperto==true)
    10
else
    0

plot(haiUnLongAncoraAperto_float,color=color.red) //FInché la linea rossa si trova a livello "1" allora c'è un ordine long in corso

quantita = (sizeordine/100*(capitaleIniziale+strategy.netprofit))/valuewhen(haiUnLongAncoraAperto==false and CondizioneAperturaLong,close,0)

plot(sizeordine,color=color.purple, linewidth=3)

if  strategy.position_size<=0 and CondizioneAperturaLong //and sonPassateLeBarreG and haiUnLongAncoraAperto==false strategy.opentrades==0
    strategy.entry("Vamonos",strategy.long, alert_message=webhookLong, comment="OPEN LONG", qty=quantita)

if  strategy.position_size>0 //and sonPassateLeBarreD // and CondizioneChiusuraLong 
    if siamoinuptrend == true and sonPassateLeBarreD
        strategy.close("Vamonos", alert_message=webhookClose, comment="CLOSE LONG")
    else if siamoinuptrend == false and CondizioneChiusuraLong
        strategy.close("Vamonos", alert_message=webhookClose, comment="CLOSE LONG")

    
if strategy.position_size>0 and siamoindata
    strategy.exit("Vamonos", stop=stop_level_long, limit=take_level_long, comment="CLOSE LONG (LIMIT/STOP)")


short_separator = input(title="------------------------SHORT------------------------", defval = usiShort)    

sl_short_inp = input(20, title="Stop Loss SHORT %")
tp_short_inp = input(35, title="Take Profit SHORT %")
stop_level_short = strategy.position_avg_price * (1 + (sl_short_inp/100))
take_level_short= strategy.position_avg_price * (1 - (tp_short_inp/100))

// BINANCE 
JSON_short = 'OPEN SHORT: PUT THE JSON HERE FOR THE API CALL'

webhookShort = JSON_short

trendFilterS = input(title="TREND FILTER SHORT?", defval = true)

siamoindowntrend_ema=EMAfast<EMAslow?true:false //close<=EMAfast and EMAfast<EMAslow
siamoindowntrend=siamoindowntrend_ema

CondizioneAperturaShort = short_separator and siamoinipercomprato and siamoindata 
if trendFilterS
    CondizioneAperturaShort:=short_separator and siamoinipercomprato and siamoindata and siamoindowntrend

CondizioneChiusuraShort = siamoinipervenduto and siamoindata

sonPassateLeBarreGs = barssince(CondizioneAperturaShort) == BarsDelay?true:false
sonPassateLeBarreDs = barssince(CondizioneChiusuraShort) == BarsDelay?true:false

haiUnoShortAncoraAperto = false
haiUnoShortAncoraAperto := strategy.position_size<0?true:false

haiUnoShortAncoraAperto_float = if(haiUnoShortAncoraAperto==true)
    15
else
    0

plot(haiUnoShortAncoraAperto_float,color=color.purple) //FInché la linea viola si trova a livello "2" allora c'è un ordine short in corso

if CondizioneAperturaShort and strategy.position_size>=0 //and haiUnoShortAncoraAperto==false
    strategy.entry("Andale",strategy.short,alert_message=webhookShort, comment="OPEN SHORT")

if  strategy.position_size<0 //and sonPassateLeBarreD // and CondizioneChiusuraLong 
    if siamoindowntrend == true and sonPassateLeBarreDs
        strategy.close("Andale",alert_message=webhookClose, comment="CLOSE SHORT")
    else if siamoindowntrend == false and CondizioneChiusuraShort
        strategy.close("Andale",alert_message=webhookClose, comment="CLOSE SHORT")

if strategy.position_size<0 and siamoindata
    strategy.exit("Andale", stop=stop_level_short, limit=take_level_short, comment="CLOSE SHORT (LIMIT/STOP)")

مزید