O recurso está a ser carregado... Carregamento...

Estratégia de posições de mercado cruzado durante o dia com filtro EMA

Autora:ChaoZhang, Data: 2024-11-12 10:49:00
Tags:EMAMA

img

Esta estratégia é uma estratégia de posições overnight de mercado cruzado baseada no indicador técnico da EMA, concebida para captar oportunidades de negociação antes do fechamento do mercado e após a abertura do mercado.

Estratégia geral

A estratégia ganha retornos principalmente entrando em horários específicos antes do fechamento do mercado e saindo em horários específicos após a abertura do mercado no dia seguinte. Combinado com indicadores EMA para confirmação de tendência, procura oportunidades de negociação em vários mercados globais (EUA, Ásia, Europa). A estratégia também integra funcionalidade de negociação automatizada para operação desatendida.

Princípio da estratégia

  1. Controle do tempo: entrada em horários fixos antes do fechamento e saída em horários fixos após a abertura com base em diferentes horas de negociação do mercado
  2. Filtragem da EMA: utilizar indicadores opcionais da EMA para validar os sinais de entrada
  3. Seleção de mercado: apoio à adaptação do horário de negociação para os mercados dos EUA, da Ásia e da Europa
  4. Protecção de fim de semana: Forçar o fechamento de posições antes do fechamento das sextas-feiras para evitar riscos de detenção no fim de semana

Vantagens da estratégia

  1. Adaptabilidade a vários mercados: ajustamento flexível dos tempos de negociação em função das diferentes características do mercado
  2. Controlo de risco abrangente: inclui o mecanismo de protecção do encerramento de posições no fim de semana
  3. Alto nível de automação: Suporta integração de interface de negociação automatizada
  4. Parâmetros flexíveis: prazos de negociação e parâmetros de indicadores técnicos personalizáveis
  5. Consideração do custo de negociação: Inclui a comissão e as configurações de deslizamento

Riscos estratégicos

  1. Risco de volatilidade do mercado: as posições overnight podem enfrentar risco de diferença
  2. Dependência do tempo: a eficácia da estratégia afetada pela escolha do período de tempo do mercado
  3. Limitações dos indicadores técnicos: o indicador único da EMA pode apresentar atraso Sugestões: definir limites de stop-loss, adicionar mais indicadores técnicos para validação

Orientações para a otimização da estratégia

  1. Adicionar mais combinações de indicadores técnicos
  2. Introduzir um mecanismo de filtragem da volatilidade
  3. Otimizar a selecção dos horários de entrada e saída
  4. Adicionar função de ajuste de parâmetros adaptativos
  5. Melhorar o módulo de controlo de riscos

Resumo

Esta estratégia atinge um sistema de negociação overnight confiável através de controle preciso do tempo e filtragem de indicadores técnicos. O projeto da estratégia considera abrangentemente os requisitos práticos, incluindo adaptação de vários mercados, controle de riscos e elementos de negociação automatizada, demonstrando forte valor prático. Através de otimização e melhoria contínua, esta estratégia tem o potencial de alcançar retornos estáveis na negociação ao vivo.


/*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)


Relacionados

Mais.