
Эта стратегия основана на скрещивании движущихся средних с двумя различными параметрами, чтобы дать сигнал купить и продать. Когда движущаяся средняя с более коротким периодом прорывает движущуюся среднюю с более длинным периодом снизу, подается сигнал купить; когда движущаяся средняя с более коротким периодом прорывает движущуюся среднюю с более длинным периодом снизу, подается сигнал продать.
Стратегия была написана на языке скриптов pine. Сначала с помощью ввода были определены тип, длина и источник цены двух движущихся средних, названных p1 и p2 соответственно.
Кроссовер и кроссундер - функции, которые определяют пересечение двух равноуровневых линий. Когда p1 пробивается через p2 с нижнего направления, подается сигнал покупки; когда p1 пробивается через p2 с верхнего направления, подается сигнал продажи.
Для осуществления сделки, стратегия создает позиции сверх или пустые позиции при выпуске сигнала через функцию strategy.entry. Если параметр shortOnly включен, то только сделка продает сигнал.
Эта стратегия имеет следующие преимущества:
Однако эта стратегия также несет в себе некоторые риски:
Можно уменьшить недействительные сигналы путем корректировки длины средней линии, введения фильтрующих условий и т. д. Можно также объединить трендовые показатели для определения движения большого диапазона.
Эта стратегия может быть оптимизирована в следующих аспектах:
Введение средневзвешенной величины объема или типичной цены в качестве источника цены, повышение надежности перекрестного сигнала
Увеличение периода проверки, чтобы избежать кратковременной ошибки
Максимально допустимые потери в зависимости от рыночных колебаний в сочетании с остановкой ATR
Оптимизация параметров с использованием кривосочетания для поиска оптимального сочетания параметров
Необходимо учитывать, что торговые сигналы будут выдаваться только в случае согласованности большого цикла.
Стратегия двулинейного скрещивания в целом легко понять и реализовать, скрещивание двух равнолинейных линий образует торговый сигнал, который может быть высоко настраиваемым. Но также может производить большое количество недействительных сигналов в шокирующих ситуациях. Риск может быть снижен путем оптимизации параметров и оптимизации правил, для оптимизации которого есть большое пространство, которое заслуживает дальнейшего изучения.
/*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)