شرح تبدیلی مقداری حکمت عملی

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

img

جائزہ

یہ حکمت عملی مارکیٹ کی سمت کا تعین کرنے اور تجارتی سگنل پیدا کرنے کے لئے شرح تبدیلی (آر او سی) اشارے کا استعمال کرتی ہے۔ حکمت عملی کا بنیادی خیال طویل مدتی رجحانات کی پیروی کرنا اور زیادہ خطرہ مول لے کر مارکیٹ کو پیچھے چھوڑنا ہے۔

حکمت عملی منطق

داخلے کے قواعد

  • اگر ROC> 0 ہو تو طویل سفر کریں؛ اگر ROC < 0 ہو تو مختصر سفر کریں۔ مارکیٹ کی سمت کا فیصلہ کرنے کے لئے ROC کے مثبت / منفی کا استعمال کریں۔
  • اتار چڑھاؤ کو فلٹر کرنے کے لئے، صرف اس صورت میں ٹریڈنگ سگنل جاری کریں جب ROC مسلسل دو دن تک ایک ہی طرف رہے۔

سٹاپ نقصان

6٪ سٹاپ نقصان مقرر کیا گیا ہے۔ جب اسٹاپ نقصان شروع ہوتا ہے تو ، پوزیشن کو تبدیل کریں۔ اس سے یہ ظاہر ہوتا ہے کہ ہم مارکیٹ کے غلط پہلو پر ہوسکتے ہیں لہذا ہم فوری طور پر باہر نکل جاتے ہیں۔

اینٹی بلبلا میکانزم

اگر آر او سی 200 سے اوپر جاتا ہے تو مارکیٹ کو ایک بلبلا سمجھا جاتا ہے۔ جب آر او سی بلبلا علاقے سے نیچے گر جاتا ہے تو ، مختصر سگنل ٹرگر ہوتا ہے۔ کم از کم 1 ہفتہ تک بلبلا برقرار رہنے کی ضرورت ہوتی ہے۔

منی مینجمنٹ

فکسڈ پوزیشن سائزنگ + اضافے کا طریقہ استعمال کریں۔ ہر $ 400 منافع / نقصان کے لئے پوزیشن میں $ 200 کا اضافہ / کمی کریں۔ اس سے ہمیں پیرامیڈ منافع ملتا ہے لیکن یہ بھی بڑھتا ہے.

فوائد کا تجزیہ

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

  1. فلسفہ کے بعد رجحان کی پیروی کرتا ہے تاکہ طویل مدتی مثبت واپسی پیدا کرنے کا امکان ہے.
  2. خطرہ کو کنٹرول کرنے اور قلیل مدتی اتار چڑھاؤ کو کم کرنے کے لئے سٹاپ نقصان کا استعمال کریں.
  3. اینٹی بلبلا میکانزم چوٹیوں کا پیچھا کرنے سے بچتا ہے.
  4. فکسڈ پوزیشن + اضافی طریقہ اپ ٹرینڈز میں نمایاں ترقی پیدا کرتا ہے.

خطرے کا تجزیہ

کچھ خطرات بھی موجود ہیں:

  1. ROC اشارے کو جھوٹے سگنل پیدا کرنے والے whipsaws کے لئے موزوں ہے. فلٹرنگ کے لئے دیگر اشارے کے ساتھ مل کر غور کریں.
  2. تجارت کے اخراجات پر غور نہیں کیا گیا جس سے اصل منافع کم ہوتا ہے۔
  3. بلبلے کے خلاف پیرامیٹرز کی ناقص ترتیب بھی رجحانات کو یاد کرتی ہے۔
  4. بڑھتی ہوئی سائزنگ کھونے کے وقت کھپت میں اضافہ کرتی ہے۔

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

حکمت عملی کو بہتر بنانے کے کچھ طریقے:

  1. فلٹر سگنلز میں دیگر اشارے شامل کریں، جیسے ایم اے، Volatility وغیرہ۔
  2. بہتر بلبلا کا پتہ لگانے کے لئے اینٹی بلبلا پیرامیٹرز کو بہتر بنائیں.
  3. بہتر خطرہ / منافع کے توازن کے لئے فکسڈ پوزیشن اور اضافی تناسب کو ایڈجسٹ کریں.
  4. جب بڑے نقصان کا سامنا ہو تو خودکار سٹاپ نقصان شامل کریں۔
  5. تجارتی اخراجات پر غور کریں اور اس کے مطابق اندراج کے قوانین مرتب کریں۔

نتیجہ

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


/*backtest
start: 2022-12-05 00:00:00
end: 2023-12-11 00:00:00
period: 1d
basePeriod: 1h
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/
// © gsanson66


//This strategy use the Rate of Change (ROC) of the closing price to send enter signal. 
//@version=5
strategy("RATE OF CHANGE BACKTESTING", shorttitle="ROC BACKTESTING", overlay=false, precision=3, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18)


//--------------------------------FUNCTIONS-----------------------------------//

//@function Displays text passed to `txt` when called.
debugLabel(txt, color, loc) =>
    label.new(bar_index, loc, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//----------------------------------USER INPUTS----------------------------------//

//Technical parameters
rocLength = input.int(defval=365, minval=0, title='ROC Length', group="Technical parameters")
bubbleValue = input.int(defval=200, minval=0, title="ROC Bubble signal", group="Technical parameters")
//Risk management
stopLossInput = input.float(defval=10, minval=0, title="Stop Loss (in %)", group="Risk Management")
//Money management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2017 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")


//-------------------------------------VARIABLES INITIALISATION-----------------------------//

roc = (close/close[rocLength] - 1)*100
midlineConst = 0
var bool inBubble = na
bool shortBubbleCondition = na
equity = strategy.equity - strategy.openprofit
strategy.initial_capital = 50000
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95
bool inRange = na


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking if we are in a bubble
if roc > bubbleValue and not inBubble
    inBubble := true

//Checking if the bubble is over
if roc < 0 and inBubble
    inBubble := false

//Checking the condition to short the bubble : The ROC must be above the bubblevalue for at least 1 week
if roc[1]>bubbleValue and roc[2]>bubbleValue and roc[3]>bubbleValue and roc[4]>bubbleValue and roc[5]>bubbleValue and roc[6]>bubbleValue and roc[7]>bubbleValue
    shortBubbleCondition := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116), loc=roc)
    strategy.close_all()


//-------------------------------LONG/SHORT CONDITION-------------------------------//

//Long condition
//We reduce noise by taking signal only if the last roc value is in the same side as the current one
if (strategy.position_size<=0 and ta.crossover(roc, midlineConst)[1] and roc>0 and inRange)
    //If we were in a short position, we pass to a long position
    qty = cashOrder/close
    strategy.entry("Long", strategy.long, qty)
    stopLoss = close * (1-stopLossInput/100)
    strategy.exit("Long Risk Managment", "Long", stop=stopLoss)

//Short condition
//We take a short position if we are in a bubble and roc is decreasing
if (strategy.position_size>=0 and ta.crossunder(roc, midlineConst)[1] and roc<0 and inRange) or 
     (strategy.position_size>=0 and inBubble and ta.crossunder(roc, bubbleValue) and shortBubbleCondition and inRange)
    //If we were in a long position, we pass to a short position
    qty = cashOrder/close
    strategy.entry("Short", strategy.short, qty)
    stopLoss = close * (1+stopLossInput/100)
    strategy.exit("Short Risk Managment", "Short", stop=stopLoss)


//--------------------------------RISK MANAGEMENT--------------------------------------//

//We manage our risk and change the sense of position after SL is hitten
if strategy.position_size == 0 and inRange
    //We find the direction of the last trade
    id = strategy.closedtrades.entry_id(strategy.closedtrades-1)
    if id == "Short"
        qty = cashOrder/close
        strategy.entry("Long", strategy.long, qty)
        stopLoss = close * (1-stopLossInput/100)
        strategy.exit("Long Risk Managment", "Long", stop=stopLoss)
    else if id =="Long"
        qty = cashOrder/close
        strategy.entry("Short", strategy.short, qty)
        stopLoss = close * (1+stopLossInput/100)
        strategy.exit("Short Risk Managment", "Short", stop=stopLoss)


//---------------------------------PLOTTING ELEMENTS---------------------------------------//

//Plotting of ROC
rocPlot = plot(roc, "ROC", color=#7E57C2)
midline = hline(0, "ROC Middle Band", color=color.new(#787B86, 25))
midLinePlot = plot(0, color = na, editable = false, display = display.none)
fill(rocPlot, midLinePlot, 40, 0, top_color = strategy.position_size>0 ? color.new(color.green, 0) : strategy.position_size<0 ? color.new(color.red, 0) : na, bottom_color = strategy.position_size>0 ? color.new(color.green, 100) : strategy.position_size<0 ? color.new(color.red, 100) : na,  title = "Positive area")
fill(rocPlot, midLinePlot, 0,  -40,  top_color = strategy.position_size<0 ? color.new(color.red, 100) : strategy.position_size>0 ? color.new(color.green, 100) : na, bottom_color = strategy.position_size<0 ? color.new(color.red, 0) : strategy.position_size>0 ? color.new(color.green, 0) : na, title = "Negative area")


مزید