Эта стратегия использует две скользящие средние с различными параметрами для перекрестных операций для определения направления тренда и открытых/закрытых позиций. Стратегия позволяет выбирать из 9 различных типов скользящих средних, включая Простую скользящую среднюю (SMA), Экспоненциальную скользящую среднюю (EMA), Весенную скользящую среднюю (WMA), Арно Лего (Alma), Весенную скользящую среднюю (VWMA) и т. Д. Стратегия также устанавливает уровни стоп-лосса и прибыли.
Основная логика этой стратегии заключается в сравнении значений двух скользящих средних линий и определении направления тренда рынка на основе их перекрестки. В частности, мы устанавливаем быструю линию и медленную линию с использованием двух скользящих средних. Когда быстрая линия пересекает поверх медленной линии, мы считаем, что рынок находится в восходящем тренде и идет в длительный. Когда быстрая линия пересекает ниже медленной линии, мы считаем, что рынок находится в нисходящем тренде и идет в короткий.
После входа в позицию, если цена касается линии стоп-лосса, мы выходим из позиции, чтобы сократить убытки. Если цена касается линии прибыли, мы выходим из позиции, чтобы зафиксировать прибыль, как ожидалось. Это позволяет нам зафиксировать прибыль и предотвратить дальнейшее расширение потерь.
С точки зрения логики кода, стратегия может быть разделена на четыре части:
На основе выбора пользователем типа скользящей средней вычислить скользящую среднюю скоростной линии и медленную скользящую среднюю скорость.
Стройте длинные и короткие сигналы, основываясь на перекрестных ситуациях быстрой и медленной линий.
На основе входной цены и установленных процентов стоп-лосс/стоп-лосс, вычислить уровни стоп-лосса и уровень прибыли в режиме реального времени.
Вход и выход. Вход на основе длинных/коротких сигналов, выход на основе сигналов стоп-лосс/прибыль.
Наибольшее преимущество этой стратегии заключается в том, что она позволяет свободно выбирать из многих типов скользящих средних. Различные типы скользящих средних имеют разную чувствительность к ценам. Пользователи могут выбрать подходящую скользящую среднюю на основе своих собственных потребностей. Кроме того, длина скользящих средних может быть настроена для оптимизации временного измерения.
Еще одно преимущество заключается в том, что установлены механизмы остановки потерь и получения прибыли. Это может эффективно предотвратить дальнейшие потери и блокировать прибыль. В целом эта стратегия довольно гибкая с высокой настраиваемостью, подходящая для пользователей с различными потребностями.
Основной риск этой стратегии заключается в том, что скользящие средние имеют отставание. Когда цены внезапно сильно колеблются, скользящие средние не могут реагировать вовремя, что может привести к пропуску лучшего времени входа или выхода. Это может привести к большим потерям.
Другим риском является установка уровней остановки потери и получения прибыли. Если диапазон слишком мал, он может быть уязвимым для скальперов. Если он слишком большой, легко не зафиксировать прибыль вовремя. Поэтому параметры остановки потери / получения прибыли должны быть оптимизированы в соответствии с рыночными условиями во время живой торговли.
В целом, эта стратегия в основном опирается на скользящие средние для определения направления тренда. Поэтому ее эффективность может быть скомпрометирована, когда внезапные события вызывают большие колебания цен. Кроме того, настройки параметров также могут оказать большое влияние на доходность стратегии.
Эта стратегия может быть оптимизирована в следующих аспектах:
Оптимизировать тип скользящей средней.
Оптимизируйте параметры скользящей средней, корректируйте длину скользящей средней, чтобы она лучше соответствовала характеристикам рынка.
Добавить другие индикаторы для фильтрации. MACD, RSI и другие индикаторы могут быть добавлены, чтобы избежать частой торговли, когда нет четкой тенденции.
Оптимизируйте соотношение стоп-лосс/стоп-профит. Вычислите оптимальные параметры стоп-лосса/стоп-профита на основе исторических данных.
Добавьте модели машинного обучения. Используйте LSTM, алгоритмы случайного леса для прогнозирования движения цен и помощи в генерации торговых сигналов.
Используйте алгоритмы отслеживания стоп-лосса, позволяя линии стоп-лосса постепенно двигаться вместе с движением цены, чтобы уменьшить вероятность попадания.
В целом, эта стратегия относительно проста и проста. Она определяет направление тренда через кроссовер и относится к типичной стратегии следующего тренда. Преимущества заключаются в том, что ее легко понять и она очень гибкая с настраиваемыми типами и параметрами скользящих средних. Недостатками являются более медленные реакции на внезапные события и некоторая степень отставания.
/*backtest start: 2022-12-26 00:00:00 end: 2024-01-01 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Kozlod - Yet Another Moving Average Cross Strategy", shorttitle="kozlod_yamacs", overlay = true) // // author: Kozlod // date: 2018-03-06 // //////////// // INPUTS // //////////// ma_type = input(title = "MA Type", defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'ALMA', 'VWMA', 'HMA', 'LSMA', 'SMMA', 'DEMA']) short_ma_len = input(title = "Short MA Length", defval = 5, minval = 1) short_ma_src = input(title = "Short MA Source", defval = close) long_ma_len = input(title = "Long MA Length", defval = 15, minval = 2) long_ma_src = input(title = "Long MA Source", defval = close) alma_offset = input(title = "ALMA Offset", type = float, defval = 0.85, step = 0.01, minval = 0, maxval = 1) alma_sigma = input(title = "ALMA Sigma", type = float, defval = 6, step = 0.01) lsma_offset = input(title = "LSMA Offset", defval = 0, step = 1) sl_lev_perc = input(title = "SL Level % (0 - Off)", type = float, defval = 0, minval = 0, step = 0.01) pt_lev_perc = input(title = "PT Level % (0 - Off)", type = float, defval = 0, minval = 0, step = 0.01) // Set initial values to 0 short_ma = 0.0 long_ma = 0.0 // Simple Moving Average (SMA) if ma_type == 'SMA' short_ma := sma(short_ma_src, short_ma_len) long_ma := sma(long_ma_src, long_ma_len) // Exponential Moving Average (EMA) if ma_type == 'EMA' short_ma := ema(short_ma_src, short_ma_len) long_ma := ema(long_ma_src, long_ma_len) // Weighted Moving Average (WMA) if ma_type == 'WMA' short_ma := wma(short_ma_src, short_ma_len) long_ma := wma(long_ma_src, long_ma_len) // Arnaud Legoux Moving Average (ALMA) if ma_type == 'ALMA' short_ma := alma(short_ma_src, short_ma_len, alma_offset, alma_sigma) long_ma := alma(long_ma_src, long_ma_len, alma_offset, alma_sigma) // Hull Moving Average (HMA) if ma_type == 'HMA' short_ma := wma(2*wma(short_ma_src, short_ma_len/2)-wma(short_ma_src, short_ma_len), round(sqrt(short_ma_len))) long_ma := wma(2*wma(long_ma_src, long_ma_len /2)-wma(long_ma_src, long_ma_len), round(sqrt(long_ma_len))) // Volume-weighted Moving Average (VWMA) if ma_type == 'VWMA' short_ma := vwma(short_ma_src, short_ma_len) long_ma := vwma(long_ma_src, long_ma_len) // Least Square Moving Average (LSMA) if ma_type == 'LSMA' short_ma := linreg(short_ma_src, short_ma_len, lsma_offset) long_ma := linreg(long_ma_src, long_ma_len, lsma_offset) // Smoothed Moving Average (SMMA) if ma_type == 'SMMA' short_ma := na(short_ma[1]) ? sma(short_ma_src, short_ma_len) : (short_ma[1] * (short_ma_len - 1) + short_ma_src) / short_ma_len long_ma := na(long_ma[1]) ? sma(long_ma_src, long_ma_len) : (long_ma[1] * (long_ma_len - 1) + long_ma_src) / long_ma_len // Double Exponential Moving Average (DEMA) if ma_type == 'DEMA' e1_short = ema(short_ma_src, short_ma_len) e1_long = ema(long_ma_src, long_ma_len) short_ma := 2 * e1_short - ema(e1_short, short_ma_len) long_ma := 2 * e1_long - ema(e1_long, long_ma_len) ///////////// // SIGNALS // ///////////// long_signal = crossover( short_ma, long_ma) short_signal = crossunder(short_ma, long_ma) // Calculate PT/SL levels // Initial values last_signal = 0 prev_tr_price = 0.0 pt_level = 0.0 sl_level = 0.0 // Calculate previous trade price prev_tr_price := long_signal[1] or short_signal[1] ? open : nz(last_signal[1]) != 0 ? prev_tr_price[1] : na // Calculate SL/PT levels pt_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 + pt_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 - pt_lev_perc / 100) : na sl_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 - sl_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 + sl_lev_perc / 100) : na // Calculate if price hit sl/pt long_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) == 1 and close >= pt_level long_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) == 1 and close <= sl_level short_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) == -1 and close <= pt_level short_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) == -1 and close >= sl_level // What is last active trade? last_signal := long_signal ? 1 : short_signal ? -1 : long_hit_pt or long_hit_sl or short_hit_pt or short_hit_sl ? 0 : nz(last_signal[1]) ////////////// // PLOTTING // ////////////// // Plot MAs plot(short_ma, color = red, linewidth = 2) plot(long_ma, color = green, linewidth = 2) // Plot Levels plotshape(prev_tr_price, style = shape.cross, color = gray, location = location.absolute, size = size.small) plotshape(sl_lev_perc > 0 ? sl_level : na, style = shape.cross, color = red, location = location.absolute, size = size.small) plotshape(pt_lev_perc > 0 ? pt_level : na, style = shape.cross, color = green, location = location.absolute, size = size.small) ////////////// // STRATEGY // ////////////// strategy.entry("long", true, when = long_signal) strategy.entry("short", false, when = short_signal) strategy.close("long", when = long_hit_pt or long_hit_sl) strategy.close("short", when = short_hit_pt or short_hit_sl)