Стратегия дневной торговли биткоинами, объединяющая несколько индикаторов


Дата создания: 2023-12-07 15:23:44 Последнее изменение: 2023-12-07 15:23:44
Копировать: 1 Количество просмотров: 691
1
Подписаться
1619
Подписчики

Стратегия дневной торговли биткоинами, объединяющая несколько индикаторов

Обзор

Эта стратегия объединяет четыре индикатора RSI, MFI, Stoch RSI и MACD для осуществления суточной торговли биткойном. Для контроля риска стратегия размещает ордеры только тогда, когда несколько индикаторов одновременно подают сигналы о покупке или продаже.

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

  1. RSI используется для определения того, является ли рынок перекупленным или перепроданным. RSI создает сигнал покупки, когда он ниже 40, и сигнал продажи, когда он выше 70.

  2. Показатель MFI определяет движение денег на рынке. MFI создает сигнал покупки, когда оно ниже 23, и сигнал продажи, когда оно выше 80.

  3. Stoch RSI определяет, является ли рынок перекупленным или перепроданным. Под K-линией ниже 34 создается сигнал покупки, выше 80 - сигнал продажи.

  4. Индекс MACD определяет тенденции и динамику рынка. Быстрая линия выражает сигнал к покупке, когда она ниже медленной линии, а столбик отрицательный, и наоборот, это сигнал к продаже.

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

  1. В сочетании с четырьмя основными показателями, повышается точность сигнала, избегая потерь из-за сбоя одного показателя.

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

  3. Применение стратегии торговли в течение дня, избежание риска на ночь, снижение стоимости капитала.

Риски и решения

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

  2. Вероятность того, что индикатор выдаст ошибочный сигнал, все еще существует. Можно ввести алгоритмы машинного обучения, которые помогут определить надежность индикаторного сигнала.

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

Направление оптимизации

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

  2. Добавление логики остановки убытков. Если убыток превышает определенную долю, то остановка убытков выходит, эффективно контролируя единичные убытки.

  3. В сочетании с эмоциональными показателями. Повышение температуры рынка, повышение уровня паники на рынке и другие многомерные оценки, повышение стратегической прибыли.

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2023-11-29 00:00:00
end: 2023-12-06 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=5
strategy('John Day Stop Loss', overlay=false, pyramiding=1, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency='USD', precision=2)
strategy.risk.allow_entry_in(strategy.direction.long) 

from_day = input.int(defval=1, title='From Day', minval=1)
from_month = input.int(defval=1, title='From Month', minval=1)
from_year = input.int(defval=2021, title='From Year', minval=2020)
to_day = input.int(defval=1, title='To Day', minval=1)
to_month = input.int(defval=1, title='To Month', minval=1)
to_year = input.int(defval=2025, title='To Year', minval=2020)

time_cond = time > timestamp(from_year, from_month, from_day, 00, 00) and time < timestamp(to_year, to_month, to_day, 00, 00)
//time_cond = true

//Stop Loss
longProfitPerc = input.float(title="Stop Loss Profit (%)", defval=2.1) / 100
longExitPrice  = strategy.position_avg_price * (1 - longProfitPerc)

//RSI - yellow
up = ta.rma(math.max(ta.change(close), 0), 14)
down = ta.rma(-math.min(ta.change(close), 0), 14)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
plot(rsi, "RSI", color=#00FFFF)
buy_rsi = true // rsi < 40
sell_rsi = true //rsi > 70

//MFI - cyan
mf = ta.mfi(hlc3, 14)
plot(mf, "MF", color=#FFFF00)
buy_mfi = mf < input.int(defval=23, title='Max MF', minval=1)
sell_mfi = mf > input.int(defval=80, title='Min MF', minval=1)

//Stoch RSI
OverBought_StochRSI = input(80)
OverSold_StochRSI = input(34)
smoothK = input.int(3, "K", minval=1)
smoothD = input.int(2, "D", minval=1)
lengthRSI = input.int(14, "RSI Length", minval=1)
lengthStoch = input.int(14, "Stochastic Length", minval=1)
srcRSI = input(close, title="RSI Source")
rsi1 = ta.rsi(srcRSI, lengthRSI)
kStochRSI = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ta.sma(kStochRSI, smoothD)
co = ta.crossover(kStochRSI,d)
cu = ta.crossunder(kStochRSI,d)

buy_stochRSI = co and kStochRSI < OverSold_StochRSI
sell_stochRSI = cu and kStochRSI > OverBought_StochRSI

plot(kStochRSI, "K", color=#2962FF)
plot(d, "D", color=#FF6D00)
h0 = hline(OverBought_StochRSI, "Upper Band", color=#787B86)
h1 = hline(OverSold_StochRSI, "Lower Band", color=#787B86)
fill(h0, h1, color=color.rgb(33, 150, 243, 90), title="Background")

//MACD
// Getting inputs
fast_length = input(title="Fast Length", defval=12)
slow_length = input(title="Slow Length", defval=26)
src = input(title="Source", defval=close)
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])
// Plot colors
//col_macd = input(#2962FF, "MACD Line  ", group="Color Settings", inline="MACD")
//col_signal = input(#FF6D00, "Signal Line  ", group="Color Settings", inline="Signal")
//col_grow_above = input(#26A69A, "Above   Grow", group="Histogram", inline="Above")
//col_fall_above = input(#B2DFDB, "Fall", group="Histogram", inline="Above")
//col_grow_below = input(#FFCDD2, "Below Grow", group="Histogram", inline="Below")
//col_fall_below = input(#FF5252, "Fall", group="Histogram", inline="Below")
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
buy_MACD = macd < signal and hist < 0 
sell_MACD = macd > signal and hist > 0 

//buy_MACD = true 
//sell_MACD = true

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below)))
//plot(macd, title="MACD", color=col_macd)
//plot(signal, title="Signal", color=col_signal)

sessionColor = color(na)
if time_cond

    if (not na(kStochRSI) and not na(d))
        cmt = str.tostring(close)
    	if (buy_stochRSI and buy_MACD and buy_mfi and buy_rsi)
    		strategy.entry("BUY", strategy.long, comment='BUY @ ' + cmt)
    		if longProfitPerc != 0
    		    strategy.exit(id="x", stop=longExitPrice, comment='EXIT @ ' + str.tostring(longExitPrice))
        	sessionColor := input.color(#0000FF, "buy") //red
    	if (sell_stochRSI and sell_MACD and sell_mfi and sell_rsi)
    		strategy.entry("SELL", strategy.short, comment='SELL @ ' + cmt)
    		sessionColor := input.color(#FF0000, "sell") //green
    	
bgcolor(sessionColor)