গতিশীল কৌশল বিশ্লেষণ টুল


সৃষ্টির তারিখ: 2023-10-13 15:54:35 অবশেষে সংশোধন করুন: 2023-10-13 15:54:35
অনুলিপি: 1 ক্লিকের সংখ্যা: 680
1
ফোকাস
1617
অনুসারী

ওভারভিউ

এই কৌশলটির মূল ধারণাটি হ’ল রিয়েল-টাইম ট্রেডিং মডেলিং, সাপ্তাহিক ট্রেডিং ডেটা সংগ্রহ করা এবং কৌশলটির কার্যকারিতা আরও স্বজ্ঞাতভাবে দেখার জন্য একটি টেবিলের আকারে পরিসংখ্যানগত ফলাফল উপস্থাপন করা। এটি আমাদের কৌশলটির লাভজনকতা দ্রুত মূল্যায়ন করতে সহায়তা করে, কৌশলটি খারাপভাবে কাজ করছে এমন সময়সীমা খুঁজে বের করতে এবং কৌশলটি সংশোধন ও অপ্টিমাইজ করতে সহায়তা করে।

কৌশল নীতি

  1. গণনা চক্রের শুরু এবং শেষের সময় নির্ধারণ করুন

  2. পরিসংখ্যানের নির্ভুলতা এবং প্রতিটি গ্রুপে সপ্তাহের সংখ্যা সেট করুন।

  3. আরএসআই-এর মডিউল তৈরি করা হয়েছে।

  4. পরিসংখ্যান টেবিলের ভেরিয়েবল সংজ্ঞায়িত করুন।

  5. বর্তমান চক্রের ফলাফল গণনা করুন।

  6. যদি চক্র পরিবর্তিত হয় এবং ট্রেড করার অনুমতি দেয়, তাহলে এই চক্রের সময় এবং ফলাফল রেকর্ড করুন।

  7. যদি এটি শেষ K লাইন হয় এবং লেনদেনের অনুমতি দেয়, বর্তমান চক্রের সময় এবং ফলাফল রেকর্ড করুন।

  8. যদি চক্র পরিবর্তিত হয় এবং ট্রেডিং অনুমোদিত না হয়, তাহলে শেষ চক্রের সময় এবং ফলাফল রেকর্ড করুন।

  9. সর্বাধিক এবং সর্বনিম্ন চক্রের ফলাফল খুঁজুন।

  10. রেন্ডারিং পরিসংখ্যান

  • প্রথমে মোট পরিসংখ্যান চক্র গণনা করুন

  • প্রতিটি চক্রের মধ্য দিয়ে যান, টেবিল, সময় এবং ফলাফল রঙ করুন

  • প্রতিটি চক্রের ফলাফলের জন্য একত্রিত করা

  • ধনাত্মক ও ঋণাত্মক ফলাফল রঙে চিহ্নিত করুন

সামর্থ্য বিশ্লেষণ

  • রিয়েল-টাইম সাপ্তাহিক ট্রেডিং ফলাফল দেখুন, দ্রুত কৌশলগত কার্যকারিতা মূল্যায়ন করুন

  • একটি কৌশলগত ব্যর্থতার সময়কাল খুঁজে বের করার জন্য ফলাফলগুলিকে প্রথম নজরে প্রদর্শন করা

  • কৌশলগত প্যারামিটারগুলিকে সময়কালের মুনাফা-ক্ষতির উপর ভিত্তি করে সামঞ্জস্য করা এবং অপ্টিমাইজ করা যায়

  • দীর্ঘমেয়াদী পজিশনিং কৌশল থেকে সহজেই বহু-সপ্তাহের ক্রমবর্ধমান উপার্জন ট্র্যাক করা যায়

  • বিভিন্ন সময়কালের ট্রেডিং শৈলীর তুলনামূলক বিশ্লেষণ করা যায়

  • কাস্টমাইজড পরিসংখ্যান সঠিকতা এবং বিভিন্ন চাহিদা পূরণের জন্য সপ্তাহের সংখ্যা

  • কোডটি সহজ, পরিষ্কার, সহজে বোঝা যায় এবং পুনর্ব্যবহারযোগ্য

ঝুঁকি বিশ্লেষণ

  • এই কৌশলটি আরএসআই-এর উপর ভিত্তি করে ট্রেডিংয়ের মডেল তৈরি করে, আরএসআই কৌশলটি নিজেই প্রবণতা অনুসরণ করার জন্য যথেষ্ট শক্তিশালী নয়

  • রিয়েল এস্টেটে, লেনদেনের খরচ ফলাফলের উপর প্রভাব ফেলে

  • ঐতিহাসিক ডেটা ব্যবহার করা হয়, যা প্রকৃত ট্রেডিং পরিস্থিতি প্রতিফলিত করতে পারে না

  • পরিসংখ্যানগত ফলাফলগুলি প্রকৃত অ্যাকাউন্টের পরিমাণের উপর নির্ভর করে, ব্যাকমেটেড ডিফল্ট পরিমাণটি সঠিক হতে পারে না

  • সতর্কতা অবলম্বন করা প্রয়োজন যাতে ওভারফিট করা যায় না এবং ফিডব্যাকের উপর ভিত্তি করে নীতির প্যারামিটারগুলিকে অন্ধভাবে পরিবর্তন করা যায়

আরও সূচকগুলি প্রবণতা নির্ধারণের জন্য সংযুক্ত করা যেতে পারে, আরএসআই কৌশলকে শক্তিশালী করার জন্য প্রবেশের এবং প্রস্থান পয়েন্টগুলিকে অনুকূলিতকরণ করা যেতে পারে। রিয়েল-টাইম ট্রেডিংয়ের সময় সত্যিকারের প্যারামিটারগুলির উপর ভিত্তি করে কমিশন সেট করার বিষয়ে সতর্কতা অবলম্বন করুন। রিটার্নিং পর্যায়ে তহবিলের পরিমাণ বাড়িয়ে তুলুন, এটি বাস্তবতার আরও কাছাকাছি করুন ইত্যাদি। সন্দেহজনক হওয়া উচিত এবং পরিসংখ্যানগত ফলাফলের উপর ভিত্তি করে কৌশলটিকে অত্যধিক সামঞ্জস্য করা এড়ানো উচিত।

অপ্টিমাইজেশান দিক

  • স্টপ লস লজিক যুক্ত করার কথা বিবেচনা করা যেতে পারে, একক ক্ষতি নিয়ন্ত্রণ করতে

  • কৌশলগত প্যারামিটারগুলিকে অপ্টিমাইজ করা যায়, যেমন 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)