
This strategy is a trend following system that combines traditional technical analysis with modern artificial intelligence methods. It primarily uses Exponential Moving Average (EMA) and Simple Moving Average (SMA) as trend filters, while incorporating a prediction model to optimize entry timing. The strategy is specifically optimized for daily timeframes, aiming to capture medium to long-term market trends.
The core logic consists of three main components: 1. Trend Determination System - Uses 200-period EMA and SMA as primary trend filters, determining current trend direction through price-to-moving average relationships 2. Prediction Module - Employs an expandable prediction component, currently using simulated predictions, with the capability to be replaced by machine learning models 3. Position Management - Sets a fixed 4-bar holding period to control position duration and risk
Trade signals require consistency between trend direction and prediction signals: - Long signals: Price above both EMA and SMA, with positive prediction value - Short signals: Price below both EMA and SMA, with negative prediction value
This strategy builds a robust trend following system by combining traditional technical analysis with modern prediction methods. Its main advantages lie in clear logic, controlled risk, and strong scalability. Through strategy optimization, particularly in prediction models and risk control improvements, it has the potential to further enhance stability and profitability. The strategy is suitable for investors seeking medium to long-term stable returns.
/*backtest
start: 2024-02-21 00:00:00
end: 2025-02-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("My Strategy", overlay=true)
// Parameters (adjust as needed)
neighborsCount = 8
maxBarsBack = 2000
featureCount = 5
useDynamicExits = true
useEmaFilter = true
emaPeriod = 200
useSmaFilter = true
smaPeriod = 200
// Moving Average Calculations
ema = ta.ema(close, emaPeriod)
sma = ta.sma(close, smaPeriod)
// Trend Conditions
isEmaUptrend = close > ema
isEmaDowntrend = close < ema
isSmaUptrend = close > sma
isSmaDowntrend = close < sma
// Model Prediction (Replace with your real model)
// Here a simulation is used, replace it with real predictions
prediction = math.random() * 2 - 1 // Random value between -1 and 1
// Entry Signals
isNewBuySignal = prediction > 0 and isEmaUptrend and isSmaUptrend
isNewSellSignal = prediction < 0 and isEmaDowntrend and isSmaDowntrend
// Exit Signals
var int barsHeld = 0
var bool in_position = false
var int entry_bar = 0
if isNewBuySignal and not in_position
in_position := true
entry_bar := bar_index
barsHeld := 1
else if isNewSellSignal and not in_position
in_position := true
entry_bar := bar_index
barsHeld := 1
else if in_position
barsHeld := barsHeld + 1
if barsHeld == 4
in_position := false
endLongTradeStrict = barsHeld == 4 and isNewBuySignal[1]
endShortTradeStrict = barsHeld == 4 and isNewSellSignal[1]
// Backtest Logic
var float totalProfit = 0
var float entryPrice = na
var int tradeDirection = 0
if isNewBuySignal and tradeDirection <= 0
entryPrice := close
tradeDirection := 1
strategy.entry("Long", strategy.long)
if isNewSellSignal and tradeDirection >= 0
entryPrice := close
tradeDirection := -1
strategy.entry("Short", strategy.short)
if (endLongTradeStrict and tradeDirection == 1) or (endShortTradeStrict and tradeDirection == -1)
exitPrice = close
profit = (exitPrice - entryPrice) / entryPrice
if tradeDirection == -1
profit := (entryPrice - exitPrice) / entryPrice
totalProfit := totalProfit + profit
tradeDirection := 0
strategy.close_all()
plot(close, color=color.blue)
plot(ema, color=color.orange)
plot(sma, color=color.purple)