
Двойная EMA Gold Cross Seismic Tracking Strategy - это стратегия, использующая индикатор EMA для идентификации трендов и отслеживания их в условиях шока. Эта стратегия объединяет идеи отслеживания трендов и захвата шока, отслеживая длинную линию в сильных условиях и торгуя короткой линией в шоковых условиях, чтобы получить лучшую прибыль.
Эта стратегия использует 20-циклические ЭМА в качестве индикатора для определения тенденции. Когда цена выходит за пределы ЭМА, считается, что цена начинает расти; когда цена выходит за пределы ЭМА, считается, что цена начинает падать.
При появлении цены на EMA, с максимальной ценой 20 циклов как стоп-стоп, с минимальной ценой после появления EMA как стоп-стоп, сделайте больше входа; при появлении цены на EMA, с минимальной ценой 20 циклов как стоп-стоп, с максимальной ценой после появления EMA как стоп-стоп, сделайте пустой вход.
В то же время, стратегия также определяет, является ли ADX больше 30, и будет торговать только тогда, когда тенденция будет достаточно четкой, то есть, когда ADX превысит 30, что позволит избежать остановочных потерь в шокирующих ситуациях.
В процессе удержания позиции, trail stop будет корректироваться в соответствии с реальными событиями на рынке, чтобы закрепить больше прибыли.
Эта стратегия сочетает в себе преимущества отслеживания тенденций и торгования в условиях шока, позволяя получать прибыль в условиях тренда, а также стабильную прибыль в условиях шока, обладая высокой адаптивностью.
Применение EMA также уменьшает параметры стратегии, снижает риск переоптимизации, что гарантирует стабильность стратегии.
Основной риск этой стратегии заключается в том, что при усилении шока может возникнуть большое количество потерь. В этом случае роль ADX выделяется. Когда значение ADX ниже, сделки закрываются, чтобы избежать потерь при отсутствии четкой тенденции.
Кроме того, разумная установка стоп-лосса также является ключевой. Слишком большая установка стоп-лосса может увеличить одиночные потери; слишком маленькая установка стоп-лосса может быть слишком чувствительной и увеличить вероятность остановки. Здесь необходимо найти баланс между целевым уровнем прибыли и риском стоп-лосса.
Эта стратегия может быть оптимизирована в следующих аспектах:
Выбор циклов EMA. Можно тестировать больше параметров циклов EMA, чтобы найти оптимальную комбинацию параметров.
Параметры ADX могут быть оптимизированы. Можно попробовать различные настройки для ADX-циклов и ADX-температур.
Алгоритм стоп-стоп может быть улучшен, например, с введением динамического стоп-стоп-лоста.
Можно рассмотреть возможность комбинирования с другими показателями, такими как KDJ, MACD и т. д., чтобы сформировать стратегию многопоказательной проверки.
Двойная EMA Gold Cross Shock Tracking Strategy в целом является очень практичной стратегией. Она объединяет в себе особенности трендовой и шоковой стратегий, может использоваться как для долгой линии, так и для короткой линии торговли. Эффективность стратегии может быть дополнительно повышена за счет оптимизации параметров и проверки комбинированных индикаторов.
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
strategy("Linda Raschke's Holy Grail", shorttitle="RHG", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, overlay = true)
adxlen = input(14, title="ADX period")
adxMin = input(30)
dilen = adxlen
f_highest(_src, _length)=>
_adjusted_length = _length < 1 ? 1 : _length
_value = _src
for _i = 0 to (_adjusted_length-1)
_value := _src[_i] >= _value ? _src[_i] : _value
_return = _value
f_lowest(_src, _length)=>
_adjusted_length = _length < 1 ? 1 : _length
_value = _src
for _i = 0 to (_adjusted_length-1)
_value := _src[_i] <= _value ? _src[_i] : _value
_return = _value
dirmov(len) =>
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
truerange = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / truerange)
minus = fixnan(100 * rma(minusDM, len) / truerange)
[plus, minus]
adx(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
emaLength = input(20)
curEma = ema(close, emaLength)
highPeriod = input(20)
d = na
takeProfitLong = highest(high, highPeriod)
stopLossLong = f_lowest(low, barssince(low >= curEma))
if strategy.position_size == 0
if adx(dilen, adxlen) <= adxMin or high < curEma
strategy.cancel("Long")
if adx(dilen, adxlen) > adxMin and low < curEma and high > curEma and curEma > curEma[highPeriod / 2] and curEma > curEma[highPeriod] and takeProfitLong > high
strategy.order("Long", strategy.long, stop = high)
strategy.exit("Exit", "Long", limit = takeProfitLong, stop = stopLossLong)
d := high
takeProfitShort = lowest(low, highPeriod)
stopLossShort = f_highest(high, barssince(high <= curEma))
if strategy.position_size == 0
if adx(dilen, adxlen) <= adxMin or low > curEma
strategy.cancel("Short")
if adx(dilen, adxlen) > adxMin and high > curEma and low < curEma and curEma < curEma[highPeriod / 2] and curEma < curEma[highPeriod] and takeProfitShort < low
strategy.order("Short", strategy.short, stop = low)
strategy.exit("Exit", "Short", limit = takeProfitShort, stop = stopLossShort)
d := low
strategy.close("Exit")
plot(d == high ? stopLossLong : d == low ? stopLossShort : na, style = circles, linewidth = 4, color = red)
plot(d == high ? takeProfitLong : d == low ? takeProfitShort : na, style = circles, linewidth = 4, color = green)
plot(d, style = circles, linewidth = 4, color = yellow)
plot(curEma, color = black, linewidth = 2)
// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(3, "Backtest Start Month")
testStartDay = input(6, "Backtest Start Day")
testStartHour = input(08, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
strategy.cancel_all()
strategy.close_all()