
Эта стратегия использует трехмесячные скользящие средние, чтобы определить направление рыночных тенденций. Вы вступаете в позицию, когда три скользящих средних совпадают. Вместе с тем устанавливается стоп-лост в сочетании с самой высокой или самой низкой ценой последней N-корневой линии K.
Вычислить три скользящие средние: долгосрочную, среднесрочную и краткосрочную. Пользователь может самостоятельно установить период. По умолчанию 20 дней, 10 дней и 5 дней.
Сравнение направления трех скользящих средних. Когда краткосрочные скользящие средние проходят средний период, а средние - длительный период, это считается многоголовым рынком. Когда краткосрочные скользящие средние проходят средний период, а средние - длительный период, это считается пустым рынком.
В многоголовном рынке, если цена прорывает самую высокую цену в пределах последней N-корневой K-линии, делается больше; в пустом рынке, если цена прорывает самую низкую цену в пределах последней N-корневой K-линии, делается пусто. N также является пользовательским параметром.
После вхождения в позицию, установка стоп-лосса. Стоп-лосса на многоголовом рынке - это самая низкая цена в пределах последней N-корневой K-линии, стоп-лосса на пустом рынке - самая высокая цена в пределах последней N-корневой K-линии.
Эта стратегия в сочетании с показателями движущихся средних и графиками K-линий позволяет лучше определять движение рынка. При этом установка стоп-стоп является разумной и помогает избежать больших потерь.
По сравнению с такими показателями, как одиночная подвижная средняя, в этой стратегии используются три подвижных средних, чтобы определить, что движение рынка является более надежным. В то же время, прорыв в позицию последней N-корневой линии наивысшей цены или наименьшей цены является более распространенной стратегией прорыва. В целом, стратегия ясна и проста в реализации.
Основные риски, с которыми может столкнуться эта стратегия:
Вероятность ошибки в определении направления трех скользящих средних. Если скользящая средняя и краткосрочная средняя приведут к ошибочному сигналу, это может привести к ненужным потерям.
Недостаточный выбор времени для прорыва, легко поддается ловушке. Выбор времени для прорыва должен быть соответствующим образом оптимизирован.
Стоп-дистанция установлена слишком маленькой, увеличение стоп-дистанции помогает дать цену больше Running Room.
Эта стратегия может быть оптимизирована в следующих направлениях:
Добавление фильтров для других показателей, обеспечивающих надежность сигналов движущихся средних. Например, увеличение количества сделок с использованием свободного суждения.
Оптимизация циклических параметров движущихся средних, чтобы они лучше адаптировались к различным видам.
Добавление алгоритмов машинного обучения для автоматической оптимизации параметров.
Эффективность этой стратегии была проверена на высокочастотных данных.
Эта стратегия в целом является более простой, универсальной, понятной и практически осуществимой. Как образец системы пересечения скользящих средних, она является частым выбором для начинающих. С соответствующей оптимизацией система может быть использована для более широкого ассортимента и временных периодов, что позволяет получать стабильную прибыль.
/*backtest
start: 2023-01-30 00:00:00
end: 2024-02-05 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/
// © hobbiecode
//@version=5
strategy("Cross Breakout - Hobbiecode", shorttitle="Cross - HOBBIE", overlay=true)
// User-defined input for moving averages
long_period = input(20, title="Long Period")
medium_period = input(10, title = "Medium Period")
short_period = input(5, title="Short Period")
type_ma = input.string("SMA", title = "MA type", options = ["SMA", "EMA"])
candles_back = input(10, title = "Candles Back")
bars_valid = input(3, title = "Bars to Exit")
// Calculating moving averages
long_ma = 0.0
medium_ma = 0.0
short_ma = 0.0
if type_ma == "SMA"
long_ma := ta.sma(close, long_period)
medium_ma := ta.sma(close, medium_period)
short_ma := ta.sma(close, short_period)
else
long_ma := ta.ema(close, long_period)
medium_ma := ta.ema(close, medium_period)
short_ma := ta.ema(close, short_period)
// Plot moving averages
plot(long_ma, title="Long Moving Average", color=color.red)
plot(medium_ma, title = "Medium Moving Average", color = color.yellow)
plot(short_ma, title="Short Moving Average", color=color.green)
// Check last min/max
last_min = ta.lowest(candles_back)
last_max = ta.highest(candles_back)
// Strategy logic for crossing of moving averages
longCondition = short_ma > medium_ma and medium_ma > long_ma and high == last_max
shortCondition = short_ma < medium_ma and medium_ma < long_ma and low == last_min
longCondition_entry = longCondition and strategy.position_size == 0
shortCondition_entry = shortCondition and strategy.position_size == 0
// Check last min/max for operation
last_min_op = ta.lowest(candles_back)[1]
last_max_op = ta.highest(candles_back)[1]
// Plot lines
var line r1Line = na
// Entry orders
// if (longCondition)
// from_line = chart.point.now(high)
// to_line = chart.point.from_index(bar_index + candles_back, high)
// r1Line := line.new(from_line, to_line, color = color.green, width = 2)
if longCondition_entry and ta.crossover(close,last_max_op)
strategy.entry("Long", strategy.long)
strategy.exit("Exit Long", from_entry="Long", stop=low)
// if (shortCondition)
// from_line = chart.point.now(low)
// to_line = chart.point.from_index(bar_index + candles_back, low)
// r1Line := line.new(from_line, to_line, color = color.red, width = 2)
if shortCondition_entry and ta.crossunder(close,last_min_op)
strategy.entry("Short", strategy.short)
strategy.exit("Exit Short", from_entry="Short", stop=high)
if ta.barssince(longCondition_entry) >= bars_valid
strategy.close("Long")
if ta.barssince(shortCondition_entry) >= bars_valid
strategy.close("Short")