Основная идея этой стратегии заключается в моделировании торговли в режиме реального времени, сборе еженедельных торговых данных и представлении статистики в таблице для более интуитивного обзора эффективности стратегии.
Установите время начала и окончания расчетного периода.
Установите точность статистики и количество недель в каждой группе.
Симулируйте стратегию RSI для входа и выхода.
Определите переменные для таблицы статистики.
Вычислить результат за текущий период.
Если изменение периода и торговля включены, запишите время и результат за этот период.
Если это последняя строка и торговля включена, запишите время и результат за текущий период.
Если изменяется период и торговля отключена, записывается время и результат за предыдущий период.
Найдите самые высокие и самые низкие результаты периода.
Передай таблицу статистики.
Сначала вычислить общее количество статистических периодов
Итерация через каждый период, заголовки, время и результаты
Суммарно вычислить результат для каждой группы
Положительные и отрицательные результаты с цветовым кодом
Может наблюдать за еженедельными результатами в режиме реального времени для быстрой оценки стратегии
Интуитивное представление результатов для более четкого понимания
Помощь в выявлении периодов плохих результатов для корректировки стратегии
Удобно для отслеживания совокупной прибыли для долгосрочных стратегий
Может сравнивать торговые стили в разные периоды времени
Настраиваемая точность и группы для удовлетворения различных потребностей
Простой и понятный код, легкий для понимания и расширения
Стратегия основана на RSI, который имеет неотъемлемую тенденцию вследствие ограничений
Торговые издержки могут существенно повлиять на фактические результаты
Данные обратных тестов могут не отражать фактические рыночные условия
Капитал дефолта при обратном тестировании может не соответствовать размеру реального счета
Избегайте чрезмерной настройки, слепо настраивая параметры на основе статистики
Может включать больше индикаторов тренда и оптимизировать входы и выходы для улучшения базовой стратегии RSI. Используйте фактические торговые затраты в живой торговле. Добавьте случайность к размеру капитала в бэкстестесте. Сохраняйте скептицизм вместо перенастройки на основе статистики.
Подумайте о добавлении стоп-лосса для ограничения снижения
Оптимизируйте параметры RSI, такие как уровни перекупленности и перепродажи
Попробуйте разные частоты торговли, например, внутридневные или ежемесячные.
Включить больше показателей тенденции и сроков
Добавить логику получения прибыли
Оптимизировать настройки статистических параметров
Расширить для отслеживания нескольких активов
Стопы могут лучше управлять риском / вознаграждением. Настройка 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)