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

MACD-KDJ مشترکہ مارٹنگیل پرامڈائڈنگ مقداری تجارتی حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2024-12-05 16:35:26
ٹیگز:ایم اے سی ڈیKDJایس ایم اے

 MACD-KDJ Combined Martingale Pyramiding Quantitative Trading Strategy

جائزہ

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

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

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

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

  1. سگنل سسٹم کی اعلی وشوسنییتا: غلط سگنل کو مؤثر طریقے سے فلٹر کرنے کے لئے MACD رجحان اشارے اور KDJ آسکیلیٹر کو یکجا کرتا ہے
  2. سائنسی پوزیشن مینجمنٹ: مارٹینگیل سسٹم مخالف رجحانات میں پوزیشنوں کو شامل کرکے انعقاد کی لاگت کو کم کرسکتا ہے
  3. جامع رسک کنٹرول: متعدد سٹاپ نقصان کے میکانزم اور پوزیشن کی حدود مؤثر طریقے سے رسک کنٹرول کرتی ہیں
  4. بہتر واپسی کا ڈھانچہ: پرامڈائڈنگ رجحان سازی کی منڈیوں میں بہتر واپسی حاصل کرسکتی ہے
  5. لچکدار پیرامیٹرز: مختلف مارکیٹ کی خصوصیات کے لئے حکمت عملی پیرامیٹر کی اصلاح کی حمایت کرتا ہے

حکمت عملی کے خطرات

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

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

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

خلاصہ

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


/*backtest
start: 2024-11-04 00:00:00
end: 2024-12-04 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © aaronxu567
//@version=5
strategy("MACD and KDJ Opening Conditions with Pyramiding and Exit", overlay=true) // pyramiding

// Setting
initialOrder = input.float(50000.0, title="Initial Order") 
initialOrderSize = initialOrder/close
//initialOrderSize = input.float(1.0, title="Initial Order Size") // Initial Order Size
macdFastLength = input.int(9, title="MACD Fast Length") // MACD Setting
macdSlowLength = input.int(26, title="MACD Slow Length")
macdSignalSmoothing = input.int(9, title="MACD Signal Smoothing")
kdjLength = input.int(14, title="KDJ Length")
kdjSmoothK = input.int(3, title="KDJ Smooth K")
kdjSmoothD = input.int(3, title="KDJ Smooth D")
enableLong = input.bool(true, title="Enable Long Trades")
enableShort = input.bool(true, title="Enable Short Trades")

// Additions Setting
maxAdditions = input.int(5, title="Max Additions", minval=1, maxval=10) // Max Additions
addPositionPercent = input.float(1.0, title="Add Position Percent", minval=0.1, maxval=10) // Add Conditions
reboundPercent = input.float(0.5, title="Rebound Percent (%)", minval=0.1, maxval=10) // Rebound 
addMultiplier = input.float(1.0, title="Add Multiplier", minval=0.1, maxval=10) // 

// Stop Setting
takeProfitTrigger = input.float(2.0, title="Take Profit Trigger (%)", minval=0.1, maxval=10) // 
trailingStopPercent = input.float(0.3, title="Trailing Stop (%)", minval=0.1, maxval=10) // 
stopLossPercent = input.float(6.0, title="Stop Loss Percent", minval=0.1, maxval=10) // 

// MACD Calculation
[macdLine, signalLine, _] = ta.macd(close, macdFastLength, macdSlowLength, macdSignalSmoothing)

// KDJ Calculation
k = ta.sma(ta.stoch(close, high, low, kdjLength), kdjSmoothK)
d = ta.sma(k, kdjSmoothD)
j = 3 * k - 2 * d

// Long Conditions
enterLongCondition = enableLong and ta.crossover(macdLine, signalLine) and ta.crossover(k, d)

// Short Conditions
enterShortCondition = enableShort and ta.crossunder(macdLine, signalLine) and ta.crossunder(k, d)

// Records
var float entryPriceLong = na
var int additionsLong = 0 // 记录多仓加仓次数
var float nextAddPriceLong = na // 多仓下次加仓触发价格
var float lowestPriceLong = na // 多头的最低价格
var bool longPending = false // 多头加仓待定标记

var float entryPriceShort = na
var int additionsShort = 0 // 记录空仓加仓次数
var float nextAddPriceShort = na // 空仓下次加仓触发价格
var float highestPriceShort = na // 空头的最高价格
var bool shortPending = false // 空头加仓待定标记

var bool plotEntryLong = false
var bool plotAddLong = false
var bool plotEntryShort = false
var bool plotAddShort = false

// Open Long
if (enterLongCondition and strategy.opentrades == 0)
    strategy.entry("long", strategy.long, qty=initialOrderSize,comment = 'Long')
    entryPriceLong := close
    nextAddPriceLong := close * (1 - addPositionPercent / 100)
    additionsLong := 0
    lowestPriceLong := na
    longPending := false
    plotEntryLong := true

// Add Long
if (strategy.position_size > 0 and additionsLong < maxAdditions)
    // Conditions Checking
    if (close < nextAddPriceLong) and not longPending
        lowestPriceLong := close
        longPending := true

    if (longPending)
        // Rebound Checking
        if (close > lowestPriceLong * (1 + reboundPercent / 100))
            // Record Price
            float addQty = initialOrderSize*math.pow(addMultiplier,additionsLong+1)
            strategy.entry("long", strategy.long, qty=addQty,comment = 'Add Long')
            additionsLong += 1
            longPending := false
            nextAddPriceLong := math.min(nextAddPriceLong, close) * (1 - addPositionPercent / 100) // Price Updates
            plotAddLong := true
        else
            lowestPriceLong := math.min(lowestPriceLong, close)

// Open Short
if (enterShortCondition and strategy.opentrades == 0)
    strategy.entry("short", strategy.short, qty=initialOrderSize,comment = 'Short')
    entryPriceShort := close
    nextAddPriceShort := close * (1 + addPositionPercent / 100)
    additionsShort := 0
    highestPriceShort := na
    shortPending := false
    plotEntryShort := true

// add Short
if (strategy.position_size < 0 and additionsShort < maxAdditions)
    // Conditions Checking
    if (close > nextAddPriceShort) and not shortPending
        highestPriceShort := close
        shortPending := true

    if (shortPending)
        // rebound Checking
        if (close < highestPriceShort * (1 - reboundPercent / 100))
            // Record Price
            float addQty = initialOrderSize*math.pow(addMultiplier,additionsShort+1)
            strategy.entry("short", strategy.short, qty=addQty,comment = "Add Short")
            additionsShort += 1
            shortPending := false
            nextAddPriceShort := math.max(nextAddPriceShort, close) * (1 + addPositionPercent / 100) // Price Updates
            plotAddShort := true
        else
            highestPriceShort := math.max(highestPriceShort, close)

// Take Profit or Stop Loss
if (strategy.position_size != 0)
    float stopLossLevel = strategy.position_avg_price * (strategy.position_size > 0 ? (1 - stopLossPercent / 100) : (1 + stopLossPercent / 100))
    float trailOffset = strategy.position_avg_price * (trailingStopPercent / 100) / syminfo.mintick

    if (strategy.position_size > 0)
        strategy.exit("Take Profit/Stop Loss", from_entry="long", stop=stopLossLevel, trail_price=strategy.position_avg_price * (1 + takeProfitTrigger / 100), trail_offset=trailOffset)
    else
        strategy.exit("Take Profit/Stop Loss", from_entry="short", stop=stopLossLevel, trail_price=strategy.position_avg_price * (1 - takeProfitTrigger / 100), trail_offset=trailOffset)

// Plot
plotshape(series=plotEntryLong, location=location.belowbar, color=color.blue, style=shape.triangleup, size=size.small, title="Long Signal")
plotshape(series=plotAddLong, location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small, title="Add Long Signal")
plotshape(series=plotEntryShort, location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small, title="Short Signal")
plotshape(series=plotAddShort, location=location.abovebar, color=color.orange, style=shape.triangledown, size=size.small, title="Add Short Signal")

// Plot Clear
plotEntryLong := false
plotAddLong := false
plotEntryShort := false
plotAddShort := false



// // table
// var infoTable = table.new(position=position.top_right,columns = 2,rows = 6,bgcolor=color.yellow,frame_color = color.white,frame_width = 1,border_width = 1,border_color = color.black)
// if barstate.isfirst
//     t1="Open Price"
//     t2="Avg Price"
//     t3="Additions"
//     t4='Next Add Price'
//     t5="Take Profit"
//     t6="Stop Loss"
//     table.cell(infoTable, column = 0, row = 0,text=t1       ,text_size=size.auto)
//     table.cell(infoTable, column = 0, row = 1,text=t2       ,text_size=size.auto)
//     table.cell(infoTable, column = 0, row = 2,text=t3       ,text_size=size.auto)
//     table.cell(infoTable, column = 0, row = 3,text=t4       ,text_size=size.auto)
//     table.cell(infoTable, column = 0, row = 4,text=t5       ,text_size=size.auto)
//     table.cell(infoTable, column = 0, row = 5,text=t6       ,text_size=size.auto)
// if barstate.isconfirmed and strategy.position_size!=0
//     ps=strategy.position_size
//     pos_avg=strategy.position_avg_price
//     opt=strategy.opentrades
//     t1=str.tostring(strategy.opentrades.entry_price(0),format.mintick)
//     t2=str.tostring(pos_avg,format.mintick)
//     t3=str.tostring(opt>1?(opt-1):0)
//     t4=str.tostring(ps>0?nextAddPriceLong:nextAddPriceShort,format.mintick)
//     t5=str.tostring(pos_avg*(1+(ps>0?1:-1)*takeProfitTrigger*0.01),format.mintick)
//     t6=str.tostring(pos_avg*(1+(ps>0?-1:1)*stopLossPercent*0.01),format.mintick)
//     table.cell(infoTable, column = 1, row = 0,text=t1  ,text_size=size.auto)
//     table.cell(infoTable, column = 1, row = 1,text=t2  ,text_size=size.auto)
//     table.cell(infoTable, column = 1, row = 2,text=t3  ,text_size=size.auto)
//     table.cell(infoTable, column = 1, row = 3,text=t4  ,text_size=size.auto)
//     table.cell(infoTable, column = 1, row = 4,text=t5  ,text_size=size.auto)
//     table.cell(infoTable, column = 1, row = 5,text=t6  ,text_size=size.auto)
    

متعلقہ

مزید