Estrategia de posiciones nocturnas de tendencia corta y larga entre mercados basada en el indicador EMA

EMA MA
Fecha de creación: 2024-11-12 10:49:00 Última modificación: 2024-11-12 10:49:00
Copiar: 2 Número de Visitas: 483
1
Seguir
1617
Seguidores

Estrategia de posiciones nocturnas de tendencia corta y larga entre mercados basada en el indicador EMA

La estrategia es una estrategia de posición nocturna en el mercado basado en indicadores técnicos de EMA, diseñada para capturar oportunidades de negociación antes y después del cierre del mercado. La estrategia permite realizar operaciones inteligentes en diferentes entornos de mercado a través de un control de tiempo preciso y un filtro de indicadores técnicos.

Descripción general de la estrategia

Las estrategias se benefician principalmente de entrar en el mercado a una hora determinada antes de la clausura del mercado y salir a una hora determinada después de la apertura del mercado al día siguiente. En combinación con los indicadores EMA como confirmación de tendencias, se buscan oportunidades de negociación en varios mercados globales.

Principio de estrategia

  1. Control de tiempo: según el tiempo de negociación de los diferentes mercados, entrada fija antes del cierre y salida fija después del cierre
  2. Filtración de EMA: validación de la señal de entrada con el indicador EMA opcional
  3. Opciones de mercado: soporte para la adaptación de las horas de negociación en los tres principales mercados: EE.UU., Asia y Europa
  4. Protección de fin de semana: obligar a cerrar las posiciones antes del cierre del viernes para evitar riesgos de posesión durante el fin de semana

Ventajas estratégicas

  1. Adaptabilidad a varios mercados: la flexibilidad de ajustar el horario de negociación en función de las diferentes características del mercado
  2. Mejoras en el control de riesgos: incluye un mecanismo de protección de liquidación de fin de semana
  3. Alto grado de automatización: soporte para el emparejamiento de interfaces de transacción automáticas
  4. Parámetros flexibles: tiempo de negociación y parámetros de indicadores técnicos se pueden personalizar
  5. Consideración de los costos de la transacción: incluye honorarios y configuración de puntos de deslizamiento

Riesgo estratégico

  1. Riesgo de fluctuaciones en el mercado: las posiciones nocturnas podrían hacerse trizas
  2. Dependencia en el tiempo: la eficacia de la estrategia se ve afectada por la elección del período de tiempo del mercado
  3. Limitaciones en los indicadores técnicos: un solo EMA puede estar rezagado Recomendación: Establezca límites de parada y agregue más pruebas de indicadores técnicos

Dirección de optimización de la estrategia

  1. Aumentar el conjunto de indicadores técnicos
  2. Introducción de un filtro de fluctuaciones
  3. Optimización de la selección de la entrada y salida
  4. Adición de la función de ajuste de parámetros de adaptación
  5. Modulo de control de riesgos mejorado

Resumir

La estrategia logra un sistema de negociación nocturna fiable a través de un control preciso del tiempo y filtración de indicadores técnicos. La estrategia está diseñada teniendo en cuenta las necesidades de la batalla real, incluidos los elementos de adaptación a múltiples mercados, control de riesgos y automatización de operaciones, con un fuerte valor práctico.

Código Fuente de la Estrategia
/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-11 00:00:00
period: 1d
basePeriod: 1d
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/
// © PresentTrading

// This strategy, titled "Overnight Market Entry Strategy with EMA Filter," is designed for entering long positions shortly before 
// the market closes and exiting shortly after the market opens. The strategy allows for selecting between different global market sessions (US, Asia, Europe) and 
// uses an optional EMA (Exponential Moving Average) filter to validate entry signals. The core logic is to enter trades based on conditions set for a specified period before 
// the market close and to exit trades either after a specified period following the market open or just before the weekend close. 
// Additionally, 3commas bot integration is included to automate the execution of trades. The strategy dynamically adjusts to market open and close times, ensuring trades are properly timed based on the selected market. 
// It also includes a force-close mechanism on Fridays to prevent holding positions over the weekend.

//@version=5
strategy("Overnight Positioning with EMA Confirmation - Strategy [presentTrading]", overlay=true, precision=3, commission_value=0.02, commission_type=strategy.commission.percent, slippage=1, currency=currency.USD, default_qty_type=strategy.percent_of_equity, default_qty_value=10, initial_capital=10000)

// Input parameters
entryMinutesBeforeClose = input.int(20, title="Minutes Before Close to Enter", minval=1)
exitMinutesAfterOpen = input.int(20, title="Minutes After Open to Exit", minval=1)
emaLength = input.int(100, title="EMA Length", minval=1)
emaTimeframe = input.timeframe("240", title="EMA Timeframe")
useEMA = input.bool(true, title="Use EMA Filter")

// Market Selection Input
marketSelection = input.string("US", title="Select Market", options=["US", "Asia", "Europe"])

// Timezone for each market
marketTimezone = marketSelection == "US" ? "America/New_York" :
                 marketSelection == "Asia" ? "Asia/Tokyo" :
                 "Europe/London"  // Default to London for Europe

// Market Open and Close Times for each market
var int marketOpenHour = na
var int marketOpenMinute = na
var int marketCloseHour = na
var int marketCloseMinute = na

if marketSelection == "US"
    marketOpenHour := 9
    marketOpenMinute := 30
    marketCloseHour := 16
    marketCloseMinute := 0
else if marketSelection == "Asia"
    marketOpenHour := 9
    marketOpenMinute := 0
    marketCloseHour := 15
    marketCloseMinute := 0
else if marketSelection == "Europe"
    marketOpenHour := 8
    marketOpenMinute := 0
    marketCloseHour := 16
    marketCloseMinute := 30

// 3commas Bot Settings
emailToken = input.string('', title='Email Token', group='3commas Bot Settings')
long_bot_id = input.string('', title='Long Bot ID', group='3commas Bot Settings')
usePairAdjust = input.bool(false, title='Use this pair in PERP', group='3commas Bot Settings')
selectedExchange = input.string("Binance", title="Select Exchange", group='3commas Bot Settings', options=["Binance", "OKX", "Gate.io", "Bitget"])

// Determine the trading pair based on settings
var pairString = ""
if usePairAdjust
    pairString := str.tostring(syminfo.currency) + "_" + str.tostring(syminfo.basecurrency) + (selectedExchange == "OKX" ? "-SWAP" : "") 
else
    pairString := str.tostring(syminfo.currency) + "_" + str.tostring(syminfo.basecurrency)

// Function to check if it's a trading day (excluding weekends)
isTradingDay(t) =>
    dayOfWeek = dayofweek(t, marketTimezone)
    dayOfWeek >= dayofweek.monday and dayOfWeek <= dayofweek.friday

// Function to get the timestamp for market open and close times
getMarketTimes(t) =>
    y = year(t, marketTimezone)
    m = month(t, marketTimezone)
    d = dayofmonth(t, marketTimezone)
    marketOpenTime = timestamp(marketTimezone, y, m, d, marketOpenHour, marketOpenMinute, 0)
    marketCloseTime = timestamp(marketTimezone, y, m, d, marketCloseHour, marketCloseMinute, 0)
    [marketOpenTime, marketCloseTime]

// Get the current time in the market's timezone
currentTime = time

// Calculate market times
[marketOpenTime, marketCloseTime] = getMarketTimes(currentTime)

// Calculate entry and exit times
entryTime = marketCloseTime - entryMinutesBeforeClose * 60 * 1000
exitTime = marketOpenTime + exitMinutesAfterOpen * 60 * 1000

// Get EMA data from the specified timeframe
emaValue = request.security(syminfo.tickerid, emaTimeframe, ta.ema(close, emaLength))

// Entry condition with optional EMA filter
longCondition = close > emaValue or not useEMA

// Functions to create JSON strings
getEnterJson() =>
    '{"message_type": "bot", "bot_id": "' + long_bot_id + '", "email_token": "' + emailToken + '", "delay_seconds": 0, "pair": "' + pairString + '"}'

getExitJson() =>
    '{"action": "close_at_market_price", "message_type": "bot", "bot_id": "' + long_bot_id + '", "email_token": "' + emailToken + '", "delay_seconds": 0, "pair": "' + pairString + '"}'

// Entry Signal
entrySignal = isTradingDay(currentTime) and currentTime >= entryTime and currentTime < marketCloseTime and dayofweek(currentTime, marketTimezone) != dayofweek.friday

// Exit Signal
exitSignal = isTradingDay(currentTime) and currentTime >= exitTime and currentTime < marketCloseTime

// Entry Logic
if strategy.position_size == 0 and longCondition
    strategy.entry("Long", strategy.long, alert_message=getEnterJson())

// Exit Logic
if  strategy.position_size > 0
    strategy.close("Long", alert_message=getExitJson())

// Force Close Logic on Friday before market close
isFriday = dayofweek(currentTime, marketTimezone) == dayofweek.friday
if  strategy.position_size > 0  // Close 5 minutes before market close on Friday
    strategy.close("Long", comment="Force close on Friday before market close", alert_message=getExitJson())

// Plotting entry and exit points
plotshape( strategy.position_size == 0 and longCondition, title="Entry", text="Entry", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)
plotshape( strategy.position_size > 0, title="Exit", text="Exit", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)

// Plot EMA for reference
plot(useEMA ? emaValue : na, title="EMA", color=color.blue)