
Эта стратегия представляет собой многопрофильную торговую систему, которая сочетает в себе пересекающийся сигнал простой скользящей средней (SMA) и контроль за пиковым отступлением. Она использует пересекание 14- и 28-дневных SMA для создания многопрофильных торговых сигналов, а также для мониторинга пиковых отступлений стратегии в режиме реального времени.
Сигналы транзакций генерируются:
Контроль за пиковым отказом:
Анализ циклов пик-долина:
В сочетании с отслеживанием тенденций и управлением рисками: SMA-поперечная стратегия является классическим методом отслеживания трендов, а пиковый откатный контроль обеспечивает дополнительный уровень управления риском. Эта комбинация позволяет эффективно контролировать нисходящий риск, одновременно улавливая рыночные тенденции.
Умение адаптироваться: Благодаря параметрической установке максимальных и минимальных отступных отступных, стратегия может быть гибко адаптирована в зависимости от различных рыночных условий и личных предпочтений в отношении риска.
Прозрачные показатели риска: Анализ пиковых и дновых циклов предоставляет подробную историческую информацию об отступлениях, что позволяет трейдерам получить интуитивное представление о рисковых характеристиках стратегии, что помогает принимать более обоснованные торговые решения.
Автоматизация управления рисками: Когда вывод превышает заданный порог, стратегия автоматически прекращает торговлю, что эффективно предотвращает продолжающиеся убытки в неблагоприятных рыночных условиях.
Полный анализ результатов: В дополнение к обычным показателям отсчета, стратегия также предоставляет подробные данные о пиковых и дновых циклах, включая информацию о росте, размере и времени отступления, что помогает глубоко проанализировать эффективность стратегии.
Слишком большое доверие к историческим данным: Стремительная смена SMA, основанная на исторических ценовых данных, может задерживать реакцию на быстро меняющиеся рынки, вызывая ошибочные сигналы.
Частые сделки: В условиях нестабильных рынков SMA могут часто пересекаться, что приводит к чрезмерному количеству сделок и высокой стоимости сделок.
Потенциальное существенное отступление: Несмотря на то, что существует максимальный контроль за отступлением, одно крупное падение может привести к значительным потерям в условиях сильной волатильности рынка.
Чувствительность параметров: Высокая эффективность стратегии зависит от выбора циклов SMA и отмены порога, а неправильная параметровая настройка может привести к неудачным результатам.
Потеря возможности вернуться: При достижении максимальной отзывной отметки и прекращении торгов, стратегия может упустить возможности, связанные с рыночным переворотом.
Введение динамических параметров: Можно рассмотреть возможность корректировки циклов SMA и снятия отметки в зависимости от динамики рыночных колебаний, чтобы адаптироваться к различным рыночным условиям.
Добавление дополнительных рыночных фильтров: В сочетании с другими техническими показателями или фундаментальными факторами, такими как RSI или объем торгов, фильтруют потенциальные ложные сигналы.
Поступление и выезд в группах: Вместо того, чтобы работать с полным складом, можно строить склады в группах, чтобы снизить риск принятия единоличных решений.
Присоединяйтесь к механизму сдерживания: На базе снятия контроля, добавление динамической функции остановки, чтобы закрепить прибыль и повысить общую доходность.
Оптимизация управления капиталом: Внедрение динамического управления позициями на основе размеров счетов и рыночной волатильности для лучшего контроля риска.
Введение алгоритмов машинного обучения: Использование технологий машинного обучения для оптимизации процесса выбора параметров и генерации сигналов, повышения адаптивности и точности стратегий.
SMA-поперечная многопрофильная стратегия, объединяющая контроль за пиковым отступлением и автоматическое прекращение, является количественной торговой системой, которая сочетает в себе отслеживание тенденции и управление рисками. Она захватывает рыночные тенденции путем скрещивания простых движущихся средних, а также использует контроль за пиковым отступлением для управления рисками снижения.
Хотя существуют некоторые риски, присущие стратегии, такие как чрезмерная зависимость от исторических данных и чувствительности к параметрам, ее устойчивость и доходность могут быть значительно улучшены с помощью соответствующих оптимизаций и улучшений, таких как введение динамических корректировок параметров, добавление дополнительных рыночных фильтров и более интеллектуальное управление средствами.
В целом, эта стратегия предоставляет трейдерам хорошую стартовую точку, на основе которой можно проводить дальнейшую настройку и оптимизацию, чтобы удовлетворить индивидуальные торговые цели и предпочтения риска. Модульная конструкция стратегии также позволяет легко интегрироваться с другими торговыми стратегиями или технологиями управления рисками, что создает основу для построения более сложной и всеобъемлющей торговой системы.
/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
capital = 10000
//@version=5
strategy(title = "Correct Strategy Peak-Drawdown Cycles [Tradingwhale]", shorttitle = "Peak-Draw [Tradingwhale]", initial_capital = capital, overlay=true, margin_long=100, margin_short=100)
// The code below is from Tradingwhale LLC
/// ==============================================================================
// Peak-Trough Cycles with Date and Prev. RunUp
// Initialize variables
showTable = input.bool(true, title = "Plot Peak to Bottom Drawdown Cycles table?")
min_trough = input.float(3.0, title = "Define Minimum Drawdown/Trough to Display (%)", minval = 1, maxval = 100, step = 0.5, tooltip = "Peaks and Trough Cycles have to be roped in by either a lookback period or minmimum troughs to show. If you don't then every bar could be a peak or trough/bottom. I've decided to use minimum declines here because lookback seems more arbitrary.")
maxdraw = input.float(40.0, title = "Max Drawdown", minval = 1, maxval = 100, step = 0.5, tooltip = "Define the drawdown level where the srtategy stops executing trades.")
var float equityPeak = na
var float equityTrough = na
var int cycleCount = 0
var bool inDrawdown = false
var float initialCapital = capital
var float prevTrough = initialCapital
var float prevRunUp = na
var bool useLighterGray = true
var int lastYear = na
// Variable to indicate whether the strategy should end
var bool end_strategy = false
// Table to display data
var table resultTable = table.new(position.top_right, 5, 30, bgcolor=#ffffff00, frame_color=#4f4040, frame_width=1)
// Function to convert float to percentage string
f_to_percent(value) =>
str.tostring(value, "#.##") + "%"
// Function to get month/year string without commas
get_month_year_string() =>
str.tostring(year) + "/" + str.tostring(month)
// Update the table headers
if (bar_index == 0 and showTable)
table.cell(resultTable, 0, 0, "Show Min Trough: " + f_to_percent(min_trough), bgcolor=#a8a8a88f, text_size=size.normal)
table.cell(resultTable, 1, 0, "Cycle Count", bgcolor=#a8a8a88f, text_size=size.normal)
table.cell(resultTable, 2, 0, "Prev.RunUp(%)", bgcolor=#a8a8a88f, text_size=size.normal)
table.cell(resultTable, 3, 0, "Drawdown(%)", bgcolor=#a8a8a88f, text_size=size.normal)
table.cell(resultTable, 4, 0, "Year/Month", bgcolor=#a8a8a88f, text_size=size.normal)
// Track peaks and troughs in equity
if (na(equityPeak) or strategy.equity > equityPeak)
if (inDrawdown and strategy.equity > equityPeak and not na(equityTrough)) // Confirm end of drawdown cycle
drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100
if drawdownPercentage > min_trough
cycleCount += 1
prevRunUp := (equityPeak - prevTrough) / prevTrough * 100
if cycleCount <= 20 and showTable
currentYear = year
if na(lastYear) or currentYear != lastYear
useLighterGray := not useLighterGray
lastYear := currentYear
rowColor = useLighterGray ? color.new(color.gray, 80) : color.new(color.gray, 50)
table.cell(resultTable, 1, cycleCount, str.tostring(cycleCount), bgcolor=rowColor, text_size=size.normal)
table.cell(resultTable, 2, cycleCount, f_to_percent(prevRunUp), bgcolor=rowColor, text_size=size.normal)
table.cell(resultTable, 3, cycleCount, f_to_percent(drawdownPercentage), bgcolor=rowColor, text_size=size.normal)
table.cell(resultTable, 4, cycleCount, get_month_year_string(), bgcolor=rowColor, text_size=size.normal)
prevTrough := equityTrough
equityPeak := strategy.equity
equityTrough := na
inDrawdown := false
else if (strategy.equity < equityPeak)
equityTrough := na(equityTrough) ? strategy.equity : math.min(equityTrough, strategy.equity)
inDrawdown := true
// Calculate if the strategy should end
if not na(equityPeak) and not na(equityTrough)
drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100
if drawdownPercentage >= maxdraw
end_strategy := true
// This code below is from Tradingview, but with additions where commented (see below)
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/
strategy.entry("My Long Entry Id", strategy.long)
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/
strategy.entry("My Short Entry Id", strategy.short)