
EMA Gold Cross-Return Strategy - это количественная торговая стратегия, основанная на показателях EMA. Эта стратегия использует три различных цикла кривой EMA для построения торгового сигнала и, в сочетании с механизмом ценового возврата, устанавливает стоп-стоп для автоматической торговли.
Стратегия использует три кривые EMA:
Создание торгового сигнала следует следующей логике:
Многоглавый сигнал: после того, как цена наносит EMA1constitutes, происходит обратная коррекция, и выше EMA1 образуется более высокая низкая точка, и степень обратной коррекции не касается EMA2. После удовлетворения условий, делается больше, когда снова наносится EMA1.
Пустой сигнал: после того, как цена пересекает EMA1, возникает обратная коррекция, в нижней части EMA1 образуется более низкая высокая точка, степень обратной коррекции не касается EMA2. После удовлетворения условий, пустота при повторном пересечении EMA1.
Стойкость - это минимальная цена/максимальная цена. Стойкость устанавливается в 2 раза выше, чем стоп-стоп.
Эта стратегия имеет следующие преимущества:
Однако эта стратегия также несет в себе определенные риски:
Параметры могут быть оптимизированы с помощью таких методов, как коррекция циклов EMA, отклонение предельного диапазона. Также параметры могут быть интегрированы с другими показателями фильтрации сигналов.
Эта стратегия также может быть оптимизирована в следующих аспектах:
Стратегия EMA Gold Cross-Return реализует автоматизированную торговлю путем построения трех торговых систем EMA, в сочетании с функциями ценового возврата и установкой стоп-стоп. Эта стратегия эффективно контролирует торговый риск и может быть оптимизирована в зависимости от рынка путем корректировки параметров. В целом, стратегия логична и практически применима. В будущем может быть дополнительно оптимизирована с точки зрения параметров определения тенденции, оптимизации параметров, контроля риска и т. Д.
/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// created by Space Jellyfish
//@version=4
strategy("EMA pullback strategy", overlay = true, initial_capital=10000, commission_value = 0.075)
target_stop_ratio = input(title="Take Profit Stop Loss ratio", type=input.float, defval=2.06, minval=0.5, maxval=100)
riskLimit_low = input(title="lowest risk per trade", type=input.float, defval=0.008, minval=0, maxval=100)
riskLimit_high = input(title="highest risk per trade", type=input.float, defval=0.02, minval=0, maxval=100)
//give up the trade, if the risk is smaller than limit, adjust position size if risk is bigger than limit
ema_pullbackLevel_period = input(title="EMA1 for pullback level Period", type=input.integer, defval=33, minval=1, maxval=10000)
ema_pullbackLimiit_period = input(title="EMA2 for pullback limit Period", type=input.integer, defval=165, minval=1, maxval=10000)
ema_trend_period = input(title="EMA3 for trend Period", type=input.integer, defval=365, minval=1, maxval=10000)
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=2018, minval=2008, maxval=2200)
inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))
ema_pullbackLevel = ema(close, ema_pullbackLevel_period)
ema_pullbackLimit = ema(close, ema_pullbackLimiit_period)
ema_trendDirection = ema(close, ema_trend_period)
//ema pullback
float pricePullAboveEMA_maxClose = na
float pricePullAboveEMA_maxHigh = na
float pricePullBelowEMA_minClose = na
float pricePullBelowMA_minLow = na
if(crossover(close, ema_pullbackLevel))
pricePullAboveEMA_maxClose := close
pricePullAboveEMA_maxHigh := high
else
pricePullAboveEMA_maxClose := pricePullAboveEMA_maxClose[1]
pricePullAboveEMA_maxHigh := pricePullAboveEMA_maxHigh[1]
if(close > pricePullAboveEMA_maxClose)
pricePullAboveEMA_maxClose := close
if(high > pricePullAboveEMA_maxHigh)
pricePullAboveEMA_maxHigh := high
if(crossunder(close, ema_pullbackLevel))
pricePullBelowEMA_minClose := close
pricePullBelowMA_minLow := low
else
pricePullBelowEMA_minClose :=pricePullBelowEMA_minClose[1]
pricePullBelowMA_minLow:=pricePullBelowMA_minLow[1]
if(close < pricePullBelowEMA_minClose)
pricePullBelowEMA_minClose := close
if(low < pricePullBelowMA_minLow)
pricePullBelowMA_minLow := low
long_strategy = crossover(close, ema_pullbackLevel) and pricePullBelowEMA_minClose < ema_pullbackLimit and ema_pullbackLevel>ema_trendDirection
short_strategy = crossunder(close, ema_pullbackLevel) and pricePullAboveEMA_maxClose > ema_pullbackLimit and ema_pullbackLevel<ema_trendDirection
var open_long_or_short = 0// long = 10000, short = -10000, no open = 0
//check if position is closed
if(strategy.position_size == 0)
open_long_or_short := 0
else
open_long_or_short := open_long_or_short[1]
float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na
float entryContracts = 0
risk_long := risk_long[1]
risk_short := risk_short[1]
//open a position determine the position size
if (strategy.position_size == 0 and long_strategy and inDateRange)
risk_long := (close - pricePullBelowMA_minLow) / close
if(risk_long < riskLimit_high)
entryContracts := strategy.equity / close
else
entryContracts := (strategy.equity * riskLimit_high / risk_long)/close
if(risk_long > riskLimit_low)
strategy.entry("long", strategy.long, qty = entryContracts, when = long_strategy)
open_long_or_short := 10000
if (strategy.position_size == 0 and short_strategy and inDateRange)
risk_short := (pricePullAboveEMA_maxHigh - close) / close
if(risk_short < riskLimit_high)
entryContracts := strategy.equity / close
else
entryContracts := (strategy.equity * riskLimit_high / risk_short)/close
if(risk_short > riskLimit_low)
strategy.entry("short", strategy.short, qty = entryContracts, when = short_strategy)
open_long_or_short := -10000
//take profit / stop loss
if(open_long_or_short == 10000)
stopLoss := strategy.position_avg_price*(1 - risk_long)
takeProfit := strategy.position_avg_price*(1 + target_stop_ratio * risk_long)
entry_price := strategy.position_avg_price
strategy.exit("Long exit","long", limit = takeProfit , stop = stopLoss)
if(open_long_or_short == -10000)
stopLoss := strategy.position_avg_price*(1 + risk_short)
takeProfit := strategy.position_avg_price*(1 - target_stop_ratio * risk_short)
entry_price := strategy.position_avg_price
strategy.exit("Short exit","short", limit = takeProfit, stop = stopLoss)
plot(ema_pullbackLevel, color=color.aqua, title="ema pullback level")
plot(ema_pullbackLimit, color=color.purple, title="ema pullback limit")
plot(ema_trendDirection, color=color.white, title="ema trend")
plot(entry_price, color = color.yellow, linewidth = 1, style = plot.style_linebr)
plot(stopLoss, color = color.red, linewidth = 1, style = plot.style_linebr)
plot(takeProfit, color = color.green, linewidth = 1, style = plot.style_linebr)
//