Стратегия бычьего тренда Bitcoin и Ethereum


Дата создания: 2023-10-07 10:16:09 Последнее изменение: 2023-10-07 10:16:09
Копировать: 5 Количество просмотров: 704
1
Подписаться
1617
Подписчики

Обзор

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

Стратегический принцип

  1. Используйте MACD для определения направления тренда, MACD больше смотрит вверх при скрещивании;

  2. Вычислить 20-циклическую ЭМА, 100-циклическую СМА и 200-циклическую СМА, при этом ЭМА и СМА будут смотреть вверх;

  3. Если EMA выше SMA, то можно купить больше, если SMA выше SMA, то можно купить больше, если SMA выше SMA.

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

  5. Выход из равновесного положения при прохождении EMA ниже SMA, когда цена падает.

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

Стратегические преимущества

  1. По мнению экспертов, в результате использования многополюсных комбинаций можно эффективно отфильтровать ошибочные сигналы, такие как ложные прорывы.

  2. Привлечение к рынку только в то время, когда есть четкая тенденция, позволяет сократить ненужные сделки и снизить их частоту;

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

  4. По данным отслеживания, в биткоине и эфириуме можно получить лучшую прибыль.

  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