متحرک اوسط لاگت مقررہ سرمایہ کاری کمپاؤنڈ سود کی حکمت عملی


تخلیق کی تاریخ: 2024-01-04 16:34:10 آخر میں ترمیم کریں: 2024-01-04 16:34:10
کاپی: 0 کلکس کی تعداد: 806
1
پر توجہ دیں
1621
پیروکار

متحرک اوسط لاگت مقررہ سرمایہ کاری کمپاؤنڈ سود کی حکمت عملی

جائزہ

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

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

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

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

خطرات اور نقصانات

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

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

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

اصلاح کی تجاویز

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

  2. آپٹمائزڈ سٹاپ میکینزم۔ آپ کو ایک آسان متحرک سٹاپ کے بجائے Λ سٹاپ یا سرکلر سٹاپ کا استعمال کرتے ہوئے ٹیسٹ کر سکتے ہیں، جس سے آپ کو بہتر سٹاپ کا اثر مل سکتا ہے۔ آپ کو ایک حکمت عملی میں شامل کیا جا سکتا ہے جس میں پوزیشن ٹائمنگ کی حد ہوتی ہے۔

  3. روکنے کے طریقوں کو بہتر بنائیں۔ مختلف قسم کے موبائل روکنے کی جانچ کی جاسکتی ہے ، تاکہ روکنے کے بہتر مواقع تلاش کیے جاسکیں ، جس سے مجموعی طور پر منافع کی شرح میں اضافہ ہوسکے۔

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

خلاصہ کریں۔

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

حکمت عملی کا ماخذ کوڈ
/*backtest
start: 2023-12-04 00:00:00
end: 2024-01-03 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///
// © A3Sh
//@version=5

// Study of a Simple RSI based, PA (priceaveraging) and DCA strategy that opens a new position everytime it hits a specified price level below the first entry.
// The first entry is opened when the specified rsi and moving average conditions are met. 
// The following DCA levels are calculated exponentially and set, starting with a specified % of price drop. 
// The disctance between the dca levels can be changed with the exponential scale.
// Each position closes individually when it reaches a specified take profit.
// The position can re-open again when it hits the price level again.
// Each time a position is closed and reopened, the average price drops a little.
// The position stays open until the first entry closes or when the price reaches the Stop level.
// When the price reaches the Stop level, all positions will close at once.

// The RSI and MA code for opening the entry is adapted from the Optimized RSI Buy the Dips strategy, by Coinrule.
// This code is used for study purposes, but any other low/ dip finding indicator can be used.
// https://www.tradingview.com/script/Pm1WAtyI-Optimized-RSI-Strategy-Buy-The-Dips-by-Coinrule/

// Dynamic DCA layers are inspired by the Backtesting 3commas DCA Bot v2, by rouxam
// This logic gives more flexibility because you can dyanically change the amount of dca entries.
// https://www.tradingview.com/script/8d6Auyst-Backtesting-3commas-DCA-Bot-v2/

// The use of for loops to (re)open and close different entries separately is based on the Simple_Pyramiding strategy.
// https://www.tradingview.com/script/t6cNLqDN-Simple-Pyramiding/


strategy('Simple_RSI+PA+DCA', overlay=true, pyramiding=20, initial_capital=500, calc_on_order_fills=true, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.075, close_entries_rule='FIFO')

// Backtest Window //
start_time   = input(defval=timestamp("01 April 2021 20:00"), group = "Backtest Window", title="Start Time")
end_time     = input(defval=timestamp("01 Aug 2030 20:00"),   group = "Backtest Window", title="End Time")
window() => true

// Inputs //
takeProfit      = input.float  (3,           group = 'Risk',           title = 'Take Profit %', step=0.1)
takeProfitAll   = input.float  (6,           group = "Risk",           title = 'Close All %',   step=0.1)
posCount        = input.int    (8,           group = 'DCA Settings',   title = 'Max Amount of Entries')
increment       = input.float  (2,           group = 'DCA Settings',   title = 'Price Drop % to open First DCA Order', step=0.5)/100 
exponent_scale  = input.float  (1.4,         group = 'DCA Settings',   title = 'Exponential Scale DCA levels', step=0.1, minval=1.1) 
bar_lookback    = input.int    (4999,        group = 'DCA Settings',   title = 'Lines Bar Lookback', maxval = 4999)
plotMA          = input.bool   (false,       group = 'Moving Average', title = 'Plot Moving Average')
moving_average  = input.int    (100,         group = 'Moving Average', title = 'MA Length' )
rsiLengthInput  = input.int    (14,          group = 'RSI Settings',   title = "RSI Length", minval=1)
rsiSourceInput  = input.source (close,       group = 'RSI Settings',   title = 'Source')
overSold        = input.int    (29,          group = 'RSI Settings',   title = 'Oversold, Trigger to Enter First Position')

// variables //
var open_position    = true   // true when there are open positions
var entry_price      = 0.0    // the entry price of the first entry
var dca_price        = 0.0    // the price of the different dca layers
var int count        = 0      // bar counter since first open position
var int max_bar      = 0      // max bar buffer variable for DCA lines, stop lines, average price
var line dca_line    = na     // lines variable for creating dca lines

// arrays //
linesArray = array.new_float(posCount,na)  // array to store different dca price levels for creating the dca lines

// Create max bar buffer for DCA lines, Stop and average price lines //
max_bar := count >= bar_lookback ? bar_lookback : count

// Order size based on first entry and amount of DCA layers
q = (strategy.equity  / posCount + 1) / open


// Calculate Moving Averages
movingaverage_signal = ta.sma(close ,moving_average)
plot (plotMA ? movingaverage_signal : na, color = color.new(#f5ff35, 0))


// RSI calculations //
up   = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi  = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))


// Buy Signal (co)
co = ta.crossover(rsi, overSold) and close < movingaverage_signal


// Create a white line for average price, since the last opened position //
// average_price = line.new(x1 = bar_index - max_bar, y1 = strategy.position_avg_price, x2 = bar_index, y2 = strategy.position_avg_price, color = color.white)
    

// Stop //
// Create a red Stop level line based on a specified % above the average price //
stop_level = strategy.position_avg_price + (strategy.position_avg_price / 100 * takeProfitAll)
// stop_line  = line.new(x1 = bar_index - max_bar, y1 = stop_level, x2 = bar_index, y2 = stop_level, color = color.red)
    

// Take profit definition per open position //
take_profit_price = close * takeProfit / 100 / syminfo.mintick


// Make sure the Stop level and average price level don't excied the bar buffer to avoid errors //
// if count <= bar_lookback
//     line.set_x1(stop_line,     strategy.opentrades.entry_bar_index(strategy.opentrades - 1))
//     line.set_x1(average_price, strategy.opentrades.entry_bar_index(strategy.opentrades - 1))


// Exponential DCA Layer Calculation fucntion --> First try, needs more experimentation //
dca_price_level(index,entry_price) =>   
    entry_price * (1 - (increment * math.pow(exponent_scale, index)))


// Set  Entries //
// Open the first entry and set the entry price //
if co and strategy.position_size == 0 and window() 
    open_position := true
    entry_price   := close
    strategy.entry(id = 'FE1', direction = strategy.long, qty = q)  
    
// first_entry_line = line.new(x1 = bar_index - max_bar, y1 = entry_price, x2 = bar_index, y2 = entry_price, color = color.blue)


// Start bar counting since the position is open //
if open_position == true
    count := count + 1


// Set the DCA entries //
// Prices below 1 are not set to avoid negative prices //
if strategy.position_size > 0 and window()
    for i = 0 to strategy.opentrades
        if strategy.opentrades == i and i < posCount
            dca_price := dca_price_level(i,entry_price) > 1 ? dca_price_level(i,entry_price) : na
            entry_id = 'DCA' + str.tostring(i + 1) 
            strategy.entry(id = entry_id, direction = strategy.long, limit = dca_price, qty = q)  


// Store the values of the different dca price levels in an array and create the dca lines // 
// Prices below 1 are not stored//
if open_position==true and window() 
    for i = 1 to posCount -1
        array.push(linesArray, dca_price_level(i,entry_price) > 1 ? dca_price_level(i,entry_price) : na) 
    
    // for i = 1 to array.size(linesArray) - 1
    //     dca_line := line.new(x1 = bar_index - max_bar, y1 = array.get(linesArray, i), x2 = bar_index, y2 = array.get(linesArray, i),color = color.blue)


// Create thick line to show the last Entry price //
// last_entry_price = line.new(x1 = bar_index[5], y1 = strategy.opentrades.entry_price(strategy.opentrades - 1), x2 = bar_index, y2 = strategy.opentrades.entry_price(strategy.opentrades - 1),color = color.rgb(255, 0, 204), width = 5)


// Exit the first entry when the take profit triggered //   
if strategy.opentrades > 0 and window() 
    strategy.exit(id = 'Exit FE', from_entry = 'FE1', profit = take_profit_price)


// Exit DCA entries when take profit is triggered //
if strategy.opentrades > 0 and window() 
    for i = 0 to strategy.opentrades 
        exit_from = 'DCA' + str.tostring(i + 1)
        exit_id = 'Exit_' + str.tostring(i + 1)
        strategy.exit(id = exit_id, from_entry = exit_from, profit = take_profit_price)


// Close all positions at once when Stop is crossed //
if strategy.opentrades > 0 and ta.crossover(close,stop_level) and window() 
    strategy.close_all()


// Make sure nothing is open after alle positions are closed and set the condiftion back to be open for new entries //
if strategy.position_size[1] > 0 and strategy.position_size == 0
    strategy.cancel_all()
    strategy.close_all()
    // line.delete(average_price)
    // line.delete(stop_line)
    // line.delete(dca_line)
    open_position := false   // All position are closed, so back to false
    count := 0               // Reset bar counter