
Стратегия является торговой системой, основанной на показателях SuperTrend, в сочетании с полной графической аналитикой производительности, которая позволяет отслеживать и анализировать эффективность стратегии в разные периоды времени. Стратегия генерирует торговые сигналы через ATR (средняя реальная волновая amplitude) и показатель SuperTrend, а также встроенный мощный инструмент анализа производительности, который позволяет проводить статистический анализ эффективности торгов в разные торговые дни в неделю и в разные дни месяца, предоставляя трейдерам поддержку в принятии решений, основанных на данных, чтобы помочь идентифицировать оптимальные торговые моменты и оптимизировать торговые стратегии.
В основе этой стратегии лежат две части: механизм генерации торговых сигналов и система анализа производительности.
Механизм генерации торговых сигналов:
Система анализа производительности:
Эта стратегия использует объектно-ориентированные свойства Pine Script, создает класс DayStats для хранения и обновления статистических данных о сделках, обеспечивает эффективное управление данными и вычисления. Функция update_all_stats () обновляет соответствующую статистическую информацию в конце каждой сделки, гарантируя, что данные о производительности в реальном времени отражают последние результаты сделки.
Полный анализ измерений времениНаиболее заметным преимуществом этой стратегии является возможность глубокого анализа торговой деятельности с точки зрения времени, что помогает трейдерам определить, какие конкретные даты или дни недели наиболее эффективны для торговли, что обеспечивает надежную базу данных для стратегии отбора времени.
Поддержка принятия решений на основе данныхС помощью подробной статистики ключевых показателей, таких как выигрыш, убыток и чистая прибыль за каждый торговый день, трейдер может принимать торговые решения на основе объективных данных, а не на основе субъективных чувств, что уменьшает влияние эмоциональных факторов.
Усиление управления рискамиПризнание исторических неудачных торговых дней позволяет трейдерам избегать торговли в эти дни или корректировать размер позиции, что позволяет снизить системный риск.
Визуализация показаВстроенная в стратегию табличная функция визуализирует торговые показатели в разные периоды времени, используя различные цвета для отображения состояния прибыли и убытков, что позволяет трейдерам получить представление о стратегии.
Высокая настройка: Стратегия предоставляет множество входных параметров, включая циклы ATR, фактор SuperTrend, расположение таблицы и цветовые настройки, позволяя трейдерам приспосабливаться к личным предпочтениям и рыночным особенностям.
Гибкая интеграция: Код части анализа производительности разработан таким образом, чтобы его можно было легко интегрировать в другие торговые стратегии, что повышает их практичность и масштабируемость.
Недостаточные образцы рискаВ условиях небольшого количества торговых образцов статистические результаты на определенные даты могут не быть статистически значимыми, и решения, принятые на основе этих ограниченных данных, могут привести к ошибочному оптимизации. Решение заключается в том, чтобы обеспечить достаточно длинный период отсчета и получить больше торговых образцов для повышения статистической надежности.
Риск переизмеримости: чрезмерная зависимость от исторических показателей в определенные даты может привести к тому, что стратегия будет перенастраиваться на исторические данные, а в будущем она будет неэффективна при изменении рыночной обстановки. Трейдеры должны использовать временный анализ в качестве ориентира, а не единственной основы для принятия решений, и регулярно проверять стабильность результатов анализа.
Ограничения механизма генерации сигналаСупертендерный индикатор может часто давать ложные сигналы в нестабильных рынках, что приводит к чрезмерной торговле и ненужным потерям. Рекомендуется использовать его в сильных трендовых рынках или в сочетании с другими подтверждающими индикаторами для фильтрации ложных сигналов.
Расчет расхода ресурсовС увеличением количества сделок увеличивается объем данных, которые требуется хранить и обрабатывать системе анализа производительности, что может повлиять на эффективность работы стратегии. Следует обратить внимание на потребление ресурсов в долгосрочных отсчетах или реальных сделках.
Влияние сезонных факторовВ некоторых рынках существуют сезонные закономерности, и сезонные эффекты более длительных периодов могут быть проигнорированы при анализе только по недельным или ежемесячным датам. Можно рассмотреть возможность добавления квартального или годового анализа для захвата более длительных периодов.
Анализ нескольких временных рамокТекущая стратегия анализирует производительность только в одном временном периоде, но она может быть расширена для одновременного анализа транзакционных показателей в нескольких временных периодах, например, для одновременного изучения различий в производительности на дневной, 4-часовой и 1-часовой линиях, чтобы получить более полную информацию о временных измерениях.
Дополнительная классификация рыночных условийВключение в анализ производительности классификации рыночных условий, например, разделение на показатели в условиях трендовых и шокирующих рынков или различия в условиях высокой и низкой волатильности, помогает обнаружить преимущества и недостатки стратегии в конкретной рыночной среде.
Система оценки качества сигналаВнедрение системы оценки качества сигнала, оценка каждого торгового сигнала на основе факторов, таких как согласованность технических показателей, структура цен, подтверждение количества сделок, а также включение измерения качества сигнала в анализ производительности, что помогает идентифицировать характеристики высококачественного сигнала.
Самостоятельная оптимизация параметровАвтоматическая корректировка ATR-циклов и коэффициентов SuperTrend на основе исторических данных о производительности, позволяя стратегии адаптироваться к изменениям в различных рыночных условиях, повышая адаптивность и устойчивость стратегии.
Интеграция данных экономического календаряИнтеграция информации о событиях, таких как публикация важных экономических данных, решения центральных банков, в аналитику эффективности, изучение закономерностей поведения торгов перед и после конкретных экономических событий, предоставление трейдерам поддержки принятия решений на основе событий.
Расширенные статистические показателиДобавление дополнительных статистических показателей, таких как максимальная последовательность прибылей/убытков, средний коэффициент прибыли/убытков, коэффициент Шарпа и т.д., чтобы обеспечить более глубокую оценку производительности и помочь трейдерам получить более полное представление о характеристиках стратегии.
Опознание моделей машинного обученияВнедрение простых алгоритмов машинного обучения, которые автоматически идентифицируют потенциальные временные модели и закономерности из исторических данных о производительности, прогнозируют возможную производительность в будущем торговом дне и обеспечивают прогрессивное руководство для принятия торговых решений.
Стратегия оптимизации SuperTrend - это инновационная стратегия, которая объединяет систему торговли, отслеживающую тенденции, и полный анализ производительности во времени. Стратегия не только предоставляет торговые сигналы, основанные на показателях SuperTrend, но и, что более важно, создает мощную аналитическую структуру, способную систематически оценивать различия в эффективности стратегии в течение различных временных периодов.
Благодаря детальному отслеживанию результатов торгов в разные дни недели и месяца, трейдеры могут идентифицировать временные модели, имеющие статистические преимущества, и целенаправленно оптимизировать торговые стратегии. Ценность этой аналитической структуры не ограничивается только текущими стратегиями SuperTrend, но также может быть легко интегрирована в другие торговые системы, чтобы обеспечить оптимизацию временных измерений для различных видов стратегий.
Такой подход, основанный на данных, повышает уровень интуитивной торговли до уровня количественного анализа, позволяя трейдерам принимать более рациональные решения на основе объективных статистических данных. По мере накопления и расширения аналитического измерения торговой выборки, ценность этой стратегии будет еще больше повышаться, предоставляя трейдерам все более точные рекомендации по оптимизации времени.
/*backtest
start: 2024-07-25 00:00:00
end: 2025-07-23 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/
//@version=6
strategy("Daily Performance Analysis [Mr_Rakun]", overlay=true)
atrPeriod = input(10, "ATR Length")
factor = input.float(3.0, "Factor", step = 0.01)
[st, direction] = ta.supertrend(factor, atrPeriod)
if ta.change(direction) < 0
strategy.entry("My Long Entry Id", strategy.long)
if ta.change(direction) > 0
strategy.entry("My Short Entry Id", strategy.short)
plot(st, title="SuperTrend", color=st < close ? color.green : color.red, linewidth=2)
//-------------------------------------------------------------
// Copy the rest of this line and add it to your own strategy.
// Daily Performance
type DayStats
int wins = 0
int losses = 0
float gross_profit = 0.0
float gross_loss = 0.0
update(DayStats ds, float profit) =>
if profit > 0
ds.wins += 1
ds.gross_profit += profit
else
ds.losses += 1
ds.gross_loss += math.abs(profit)
net_profit(DayStats ds) => ds.gross_profit - ds.gross_loss
profit_factor(DayStats ds) => ds.gross_loss > 0 ? ds.gross_profit / ds.gross_loss : na
winrate(DayStats ds) =>
total = ds.wins + ds.losses
total > 0 ? (ds.wins / total) * 100 : na
// ================== GLOBAL OBJECTS ==================
var DayStats monday = DayStats.new()
var DayStats tuesday = DayStats.new()
var DayStats wednesday = DayStats.new()
var DayStats thursday = DayStats.new()
var DayStats friday = DayStats.new()
var DayStats saturday = DayStats.new()
var DayStats sunday = DayStats.new()
var array<DayStats> monthStats = array.new<DayStats>()
// ================== UPDATE METHOD ==================
update_all_stats() =>
if barstate.isfirst
for i = 0 to 30
array.push(monthStats, DayStats.new())
if strategy.closedtrades > strategy.closedtrades[1]
idx = strategy.closedtrades - 1
profit = strategy.closedtrades.profit(idx)
poz_time = strategy.closedtrades.entry_time(idx)
dom = dayofmonth(poz_time)
day = dayofweek(poz_time)
DayStats day_stats = switch day
dayofweek.sunday => sunday
dayofweek.monday => monday
dayofweek.tuesday => tuesday
dayofweek.wednesday => wednesday
dayofweek.thursday => thursday
dayofweek.friday => friday
dayofweek.saturday => saturday
if na(day_stats) == false
update(day_stats, profit)
if dom >= 1 and dom <= 31
DayStats mstats = array.get(monthStats, dom - 1)
update(mstats, profit)
day_stats
update_all_stats()
// Table positioning inputs
weekly_position = input.string("Top Center", "Weekly Table Position",
options=["Top Left", "Top Center", "Top Right", "Middle Left", "Middle Center", "Middle Right", "Bottom Left", "Bottom Center", "Bottom Right"])
monthly_position = input.string("Top Right", "Monthly Table Position",
options=["Top Left", "Top Center", "Top Right", "Middle Left", "Middle Center", "Middle Right", "Bottom Left", "Bottom Center", "Bottom Right"])
// Color inputs
header_bg_color = input.color(color.gray, "Header Background Color")
profit_color = input.color(color.lime, "Profit Color")
loss_color = input.color(color.red, "Loss Color")
neutral_color = input.color(color.gray, "Neutral Color")
row_bg_color = input.color(color.new(color.gray, 60), "Row Background Color")
// Function to get table position
get_table_position(string pos) =>
switch pos
"Top Left" => position.top_left
"Top Center" => position.top_center
"Top Right" => position.top_right
"Middle Left" => position.middle_left
"Middle Center" => position.middle_center
"Middle Right" => position.middle_right
"Bottom Left" => position.bottom_left
"Bottom Center" => position.bottom_center
"Bottom Right" => position.bottom_right
=> position.top_center
// TABLE PRINTING
draw_table_headers(table weekly, table monthly) =>
table.cell(weekly, 0, 0, "DAY", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(weekly, 1, 0, "W/L (Count)", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(weekly, 2, 0, "NET PROFIT", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(weekly, 3, 0, "PROFIT FACTOR",text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(weekly, 4, 0, "WINRATE", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(monthly, 0, 0, "DAY", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(monthly, 1, 0, "W/L (Count)", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(monthly, 2, 0, "NET PROFIT", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(monthly, 3, 0, "PROFIT FACTOR",text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(monthly, 4, 0, "WINRATE", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
fill_weekly_row(table tbl, int row, string day_name, DayStats ds) =>
net_p = net_profit(ds)
pf = profit_factor(ds)
wr = winrate(ds)
status_color = net_p > 0 ? profit_color: (net_p < 0 ? loss_color : neutral_color)
table.cell(tbl, 0, row, day_name, text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
table.cell(tbl, 1, row, str.tostring(ds.wins) + "/" + str.tostring(ds.losses), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
table.cell(tbl, 2, row, str.tostring(net_p, '#,###.##'), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
table.cell(tbl, 3, row, str.tostring(pf, '0.00'), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
table.cell(tbl, 4, row, str.tostring(wr, format.percent), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
fill_monthly_row(table tbl, int row, int day, DayStats ds) =>
net_p = net_profit(ds)
pf = profit_factor(ds)
wr = winrate(ds)
status_color = net_p > 0 ? profit_color : (net_p < 0 ? loss_color : neutral_color)
table.cell(tbl, 0, row, str.tostring(day), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
table.cell(tbl, 1, row, str.tostring(ds.wins) + "/" + str.tostring(ds.losses), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
table.cell(tbl, 2, row, str.tostring(net_p, '#,###.##'), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
table.cell(tbl, 3, row, str.tostring(pf, '0.00'), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
table.cell(tbl, 4, row, str.tostring(wr, format.percent), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
var table weekly_table = table.new(get_table_position(weekly_position), 5, 8)
var table monthly_table = table.new(get_table_position(monthly_position), 5, 32)
if barstate.isconfirmed
draw_table_headers(weekly_table, monthly_table)
fill_weekly_row(weekly_table, 1, "MON", monday)
fill_weekly_row(weekly_table, 2, "TUE", tuesday)
fill_weekly_row(weekly_table, 3, "WED", wednesday)
fill_weekly_row(weekly_table, 4, "THU", thursday)
fill_weekly_row(weekly_table, 5, "FRI", friday)
fill_weekly_row(weekly_table, 6, "SAT", saturday)
fill_weekly_row(weekly_table, 7, "SUN", sunday)
for i = 0 to 30
DayStats ms = array.get(monthStats, i)
if ms.wins + ms.losses > 0
fill_monthly_row(monthly_table, i + 1, i + 1, ms)