Эта стратегия генерирует сигналы покупки и продажи на основе перекрестки двух скользящих средних с различными параметрами. Когда более короткий период скользящей средней пересекает выше более длинного периода скользящего среднего снизу, генерируется сигнал покупки. Когда более короткий период скользящей средней пересекает ниже более длинного периода скользящего среднего сверху, генерируется сигнал продажи.
Стратегия написана с помощью шрифта Pine. Она сначала определяет две скользящие средние, названные p1 и p2, с настраиваемым типом, длиной и источником цены через вход. Здесь p1 представляет собой более короткий период MA, а p2 представляет собой более длительный период MA.
Функции кроссовера и кроссендера используются для обнаружения кроссовера между двумя МА. Когда p1 пересекает p2 снизу, генерируется сигнал покупки. Когда p1 пересекает под p2 сверху, генерируется сигнал продажи.
Для выполнения сделок, стратегия входит в длинные или короткие позиции с помощью strategy.entry, когда сигналы запускаются. Если ввод shortOnly включен, будут торговаться только сигналы продажи.
Преимущества этой стратегии включают:
Эта стратегия также сопряжена с некоторыми рисками:
Риски могут быть снижены путем корректировки длин MA, добавления условий фильтрации и т. д. Также могут быть добавлены индикаторы тенденции для определения предвзятости рынка.
Стратегия может быть усовершенствована из следующих аспектов:
Использовать VWAP или типичную цену в качестве источника цены, чтобы сделать сигналы перекрестного перекрестного сообщения более надежными.
Добавьте период валидации, чтобы избежать краткосрочных ошибочных перекресток.
Включить остановки ATR на основе максимально допустимых потерь в соответствии с волатильностью рынка.
Оптимизация параметров с помощью настройки кривой для поиска оптимальных комбинаций.
Рассмотрим только сигналы в направлении более высоких временных трендов.
Стратегия двойного кроссовера MA легко понять и реализовать, генерируя торговые сигналы от двух кроссоверов MA с высокой настраиваемостью. Но она также может производить чрезмерные недействительные сигналы во время нестабильных рынков. Риски могут быть снижены с помощью оптимизации параметров и логики с широкими возможностями для улучшения, которые заслуживают дальнейших исследований.
/*backtest start: 2022-11-20 00:00:00 end: 2023-11-26 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © RafaelPiccolo //@version=4 strategy("Double MA Cross", overlay=true) type1 = input("SMA", "MA Type 1", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"]) len1 = input(10, minval=1, title="Length 1") src1 = input(close, "Source 1", type=input.source) type2 = input("SMA", "MA Type 2", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"]) len2 = input(50, minval=2, title="Length 2") src2 = input(close, "Source 2", type=input.source) shortOnly = input(false, "Short only") tema(src, len)=> ema1 = ema(src, len) ema2 = ema(ema1, len) ema3 = ema(ema2, len) return = 3 * (ema1 - ema2) + ema3 getPoint(type, len, src)=> return = type == "SMA" ? sma(src, len) : type == "EMA" ? ema(src, len) : type == "WMA" ? wma(src, len) : type == "HMA" ? hma(src, len) : type == "VWMA" ? vwma(src, len) : type == "RMA" ? rma(src, len) : tema(src, len) p1 = getPoint(type1, len1, src1) p2 = getPoint(type2, len2, src2) shortCondition = crossunder(p1, p2) longCondition = crossover(p1, p2) if (shortCondition) strategy.entry("Short", strategy.short) if (longCondition) if (shortOnly) strategy.close("Short") else strategy.entry("Long", strategy.long) plot(p1, "MA 1", p1 < p2 ? color.red : color.green) plot(p2, "MA 2", color.blue)