
Эта стратегия является простой подвижной средней стратегией для слежения за тенденциями в биткоинах и эфириумах. Она объединяет несколько показателей, таких как средняя линия, MACD и RSI, чтобы идентифицировать направление тенденции и отслеживать тенденцию с помощью длинных линий с фиксированными позициями.
Основная логика стратегии заключается в том, чтобы делать больше, когда 20-дневная линия EMA проходит 100-дневную SMA, а 100-дневная SMA проходит 200-дневную SMA; и быть плохим, когда 20-дневная линия EMA проходит 100-дневную SMA. То есть использовать движущиеся средние трех различных периодов для определения направления тренда.
В частности, стратегия определяет тренд, рассчитывая значения 20-дневной линии EMA, 100-дневной линии SMA и 200-дневной линии SMA и сравнивая их величины. Когда 20-дневная линия EMA проходит 100-дневную линию SMA, то есть 20-дневная линия EMA больше, чем 100-дневная линия SMA, это означает, что цена начинает расти. В то же время, если 100-дневная линия SMA также больше, чем 200-дневная линия SMA, это означает, что среднесрочная тенденция также растет, что является сильным сигналом.
После входа в многопозиционную позицию, стратегия будет держать позицию и следовать тренду. Когда 20-я линия EMA снова пересекает 100-дневную линию SMA, указывающую на обратный сигнал краткосрочной тенденции, тогда стратегия выбирает стоп-позицию.
Кроме того, стратегия также использует MACD и RSI для подтверждения тренда. Выбор открытия позиции будет осуществляться только в том случае, если MACD DIF, DEMA и HIST линий будут повышены, а RSI будет выше 50.
Наибольшим преимуществом этой стратегии является создание четких правил торговли трендами, которые позволяют эффективно отслеживать средне-длинные тренды. Конкретные преимущества:
В этой стратегии также есть некоторые риски, главная проблема заключается в том, что при обратном тренде нельзя вовремя остановить. Конкретные риски и способы их устранения следующие:
Невозможность своевременного отслеживания обратной точки: можно сократить средний цикл или добавить больше показателей для комплекса.
Продолжительное хранение позиций может привести к большим потерям: можно уместно сократить линию выхода и своевременно прекратить убытки.
Среднелинейный индикатор легко задерживается: можно добавить стоп-линию с определенным процентом отступления, активный стоп.
Эта стратегия также может быть оптимизирована в следующих аспектах:
Проверка среднелинейных циклов с большим количеством комбинаций для поиска оптимальных параметров.
Попробуйте другие индикаторы или модели для определения тенденций и времени входа в рынок. Например, ленты Брин, индикаторы KD и т.д.
Динамическая оптимизация параметров с использованием машинного обучения и т. д. Например, с использованием усиленного обучения для корректировки стоп-потери.
В сочетании с показателями объема сделок, чтобы избежать ложных прорывов. Например, показатели энергетического потока, объема сделок и т. Д.
Разработка системы автоматического остановки и отслеживания остановки, позволяющей корректировать положение остановки в зависимости от рыночных условий.
Стратегия в целом является простой и прямой стратегией отслеживания тенденции. Она использует движущиеся средние для определения направления тенденции, MACD и RSI для фильтрации сигналов.
/*backtest
start: 2024-01-16 00:00:00
end: 2024-01-17 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="BTC_Long_Only_TV01_200507", overlay=true)
//////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! /////////////////////
//280820 - After long esting this is the best script for ETHUSD in 4 hours. From 01/01/2020 til 28/08/2020
[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 (5, "StopLoss in %", type=input.float) //StopLoss associated with the order
//Best for alt versus BTC float stopLoss = input (3, "StopLoss in %", type=input.float) //StopLoss associated with the order
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 = 2020
//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 = 14
ToMonth = 05
ToYear = 2029
// === 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"
//FUNCTION DEFINITIONS
//----------------------
IsRising(data, loopBack) =>
bIsRising = true
for n = 1 to loopBack
if data[n] > data[n-1]
bIsRising := false
continue
bIsRising
IsFalling(data, loopBack) =>
bIsFalling = true
for n = 1 to loopBack
if data[n] < data[n-1]
bIsFalling := false
continue
bIsFalling
// END OF FUNCTION DEFINITIONS //
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]) ? 1000 : positionSize[1]
stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1]
//leverage := na(leverage[1]) ? 1 : leverage[1]
bEMAIsRising := IsRising(ema, 2)
bSMAIsRising := IsRising(sma, 3)
bMACDIsRising := IsRising(macdLine, 3)
bMACDHistIsRising := IsRising(macdHist, 1)
bSMASlowIsRising := IsRising(smaSlow, 10)
bMACDSignalIsRising := IsRising(macdSignalLine, 3)
atrValue := atr(14)
volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price
if (window())
//Check if we can open a LONG
if (bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < 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])))
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