اس حکمت عملی کا بنیادی خیال یہ ہے کہ ٹریڈنگ کو حقیقی وقت میں ماڈل کیا جائے ، ہفتہ وار ٹرانزیکشن ڈیٹا اکٹھا کیا جائے اور اس کے اعدادوشمار کو ٹیبل کی شکل میں دکھایا جائے تاکہ حکمت عملی کی کارکردگی کو زیادہ بصری طور پر دیکھا جاسکے۔ اس سے ہمیں حکمت عملی کی منافع بخش صورتحال کا فوری طور پر جائزہ لینے میں مدد مل سکتی ہے ، اس وقت کی مدت کی نشاندہی کی جاسکتی ہے جب حکمت عملی خراب کارکردگی کا مظاہرہ کر رہی ہے ، اور اس کے مطابق حکمت عملی کو ایڈجسٹ اور بہتر بنایا جاسکتا ہے۔
حساب کتاب کی مدت کے آغاز اور اختتام کا وقت طے کریں۔
اعدادوشمار کی درستگی اور ہر گروپ میں شامل ہفتوں کی تعداد طے کریں۔
آر ایس آئی کی حکمت عملی کو خریدنے اور بیچنے کے لئے استعمال کیا جاتا ہے۔
اعداد و شمار کی میز میں متغیرات کی وضاحت کریں.
موجودہ سائیکل کے نتائج کا حساب لگائیں۔
اگر سائیکل تبدیل ہوجاتا ہے اور تجارت کی اجازت دیتا ہے تو ، اس سائیکل کا وقت اور نتائج ریکارڈ کریں۔
اگر یہ آخری K لائن ہے اور تجارت کی اجازت ہے تو ، موجودہ سائیکل کا وقت اور نتائج درج کریں۔
اگر سائیکل تبدیل ہوتا ہے اور تجارت کی اجازت نہیں ہے تو ، پچھلے سائیکل کا وقت اور نتائج ریکارڈ کریں۔
سب سے زیادہ اور سب سے کم سائیکل کے نتائج تلاش کریں۔
رینڈرنگ کے اعدادوشمار کی میز
سب سے پہلے، اعداد و شمار کے دوروں کی کل تعداد کا حساب لگائیں.
ہر سائیکل، ٹائم ٹیبل، اور نتائج کے ذریعے گھومنا
ہر سیٹ کے نتائج کو جمع کرنا
رنگوں کے ساتھ مثبت اور منفی نتائج کو نشان زد کریں
آپ کو فوری طور پر حکمت عملی کی کارکردگی کا اندازہ کرنے کے لئے، اصل وقت میں ہفتہ وار ٹریڈنگ کے نتائج دیکھ سکتے ہیں
نتائج کو ایک نظر میں دکھائیں تاکہ حکمت عملی کے ناقص کارکردگی کا دورانیہ معلوم کیا جاسکے
حکمت عملی کے پیرامیٹرز کو ایڈجسٹ اور بہتر بنایا جاسکتا ہے جیسا کہ وقت کی مدت میں منافع بخش ہے
طویل مدتی پوزیشنوں کی حکمت عملی کے ساتھ ہفتوں کے لئے جمع ہونے والی آمدنی کو آسانی سے ٹریک کریں
مختلف ٹائم فریموں میں ٹریڈنگ کے شیلیوں کا موازنہ تجزیہ
اپنی مرضی کے مطابق اعداد و شمار کی درستگی اور گروپ ہفتوں کی تعداد مختلف ضروریات کے لئے
کوڈ کو سادہ، واضح، آسانی سے سمجھنے اور دوبارہ استعمال کرنے کے لئے
یہ حکمت عملی آر ایس آئی پر مبنی ہے اور اس میں ٹریڈنگ کی مشابہت ہوتی ہے اور اس میں ایک خرابی ہے کہ آر ایس آئی حکمت عملی کافی مضبوط نہیں ہے
فکسڈ مارکیٹ میں ، ٹرانزیکشن فیس نتائج پر زیادہ اثر انداز ہوتی ہے
ماضی کے اعداد و شمار کا استعمال کرتے ہوئے کی پیمائش ضروری نہیں کہ حقیقی ٹریڈنگ کے حالات کی عکاسی
اعدادوشمار کا انحصار اصل اکاؤنٹ فنڈز کی مقدار پر ہے ، اور اس کی جانچ پڑتال میں طے شدہ فنڈز کی مقدار درست نہیں ہوسکتی ہے۔
نگرانی کی ضرورت ہے کہ پالیسی پیرامیٹرز کو اندھا دھند تبدیل کرنے سے بچنے کے لئے
رجحانات کا فیصلہ کرنے کے لئے مزید اشارے کے ساتھ مل کر ، داخلہ اور باہر نکلنے کے نقطہ کو بہتر بنانے کے لئے ، آر ایس آئی کی حکمت عملی کو بڑھاوا دیا جاسکتا ہے۔ حقیقی پیرامیٹرز کے مطابق کمیشن لگانے پر دھیان دیں۔ ریٹرننگ مرحلے میں فنڈز کی مقدار میں اضافے کی اتار چڑھاؤ ، اسے حقیقت سے قریب تر بنائیں۔ شک و شبہ رکھیں ، اعدادوشمار کے نتائج کے مطابق حکمت عملی کو زیادہ سے زیادہ ایڈجسٹ کرنے سے گریز کریں۔
اسٹاپ نقصان کی منطق کو شامل کرنے پر غور کیا جاسکتا ہے تاکہ انفرادی نقصان کو کنٹرول کیا جاسکے
حکمت عملی کے پیرامیٹرز کو بہتر بنانے کے لئے ، جیسے کہ RSI کو ایڈجسٹ کرنا
مختلف تجارتی فریکوئینسیوں کو آزمائیں ، جیسے دن کے اندر تجارت یا ماہانہ پوزیشن رکھنا
مارکیٹ کے رجحانات اور انٹری ٹائمنگ کے لئے مزید اشارے شامل کیے جاسکتے ہیں
روک تھام منطق شامل کرنے پر غور کیا جا سکتا ہے
اعدادوشمار پیرامیٹرز کو بہتر بنانے کے لئے ترتیبات
ایک سے زیادہ اثاثوں کے لئے اعداد و شمار پر غور کیا جا سکتا ہے
اسٹاپ نقصان کی روک تھام کو شامل کرنے سے ، خطرات اور منافع کی شرح کو بہتر طور پر کنٹرول کیا جاسکتا ہے۔ آر ایس آئی پیرامیٹرز کو بہتر بنانا جیت کی شرح کو بہتر بنا سکتا ہے۔ مزید اشارے اور مختلف تجارتی تعدد کو اپنانے سے حکمت عملی کو زیادہ مستحکم بنایا جاسکتا ہے۔ اعدادوشمار کے پیرامیٹرز کو ایڈجسٹ کرنا نتائج کو زیادہ نمایاں بنا سکتا ہے۔ ایک اثاثہ سے ملٹی اثاثہ اعدادوشمار تک توسیع ، حکمت عملی کی تاثیر کا مجموعی اندازہ لگایا جاسکتا ہے۔
اس حکمت عملی کا مقصد سائیکل ٹریڈنگ کے نتائج کو جمع کرنا ہے ، تاکہ اسٹیٹ ٹیبلز کی شکل میں بصری طور پر دکھایا جاسکے ، جس سے حکمت عملی کے منافع کو مختلف وقت کے ادوار میں تیزی سے فیصلہ کیا جاسکے۔ اس سے حکمت عملی کی اصلاح کے لئے اعداد و شمار کی مدد ملتی ہے۔ اس کی خوبی یہ ہے کہ ہفتہ وار نتائج کو حقیقی وقت میں دیکھا جاسکتا ہے ، بصری طور پر واضح ہے ، اور اسے دوبارہ تیار کرنا آسان ہے۔
/*backtest
start: 2023-09-12 00:00:00
end: 2023-10-12 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
// strategy('Strategy weekly results as numbers v1', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=25, commission_type=strategy.commission.percent, commission_value=0.04)
after = input(title='Trade after', defval=timestamp('01 Jan 2019 00:00 UTC'), tooltip="Strategy will be executed after this timestamp. The statistic table will include only periods after this date.")
before = input(title='Trade before', defval=timestamp('31 Dec 2024 23:59 UTC'), tooltip="Strategy will be executes before this timestamp. The statistic table will include only periods before this date.")
statisticPrecision = input.int(title='Statistic precision', group='Statistic visualisation', defval=1, tooltip="Defines how many digits should be rendered in every statistic cell.")
statisticGroupSize = input.int(title='Statistic group size', group='Statistic visualisation', defval=12, tooltip="Defines how many cells should be in one group inside the statistic table.")
// determinet whether the starategy should be traded between the period
isTradeEnabled = true
// *******************************************************************************************
// Core strategy simulation logic
// *******************************************************************************************
// calculate rsi strategy emulation data
rsiEmulationData = ta.rsi(close, 7)
rsiEmulationCrossover = ta.crossover(rsiEmulationData, 70)
rsiEmulationCrossunder = ta.crossunder(rsiEmulationData, 30)
// entry loogic based on the rsi calculations
if (isTradeEnabled and rsiEmulationCrossover)
strategy.entry('Long', strategy.long)
if (isTradeEnabled and rsiEmulationCrossunder)
strategy.entry('Short', strategy.short)
// *******************************************************************************************
// Weekly statistics table
// *******************************************************************************************
// define statistic variables
var statisticTable = table(na)
var statisticPeriodTime = array.new_int(0)
var statisticPeriodResult = array.new_float(0)
var statisticIsLatestCalculated = bool(na)
var statisticResultHighest = float(na)
var statisticResultLowest = float(na)
var statisticColorGray = color.new(color.gray, transp = 60)
var statisticColorGreen = color.new(color.green, transp = 60)
var statisticColorRed = color.new(color.red, transp = 60)
// claculate current period result
barResult = not na(strategy.equity[1])
? (strategy.equity / strategy.equity[1] - 1) : 0
isPeriodChanged = not na(time[1]) and weekofyear(time) != weekofyear(time[1])
currentPeriodResult = 0.0
currentPeriodResult := not na(currentPeriodResult[1]) and not isPeriodChanged
? ((1 + currentPeriodResult[1]) * (1 + barResult) - 1) : 0.0
// initialise highest and lowest results variables
statisticResultHighest := na(statisticResultHighest) ? currentPeriodResult : statisticResultHighest
statisticResultLowest := na(statisticResultLowest) ? currentPeriodResult : statisticResultLowest
// search for highest and lowest results
statisticResultHighest := currentPeriodResult > statisticResultHighest ? currentPeriodResult : statisticResultHighest
statisticResultLowest := currentPeriodResult < statisticResultLowest ? currentPeriodResult : statisticResultLowest
// new week while trade is active
if isPeriodChanged and isTradeEnabled
timeCalculated = time - 1000 * 60 * 60 * 24 * 7
resultCalculated = currentPeriodResult[1]
statisticIsLatestCalculated := false
array.push(statisticPeriodTime, timeCalculated)
array.push(statisticPeriodResult, resultCalculated)
// latest bar while trade is active
if barstate.islast and isTradeEnabled
timeCalculated = time - 1000 * 60 * 60 * 24 * (dayofweek(time) - 2)
resultCalculated = currentPeriodResult
array.push(statisticPeriodTime, timeCalculated)
array.push(statisticPeriodResult, resultCalculated)
// new week after trade disabled
if isPeriodChanged and not isTradeEnabled and not na(statisticIsLatestCalculated) and not statisticIsLatestCalculated
timeCalculated = time - 1000 * 60 * 60 * 24 * (dayofweek(time) + 5)
resultCalculated = currentPeriodResult[1]
statisticIsLatestCalculated := true
array.push(statisticPeriodTime, timeCalculated)
array.push(statisticPeriodResult, resultCalculated)
// render statistics table
if barstate.islast
statisticLength = array.size(statisticPeriodResult)
statisticTableSteps = math.floor(statisticLength / statisticGroupSize) + (statisticLength % statisticGroupSize != 0 ? 1 : 0)
statisticTable := table.new(position.bottom_right, columns = statisticGroupSize + 2, rows = statisticTableSteps + 1, border_width = 1)
// render headers
for i = 0 to (statisticGroupSize - 1)
statisticHeaderContent = str.tostring(i + 1)
table.cell(statisticTable, 1 + i, 0, statisticHeaderContent, bgcolor = statisticColorGray)
// render time points
for i = 0 to (statisticTableSteps - 1)
statisticPointContent = str.format("{0,date,medium}", array.get(statisticPeriodTime, i * statisticGroupSize))
table.cell(statisticTable, 0, 1 + i, statisticPointContent, bgcolor = statisticColorGray)
// render the result
statisticResultCummulative = 0.0
for i = 0 to (array.size(statisticPeriodTime) - 1)
statisticColumn = 1 + i % statisticGroupSize
statisticRow = 1 + math.floor(i / statisticGroupSize)
statisticResult = array.get(statisticPeriodResult, i)
statisticResultCummulative := (i % statisticGroupSize == 0) ? 0.0 : statisticResultCummulative
statisticResultCummulative := (1 + statisticResultCummulative) * (1 + statisticResult) - 1
statisticResultColor = statisticResult > 0 ? statisticColorGreen : statisticColorRed
table.cell(statisticTable, statisticColumn, statisticRow, str.tostring(math.round(statisticResult * 100, statisticPrecision)), bgcolor = statisticResultColor)
// if it is the last item of the row or data array
isStatisticLastOfTheRow = ((i + 1) % statisticGroupSize) == 0
isStatisticLastOfTheData = i == (statisticLength - 1)
if (isStatisticLastOfTheRow or isStatisticLastOfTheData)
resultsTableCummulativeCellColor = statisticResultCummulative > 0 ? statisticColorGreen : statisticColorRed
resultsTableCummulativeCellContent = str.tostring(math.round(statisticResultCummulative * 100, statisticPrecision))
table.cell(statisticTable, 1 + statisticGroupSize, statisticRow, resultsTableCummulativeCellContent, bgcolor = resultsTableCummulativeCellColor)