بریکآؤٹ ٹرینڈ فالور V2

مصنف:چاؤ ژانگ، تاریخ: 2023-11-01 17:24:08
ٹیگز:

img

جائزہ

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

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

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

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

اس حکمت عملی کا بنیادی منطق اعلی ٹائم فریموں پر سپورٹ اور مزاحمت کی سطح کے وقفوں کا استعمال کرتے ہوئے رجحانات کی نشاندہی کرنا اور رجحان کی سمت میں تجارت کرنا ہے۔

خاص طور پر، یہ مندرجہ ذیل اقدامات کو نافذ کرتا ہے:

  1. موجودہ ٹائم فریم (مثال کے طور پر 1 گھنٹہ) پر محور کی معاونت اور مزاحمت کی سطح کا حساب لگائیں۔ یہ ایک خاص مدت کے دوران اعلی ترین اعلی اور کم سے کم کم کی طرف دیکھ کر کیا جاتا ہے۔

  2. ایک یا ایک سے زیادہ اعلی ٹائم فریم (مثال کے طور پر 4 گھنٹے اور روزانہ) پر محور کی حمایت اور مزاحمت کی سطح کا حساب لگائیں۔ اس میں موجودہ ٹائم فریم کی طرح ہی منطق استعمال ہوتی ہے۔

  3. ان سپورٹ اور مزاحمت کی سطحوں کو چارٹ پر افقی لائنوں کے طور پر پلاٹ کریں۔ ان سطحوں کو توڑنے سے اعلی ٹائم فریم پر رجحان میں تبدیلی ظاہر ہوتی ہے۔

  4. اس بات پر مبنی رجحان کی سمت کا تعین کریں کہ آیا قیمت پچھلے اعلی یا کم نکات کو توڑتی ہے۔ پچھلے اعلی کو توڑنے سے اوپر کا رجحان ظاہر ہوتا ہے۔ پچھلے کم کو توڑنے سے نیچے کا رجحان ظاہر ہوتا ہے۔

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

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

  7. جیسے جیسے قیمتیں چلتی ہیں، منافع میں مقفل ہونے اور رجحان کی پیروی کرنے کے لیے سٹاپ نقصان کو نئے نچلے مقامات پر ایڈجسٹ کریں۔

  8. باہر نکلیں جب اسٹاپ نقصان شروع ہو یا اہم سپورٹ / مزاحمت کی سطح توڑ دی جائے۔

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

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

  • رجحانات کا اندازہ کرنے کے لئے متعدد ٹائم فریم کا استعمال کرتے ہوئے شور سے بچنے کے ساتھ مضبوط رجحان کی سمت کو زیادہ درست طریقے سے شناخت کیا جاسکتا ہے۔

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

  • سپورٹ اور مزاحمت کی سطح واضح اندراج اور سٹاپ نقصان کی سطح فراہم کرتی ہے۔ مخصوص اندراج پوائنٹس کا اندازہ لگانے کی ضرورت نہیں ہے۔

  • منافع کو زیادہ سے زیادہ کرنے کے لئے رجحان کے ساتھ ساتھ روکنے کو ایڈجسٹ کرنا.

  • سادہ اور واضح حکمت عملی منطق، سمجھنے اور بہتر بنانے کے لئے آسان.

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

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

  • بنیادی اثرات پر غور نہیں کرتا ، بڑے واقعات پر قیمت سے انحراف کرسکتا ہے۔ آمدنی کی تاریخوں جیسے فلٹر شامل کرسکتے ہیں۔

  • کوئی پوزیشن سائزنگ کنٹرول مقرر نہیں کیا گیا ہے۔ اکاؤنٹ کے سائز ، اتار چڑھاؤ وغیرہ کے مطابق سائز کو بہتر بنانا چاہئے۔

  • محدود بیک ٹیسٹ کی مدت۔ مختلف مارکیٹ کے ماحول میں ٹیسٹنگ کو بڑھانا چاہئے۔

  • تجارت کے اخراجات پر کوئی غور نہیں کیا گیا۔ اصل اخراجات کی بنیاد پر پیرامیٹرز کو ایڈجسٹ کرنا چاہئے۔

  • صرف طویل مدتی تجارت پر غور کرتا ہے۔ کثیر ٹائم فریم کی حکمت عملیوں کو نافذ کرنے کے لئے قلیل مدتی تجارت کے لئے سگنل تیار کرسکتا ہے۔

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

  • فلٹر کے حالات شامل کریں:

    • بنیادی باتیں جیسے آمدنی، خبریں

    • اشارے جیسے حجم، اے ٹی آر رک جاتا ہے

  • پیرامیٹرز کو بہتر بنائیں:

    • معاونت/مقاومت کا حساب لگانے کی مدت

    • رجحان کے تعین کے لئے ٹائم فریم

  • حکمت عملی کے دائرہ کار میں توسیع:

    • قلیل مدتی تجارتی حکمت عملی تیار کریں

    • مختصر مواقع پر غور کریں

    • مارکیٹوں کے درمیان فرق

  • خطرے کے انتظام کو بہتر بنانا:

    • اتار چڑھاؤ اور سائز کے لحاظ سے پوزیشن سائزنگ کو بہتر بنائیں

    • سٹاپ نقصان کی حکمت عملی جیسے منتقل / بریکٹ اسٹاپ کو بہتر بنائیں

    • خطرے سے متعلق ایڈجسٹ میٹرکس متعارف کروائیں

  • عملدرآمد منطق کو بہتر بنائیں:

    • اندراج کا وقت منتخب کریں

    • جزوی سائز کے اندراجات

    • سٹاپ نقصان کی تحریک کی اصلاح

نتیجہ

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


/*backtest
start: 2023-10-24 00:00:00
end: 2023-10-26 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// Revision:        1
// Author:          @millerrh
// Strategy:  Enter long when recent swing high breaks out, using recent swing low as stop level.  Move stops up as higher lows print to act
// as trailing stops.  Ride trend as long as it is there and the higher lows aren't breached.  
// The difference between this one and the previous Breakout Trend Follower is that this one uses higher timeframe higher highs/higher lows as a filter instead 
// of an arbitrary Moving Average.  I wanted to test out whether waiting for longer term actual trend changes produced better stats than just the moving average.
// Conditions/Variables 
//    1. Manually configure which dates to back test
//    2. Can add a filter to only take setups that are above (or below for shorts) user-defined larger timeframe trends (helps avoid trading counter trend) 

// === CALL STRATEGY/STUDY, PROGRAMATICALLY ENTER STRATEGY PARAMETERS HERE SO YOU DON'T HAVE TO CHANGE THEM EVERY TIME YOU RUN A TEST ===
// (STRATEGY ONLY) - Comment out srategy() when in a study() 
strategy("Breakout Trend Follower V2", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
// (STUDY ONLY) - Comment out study() when in a strategy() 
//study("Breakout Trend Follower V2", overlay=true)

// === BACKTEST RANGE ===
Start = input(defval = timestamp("01 Jan 2019 06:00 +0000"), title = "Backtest Start Date", type = input.time, group = "Backtest Range")
Finish = input(defval = timestamp("01 Jan 2100 00:00 +0000"), title = "Backtest End Date", type = input.time, group = "Backtest Range")

// == USER INPUTS ==
tableLocation = input(defval="Top", options=["Top", "Bottom"], title = "Info Table Location", group = "Display",
  tooltip = "Place information table on the top of the pane or the bottom of the pane.")
lookback = input(defval = 3, title = "Pivot Lookback Period", group = "Pivot Points",
  tooltip = "Looks for pivot points within this number of bars both left and right.")
showPivotPoints = input(title = "Show Historical Pivot Points?", type = input.bool, defval = false, group = "Pivot Points",
  tooltip = "Toggle this on to see the historical pivot points that were used.  Change the Lookback Period to adjust the frequency of these points.
  The pivot points are only shown for the current chart timeframe - to see the Daily pivot pionts, use the Daily timeframe, etc.")
trendFilter = input(defval="1st Timeframe", options=["1st Timeframe", "Both Timeframes", "None"], title = "Use HTF Trend for Filtering?", group = "Higher Timeframe Levels",
  tooltip = "Signals will be ignored when price is not aligned with the higher timeframe trend(s).  The intent is to keep you out of bear periods and only buying when 
  price is showing strength and you are trading with the trend.")
twoSet = input(defval="D", title="1st High Timeframe", type=input.resolution, group = "Higher Timeframe Levels",
  tooltip = "Allows you to set two different time frames for looking at the trend.")
threeSet = input(defval="W", title="2nd High Timeframe", type=input.resolution, group = "Higher Timeframe Levels")
showMTFLevels = input(title = "Show Multiple Timeframe S/R Levels?", type = input.bool, defval = true, group = "Higher Timeframe Levels",
  tooltip = "Displays the pivot highs and lows of higher timeframes to use as support/resistance levels. When these levels break, the trend
  will change on these higher timeframes.")
currentColorS = input(color.new(color.orange,50), title = "Current Timeframe    Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF1")
currentColorR = input(color.new(color.blue,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF1")
oneColorS = input(color.new(color.yellow,50), title = "1st High Timeframe   Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF2")
oneColorR = input(color.new(color.yellow,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF2")
twoColorS = input(color.new(color.white,50), title = "2nd High Timeframe    Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF3")
twoColorR = input(color.new(color.white,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF3")

//  == DEFINE FUNCTIONS FOR USE IN MULTIPLE TIMEFRAMES (USING A TUPLE TO AVOID SO MANY SECURITY CALLS) ==  
f_getHTF() =>
    ph = pivothigh(high, lookback, lookback)
    pl = pivotlow(low, lookback, lookback)
    highLevel = valuewhen(ph, high[lookback], 0)
    lowLevel = valuewhen(pl, low[lookback], 0)
    barsSinceHigh = barssince(ph) + lookback
    barsSinceLow = barssince(pl) + lookback
    timeSinceHigh = time[barsSinceHigh]
    timeSinceLow = time[barsSinceLow]
    [ph, pl, highLevel, lowLevel, barsSinceHigh, barsSinceLow, timeSinceHigh, timeSinceLow]
    
[ph_01, pl_01, hL_01, lL_01, bsSH_01, bsSL_01, tSH_01, tSL_01] = security(syminfo.tickerid, "", f_getHTF())
[ph_02, pl_02, hL_02, lL_02, bsSH_02, bsSL_02, tSH_02, tSL_02] = security(syminfo.tickerid, twoSet, f_getHTF())
[ph_03, pl_03, hL_03, lL_03, bsSH_03, bsSL_03, tSH_03, tSL_03] = security(syminfo.tickerid, threeSet, f_getHTF())

// Plot historical pivot points for debugging and configuring the lookback period.
plot(showPivotPoints ? ph_01 : na, style=plot.style_cross, linewidth=3, color=color.new(color.yellow,50), offset=-lookback)
plot(showPivotPoints ? pl_01 : na, style=plot.style_cross, linewidth=3, color=color.new(color.yellow,50), offset=-lookback)

// == PLOT SUPPORT/RESISTANCE LINES ON THE HIGHER TIMEFRAMES ==
// Use a function to define the lines
f_line(x1, y1, y2, _color) =>
    var line id = na
    // line.delete(id)
    // id := line.new(x1, y1, time, y2, xloc.bar_time, extend.right, _color)

// 1st Timeframe
highLine1 = showMTFLevels ? f_line(tSH_01, hL_01, hL_01, currentColorR) : na
lowLine1 = showMTFLevels ? f_line(tSL_01, lL_01, lL_01, currentColorS) : na 
// 2nd Timeframe
highLine2 = showMTFLevels ? f_line(tSH_02, hL_02, hL_02, oneColorR) : na
lowLine2 = showMTFLevels ? f_line(tSL_02, lL_02, lL_02, oneColorS) : na
// 3rd Timeframe
highLine3 = showMTFLevels ? f_line(tSH_03, hL_03, hL_03, twoColorR) : na
lowLine3 = showMTFLevels ? f_line(tSL_03, lL_03, lL_03, twoColorS) : na

// == TREND CALCULATIONS (USING A TUPLE TO CONSOLIDATE REPETATIVE CODE AND GENERATE MULTIPE VARIABLES WITH ONE FUNCTION ==
f_signal(highLevel, lowLevel) =>
    uptrendSignal    = high > highLevel
    downtrendSignal  = low < lowLevel
    inUptrend        = bool(na)
    inDowntrend      = bool(na) 
    inUptrend       := uptrendSignal[1] ? true : downtrendSignal[1] ? false : inUptrend[1]
    inDowntrend     := not inUptrend
    [uptrendSignal, downtrendSignal, inUptrend, inDowntrend]

[uptrendSignal1, downtrendSignal1, inUptrend1, inDowntrend1] = f_signal(hL_01, lL_01)  // 1st Timeframe
[uptrendSignal2, downtrendSignal2, inUptrend2, inDowntrend2] = f_signal(hL_02, lL_02)  // 2nd Timeframe
[uptrendSignal3, downtrendSignal3, inUptrend3, inDowntrend3] = f_signal(hL_03, lL_03)  // 3rd Timeframe

// == TREND TABLE PLOTTING ==
tablePos = tableLocation == "Top" ? position.top_right : position.bottom_right
var table trendTable = table.new(tablePos, 3, 1, border_width = 3)
upColor = color.rgb(38, 166, 154)
downColor = color.rgb(240, 83, 80)

f_fillCell(_column, _row, _cellText, _c_color) =>
    table.cell(trendTable, _column, _row, _cellText, bgcolor = color.new(_c_color, 70), text_color = _c_color, width = 6)

if barstate.islast or barstate.islastconfirmedhistory
    f_fillCell(0, 0, inUptrend1 ? "▲" : "▼", inUptrend1 ? upColor : downColor)
    f_fillCell(1, 0, inUptrend2 ? "▲ " + twoSet : "▼ " + twoSet, inUptrend2 ? upColor : downColor)
    f_fillCell(2, 0, inUptrend3 ? "▲ " + threeSet : "▼ " + threeSet, inUptrend3 ? upColor : downColor)

// Conditions for entry and exit
buyConditions =  true
buySignal = high > hL_01 and buyConditions // Code to act like a stop-buy for the Study
sellSignal = low < lL_01 // Code to act like a stop-loss for the Study

// (STRATEGY ONLY) Comment out for Study
strategy.entry("Long", strategy.long, stop = hL_01, when = buyConditions)
// strategy.entry("Long", strategy.long, stop = buyLevel2, when = time > Start and time < Finish and high > maFilterCheck)
strategy.exit("Exit Long", from_entry = "Long", stop=lL_01)



مزید