Эта стратегия - это простая автоматическая многоголовая тенденционная стратегия, основанная на технических показателях, применяемая к криптовалютам, таким как биткойн и эфириум, с целью захвата основных тенденций к росту и снижения потерь в комиссионных сборах, связанных с частыми сделками.
Используйте MACD для определения направления тренда, MACD больше смотрит вверх при скрещивании;
Вычислить 20-циклическую ЭМА, 100-циклическую СМА и 200-циклическую СМА, при этом ЭМА и СМА будут смотреть вверх;
Если EMA выше SMA, то можно купить больше, если SMA выше SMA, то можно купить больше, если SMA выше SMA.
Устанавливаем линию стоп-лосса и выходим из нее, если цена пересекает линию стоп-лосса.
Выход из равновесного положения при прохождении EMA ниже SMA, когда цена падает.
Эта стратегия включает в себя несколько показателей, чтобы определить тенденцию и время входа в рынок и получить прибыль, отслеживая основные тенденции роста.
По мнению экспертов, в результате использования многополюсных комбинаций можно эффективно отфильтровать ошибочные сигналы, такие как ложные прорывы.
Привлечение к рынку только в то время, когда есть четкая тенденция, позволяет сократить ненужные сделки и снизить их частоту;
Стоп-стратегия эффективно контролирует максимальные потери от одной сделки.
По данным отслеживания, в биткоине и эфириуме можно получить лучшую прибыль.
Логика стратегии проста, понятна, легко понятна и подходит для начинающих.
Это позволяет внедрять дополнительные показатели для оптимизации.
Рыночная активность - это риск ошибок в оценке.
В частности, он отметил, что “одиночные позиции не позволяют избежать системного риска”.
Неправильная установка точки остановки может привести к чрезмерной остановке;
Данные отслеживания не представляют реальных результатов, их эффективность еще предстоит проверить.
В результате, как отмечается в статье, в некоторых странах существуют ограничения на транзакционные расходы, которые не влияют на эффективность транзакций.
Не учитывая особенности разных сортов, необходимо адаптировать оптимизацию.
тестирование различных комбинаций параметров, оптимизация параметров показателей;
Добавление фильтрации входных сигналов по таким показателям, как KDJ;
Оптимизация стратегии по прекращению убытков, введение динамического прекращения убытков;
Рассмотрение управления средствами счетов и корректировка размеров позиций;
Разделение сортовых характеристик и корректировка параметров;
Вместе с этим, мы можем использовать больше временных циклов для оценки.
Проверьте различные сорта, чтобы определить лучшие.
Общая идея этой стратегии ясна и понятна. Использование мульти-индикаторного суждения может эффективно отфильтровать ошибочные сигналы. Но все еще требуется дальнейшая оптимизация параметров, контроля риска и т. Д., а затем в сочетании с проверкой на реальном рынке.
/*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