Эта стратегия определяет направление текущего тренда путем расчета скользящих средних различных периодов и генерирует торговые сигналы в сочетании с индикатором RSI. Когда скользящая средняя короткого периода пересекает длинную скользящую среднюю, тенденция рассматривается и генерируется сигнал покупки. Когда скользящая средняя короткого периода пересекает длинную скользящую среднюю, тенденция считается обратной и генерируется сигнал продажи. Индикатор RSI используется для предотвращения ложных сигналов, вызванных незначительными колебаниями цен.
Вычислить 10-дневные, 20-дневные, 50-дневные, 100-дневные и 200-дневные простые скользящие средние.
Вычислить 14-дневный показатель.
Когда 10-дневная SMA пересекает 50-дневную SMA, а RSI больше 30, а 20-дневная SMA больше или равна 100-дневной SMA или 50-дневная SMA больше или равна 100-дневной SMA, покупать.
Установите цену стоп-лосса на цену входа, умноженную на (1 - процент стоп-лосса).
Продать, когда:
Эта стратегия оценивает рыночную тенденцию с использованием скользящих средних и устанавливает стоп-лосс для контроля рисков. RSI отфильтровывает ложные прорывы. Он покупает, когда краткосрочная SMA пересекает длинную SMA, указывая на восходящий тренд, и устанавливает линию стоп-лосса для контроля рисков в течение периода хранения. Он продает, когда происходит сигнал обратного тренда или цена стоп-лосса запускается.
Оптимизация может быть осуществлена путем корректировки периодов скользящей средней, уровней остановки потерь и т. Д. Также следует рассмотреть возможность сочетания с другими индикаторами для повышения точности.
Стратегия имеет четкую логику в целом, используя скользящие средние для определения тренда и установки стоп-лосса для контроля рисков. Это типичная стратегия отслеживания тренда. Дальнейшие улучшения могут быть достигнуты с помощью настройки параметров и добавления других индикаторов.
/*backtest start: 2022-09-30 00:00:00 end: 2023-10-06 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("MA_Script", overlay=true) // STEP 1: // Configure trail stop level with input options (optional) longTrailPerc=input(title="Trail Long Loss (%)", type=input.float, minval=0.0, step=0.05, defval=0.1) // Configure backtest start date with inputs startDate=input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31) startMonth=input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12) startYear=input(title="Start Year", type=input.integer, defval=2020, minval=1800, maxval=2100) // See if this bar's time happened on/after start date afterStartDate=(time >=timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) // Calculate Relative Strength Index rsiValue=rsi(close, 14) // Calculate moving averages MA10_Val =sma(close, 10) //plot(MA10_Val, color=color.yellow, linewidth=1) MA20_Val =sma(close, 20) plot(MA20_Val, color=color.green, linewidth=1) MA50_Val =sma(close, 50) plot(MA50_Val, color=color.red, linewidth=1) MA100_Val =sma(close, 100) plot(MA100_Val, color=color.blue, linewidth=1) MA200_Val =sma(close, 200) plot(MA200_Val, color=color.purple, linewidth=1) // Calculate candlestick C_BodyHi = max(close, open) C_BodyLo = min(close, open) C_Body = C_BodyHi - C_BodyLo C_UpShadow = high - C_BodyHi C_DnShadow = C_BodyLo - low // STEP 2: // Calculate entry trading conditions buyCondition_1=crossover(MA10_Val, MA50_Val) and (rsiValue > 30) and ((MA20_Val >= MA100_Val) or (MA50_Val >= MA100_Val)) avg_price = (close + open)/2 // First Entry if (afterStartDate) strategy.entry(id="Entry_Trade_1", long=true, limit=avg_price, when=buyCondition_1) plotchar(afterStartDate and crossover(MA10_Val, MA50_Val), textcolor = color.blue, text = 'MA\n') // Determine trail stop loss prices longStopPrice=0.0 longStopPrice :=if (strategy.position_size > 0) stopValue=C_BodyHi * (1 - longTrailPerc) max(stopValue, longStopPrice[1]) else 0 plot(longStopPrice, color=color.orange, linewidth=1) bought_1=strategy.position_size[0] > strategy.position_size[1] entry_Point_1=valuewhen(bought_1, avg_price, 0) // STEP 3: // Calculate exit trading conditions sellCondition_2=crossunder(MA10_Val, MA50_Val) and (close < MA20_Val) sellCondition_3_temp=valuewhen((C_BodyHi >= entry_Point_1*1.2), 1, 0) sellCondition_1=(entry_Point_1*0.95 > close) and (sellCondition_3_temp != 1) sellCondition_3=(sellCondition_3_temp == 1) and (strategy.position_size > 0) and close <= longStopPrice plotchar((sellCondition_3 == 1) and (strategy.position_size > 0) and close <= longStopPrice, textcolor = color.red, text = 'TS\n', show_last = 11) plotchar(crossunder(MA10_Val, MA50_Val), textcolor = color.red, text = 'MA\n') id_val = "" stop_val = close condition = false if sellCondition_1 id_val := "Exit By Stop Loss At 7%" stop_val := entry_Point_1*0.93 condition := true else if sellCondition_2 id_val := "Exit By Take Profit based on MA" stop_val := close condition := true else if sellCondition_3 id_val := "Exit By Trailing Stop" stop_val := longStopPrice condition := true // Submit exit orders for trail stop loss price if (strategy.position_size > 0) //strategy.exit(id="Exit By Stop Loss At 7%", from_entry="Entry_Trade_1", stop=entry_Point_1*0.93, when=sellCondition_1) //strategy.exit(id="Exit By Take Profit based on MA", from_entry="Entry_Trade_1", stop=close, when=sellCondition_2) strategy.exit(id=id_val, from_entry="Entry_Trade_1", stop=stop_val, when=condition)