Интеллектуальная отслеживание двойных линий тренда BTC инвестиционная стратегия

Автор:Чао Чжан, Дата: 2023-11-22 15:18:53
Тэги:

img

Обзор

Эта стратегия в основном используется для автоматизированных долгосрочных инвестиций в BTC. Для определения направления тренда она использует перекресток двойной EMA и LSMA и использует индикатор ATR для расчета динамического стоп-лосса для эффективного отслеживания бычьего тренда BTC.

Логика стратегии

  1. Для формирования двойной скользящей средней используется 25-периодная EMA и 100-периодная LSMA. Их перекрестный переход используется для определения тенденции рынка. EMA быстро реагирует на изменения цен, в то время как LSMA фильтрует ложные прорывы.

  2. Когда быстрая EMA пересекает медленную LSMA, определяется, что восходящий тренд все еще не нарушен, и принимаются длинные позиции.

  3. После занятия длинных позиций динамический стоп-лосс, рассчитанный с помощью индикатора ATR, постоянно корректируется, чтобы эффективно отслеживать восходящий тренд BTC. В частности, начальной точкой линии стоп-лосса является цена входа. После этого каждая корректировка будет скользить вверх на фиксированный процент амплитуды ATR.

  4. Линия стоп-лосса может эффективно блокировать плавучую прибыль, принесенную восходящим трендом BTC, предотвращая точку стоп-лосса от слишком близкого к последней цене, чтобы избежать частых стоп-лосов. Кроме того, стратегия также устанавливает две движущиеся стоп-прибыли разных пропорций, чтобы блокировать больше прибыли.

Анализ преимуществ

  1. Использование двойных скользящих сред для определения тренда является более надежным и может эффективно предотвратить ложные сигналы.

  2. Динамическая стоп-лосс ATR может блокировать большую часть прибыли, избегая частых небольших стоп-лостов.

  3. Независимо от того, закончится ли бычий тренд или нет, до тех пор, пока скользящая средняя выпускает сигнал выхода, позиция будет остановлена для контроля рисков.

  4. Стратегия имеет высокую степень автоматизации без ручного вмешательства, что делает ее подходящей для долгосрочной торговли в режиме реального времени.

Анализ рисков

  1. Все еще нужно обращать внимание на внезапные важные новости, чтобы избежать огромных потерь.

  2. Хотя комбинация двойных скользящих средних может уменьшить ложные сигналы, все еще трудно полностью избежать их на рынках с диапазоном.

  3. Неправильные настройки параметров ATR также могут повлиять на эффект стоп-лосса.

  4. Необоснованные периоды скользящих средних значений или их несвоевременное обновление могут привести к задержке сигналов.

  5. Обеспечить стабильность сервера, чтобы избежать аномальных сбоев, которые прерывают автоматическую торговлю.

Руководство по оптимизации

  1. Для определения тренда можно добавить больше индикаторов, таких как полосы Боллинджера, а также использовать модели машинного обучения для прогнозирования цен.

  2. Метод расчета динамического стоп-потеря ATR также может быть скорректирован и оптимизирован, чтобы сделать стоп-потеря более плавной.

  3. Для защиты от влияния крупных новостей могут быть добавлены механизмы оповещения, основанные на объеме торговли, и функции внутридневного ротации.

  4. Параметры различаются для разных монет. Более исторические данные могут быть использованы для обучения персонализированных параметров.

Резюме

В целом, это очень практичная автоматизированная инвестиционная программа BTC. Использование двойных EMA для определения основного тренда очень надежно. С ATR, отслеживающей стоп-лосс, он может достичь приличной прибыли, а срок действия может быть очень длинным. Поскольку параметры продолжают оптимизироваться, в производительности этой стратегии все еще есть много возможностей для улучшения.


// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Wunderbit Trading

//@version=4
strategy("Automated Bitcoin (BTC) Investment Strategy", overlay=true, initial_capital=5000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100,  commission_type=strategy.commission.percent,commission_value=0.1)

////////////  Functions

Atr(p) =>
    atr = 0.
    Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
    atr := nz(atr[1] + (Tr - atr[1])/p,Tr)

//TEMA
TEMA(series, length) =>
    if (length > 0)
        ema1 = ema(series, length)
        ema2 = ema(ema1, length)
        ema3 = ema(ema2, length)
        (3 * ema1) - (3 * ema2) + ema3
    else
        na
tradeType = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH", "NONE"])

///////////////////////////////////////////////////
/// INDICATORS
source=close

/// TREND
trend_type1 = input("TEMA", title ="First Trend Line : ", options=["LSMA", "TEMA","EMA","SMA"])
trend_type2 = input("LSMA", title ="First Trend Line : ", options=["LSMA", "TEMA","EMA","SMA"])

trend_type1_length=input(25, "Length of the First Trend Line")
trend_type2_length=input(100, "Length of the Second Trend Line")

leadLine1 = if trend_type1=="LSMA"
    linreg(close, trend_type1_length, 0)
else if trend_type1=="TEMA"
    TEMA(close,trend_type1_length)
else if trend_type1 =="EMA"
    ema(close,trend_type1_length)
else
    sma(close,trend_type1_length)

leadLine2 = if trend_type2=="LSMA"
    linreg(close, trend_type2_length, 0)
else if trend_type2=="TEMA"
    TEMA(close,trend_type2_length)
else if trend_type2 =="EMA"
    ema(close,trend_type2_length)
else
    sma(close,trend_type2_length)

p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)

//Upward Trend
UT=crossover(leadLine1,leadLine2)
DT=crossunder(leadLine1,leadLine2)

// TP/ SL/  FOR LONG
// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input(15, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(20, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(30, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(20, title="Long Take Profit 2 Qty", step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)

long_sl_input = input(5, title='stop loss in %', step=0.1)/100
long_sl_input_level = strategy.position_avg_price * (1 - long_sl_input)

// Stop Loss
multiplier = input(3.5, "SL Mutiplier", minval=1, step=0.1)
ATR_period=input(8,"ATR period", minval=1, step=1)

// Strategy
//LONG STRATEGY CONDITION

SC = input(close, "Source", input.source)
SL1 = multiplier * Atr(ATR_period)  // Stop Loss
Trail1 = 0.0
Trail1 :=  iff(SC < nz(Trail1[1], 0) and SC[1] < nz(Trail1[1], 0), min(nz(Trail1[1], 0), SC + SL1), iff(SC > nz(Trail1[1], 0), SC - SL1, SC + SL1))
Trail1_high=highest(Trail1,50)

// iff(SC > nz(Trail1[1], 0) and SC[1] > nz(Trail1[1], 0), max(nz(Trail1[1], 0), SC - SL1),

entry_long=crossover(leadLine1,leadLine2) and Trail1_high < close
exit_long = close < Trail1_high or crossover(leadLine2,leadLine1) or close < long_sl_input_level

///// BACKTEST PERIOD ///////
testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(9999, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

if testPeriod()
    if tradeType=="LONG" or tradeType=="BOTH"
        if strategy.position_size == 0 or strategy.position_size > 0
            strategy.entry("long", strategy.long, comment="b8f60da7_ENTER-LONG_BINANCE_BTC/USDT_b8f60da7-BTC-Investment_4H", when=entry_long)
            strategy.exit("TP1", "long", qty_percent=long_tp1_qty, limit=long_take_level_1)
            strategy.exit("TP2", "long", qty_percent=long_tp2_qty, limit=long_take_level_2)
            strategy.close("long", when=exit_long, comment="b8f60da7_EXIT-LONG_BINANCE_BTC/USDT_b8f60da7-BTC-Investment_4H" )


// LONG POSITION

plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? Trail1_high : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")

Больше