Стратегия длинного тренда BTC и ETH

Автор:Чао Чжан, Дата: 2023-10-07 10:16:09
Тэги:

Обзор

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

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

  1. Использовать MACD для определения направления тренда, длинный, когда MACD пересекается вверх;

  2. Вычислить 20-периодную EMA, 100-периодную SMA и 200-периодную SMA, идти длинным, когда EMA и SMA указывают вместе вверх;

  3. покупать, когда EMA выше SMA, а SMA выше медленной SMA;

  4. Установите линию стоп-лосса, остановитесь, когда цена превысит стоп-лосс.

  5. Закрыть позицию, когда цена падает и EMA пересекает SMA.

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

Преимущества

  1. Многочисленные индикаторы помогают отфильтровать ложные сигналы.

  2. Только вход в очевидные тенденции может уменьшить ненужные сделки и снизить частоту торговли.

  3. Стоп-лосс может эффективно ограничивать максимальную потерю на сделку.

  4. Обратный тест показывает приличную прибыльность в BTC и ETH.

  5. Простая и понятная логика, легкая для понимания и реализации, хорошая для начинающих.

  6. Высокая расширяемость для включения большего количества показателей для оптимизации.

Риски

  1. Высокая случайность рынка, риски неправильного суждения.

  2. Подход к единой позиции не может охватывать систематические риски.

  3. Неправильное настройка стоп-потери может привести к превышению стоп-потери.

  4. Бакт-тест не представляет реальных результатов, реальная производительность еще не подтверждена.

  5. Влияние затрат на торговлю не учитывается, может отличаться от показателей на живом экране.

  6. Не учитывали характеристики продукта, необходима настройка параметров.

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

  1. Испытать различные комбинации параметров для оптимизации параметров индикатора.

  2. Добавьте такие фильтры, как KDJ, чтобы отфильтровать сигналы входа.

  3. Оптимизировать стратегию стоп-лосса, например, добавить динамический стоп-лосс.

  4. Рассмотрим размеры позиций в зависимости от размера счета.

  5. Различить характеристики продукта, соответственно корректировать параметры.

  6. Включите больше временных рамок для анализа.

  7. Испытайте различные продукты и найдите наиболее подходящие.

Заключение

Логика стратегии проста и ясна. Использование нескольких индикаторов может помочь эффективно отфильтровать неправильные сигналы. Но необходима дальнейшая оптимизация параметров, контроля рисков и т. Д., В сочетании с проверкой реальной торговли, перед фактическим применением. С надлежащими расширениями он может стать очень практичным крипто трендом после стратегии.


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="BTC Long strategy", overlay=true, max_bars_back=3000, initial_capital=1000, commission_value=0.075)

//////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! /////////////////////


[macdLine, macdSignalLine, macdHist] = macd(close, 12, 26, 7)  

//_rsi_len = input(14, title="RSI length")
_rsi_len = 14 
 
NewValue = 0
PreviousValue = 0
leverage = 1

smaPercentageIncrease = 0.0
SMA_PERCENT_INCREASE = 0.0
float atrValue = 0
bool bPositionOpened = false
float stockPositionSize = 0 
float volatilityPercentage = 0.0
bool bDisplayArrow = false 
bool bEMAIsRising = false
bool bSMAIsRising = false
bool bSMASlowIsRising = false
bool bMACDIsRising = false
bool bMACDHistIsRising = false
bool bMACDSignalIsRising = false

float stopLoss = input (1.5, "StopLoss in %", type=input.float) //StopLoss associated with the order 
//positionSize = input (1000, "in $")
float positionSize = 1000
float currentPrice = close 
float stopLossPrice = 0
float entryPrice = 0



//-----------------------------------------------------------



// === INPUT BACKTEST RANGE ONE YEAR 
//FromDay   = input(defval = 01, title = "From Day", minval = 1, maxval = 31)
//FromMonth = input(defval = 01, title = "From Month", minval = 1, maxval = 12)
//FromYear  = input(defval = 2020, title = "From Year", minval = 2017)
FromDay   = 01
FromMonth = 01
FromYear  = 2019


//ToDay     = input(defval = 01, title = "To Day", minval = 1, maxval = 31)
//ToMonth   = input(defval = 01, title = "To Month", minval = 1, maxval = 12)
//ToYear    = input(defval = 2023, title = "To Year", minval = 2017)
ToDay     = 31
ToMonth   = 12
ToYear    = 2099

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"



//emaLength = input(20, "EMA Length")
//smaLength = input(100, "SMA Length")
//smaSlowLength = input(200, "SMA Length") 
emaLength = 20
smaLength = 100
smaSlowLength = 200
 
ema = ema(close, emaLength) 
sma = sma(close, smaLength)
smaSlow = sma(close, smaSlowLength)

plot(sma, color=color.green)
plot(smaSlow, color=color.orange)
plot(ema, color=color.yellow)

//reload previous values
stopLossPrice := na(stopLossPrice[1]) ? 0.0 : stopLossPrice[1]
entryPrice := na(entryPrice[1]) ? 0.0 : entryPrice[1]
bPositionOpened := na(bPositionOpened[1]) ? false : bPositionOpened[1]
positionSize := na(positionSize[1]) ? 50000 : positionSize[1]
stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1]
//leverage := na(leverage[1]) ? 1 : leverage[1]
 
//ReEvaluate the direction of indicators
bEMAIsRising := rising(ema, 2) 
bSMAIsRising := rising(sma, 3)
bMACDIsRising := rising(macdLine, 3)
bMACDHistIsRising := rising(macdHist, 1)
bSMASlowIsRising := rising(smaSlow, 10)
bMACDSignalIsRising := rising(macdSignalLine, 3)

atrValue := atr(14)
volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price


//There is too many signal in tranding market, to avoid this we need to make sure that the smaSlow has a mininal increase
//THIS DOES NOT WORK AT ALL!!!!!
//if bSMASlowIsRising == true
//    //calculate the percentegage difference over the last 10 bars
//    smaPercentageIncrease := ((smaSlow[0]/sma[10])-1)*100
//    if smaPercentageIncrease < SMA_PERCENT_INCREASE
//        //Not enough increase we reset the flag 
//        bSMASlowIsRising := false 
        
 
if (window()) 
    //Check if we can open a LONG
//sma > smaSlow and
    if ( volatilityPercentage < 2 and bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice)
    // add comparaison between macd and macd signal line
    //if (bPositionOpened == false and macdSignalLine < macdLine and bMACDIsRising == true and bMACDHistIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[1] > sma[1] and sma[1] < currentPrice)
   
        //Enter in short position 
        stockPositionSize := (positionSize*leverage)/currentPrice //Calculate the position size based on the actual price and the position Size (in $) configured.
        
        //calculate exit values
        stopLossPrice := currentPrice*(1-stopLoss/100) 
        strategy.entry("myPosition", strategy.long, qty=stockPositionSize, comment="BUY at " + tostring(currentPrice))
        entryPrice := currentPrice //store the entry price
        bPositionOpened := true  
        bDisplayArrow := true 
        
    
    //if (bPositionOpened == true and (currentPrice <= stopLossPrice or crossunder(ema[1], sma[1]) or currentPrice < sma[1]))  
    if (bPositionOpened == true and (currentPrice <= stopLossPrice or crossunder(ema[1], sma[1])))
        strategy.close("myPosition", comment="" + tostring(currentPrice) ) //Stop
        //uncomment the below line to make the bot investing the full portfolio amount to test compounding effect.
        //positionSize := positionSize + ((stockPositionSize * currentPrice) - (positionSize*leverage)) 
        //reset some flags 
        bPositionOpened := false 
        bDisplayArrow := true 
        entryPrice := 0.0
        


Больше