Estratégia de posição overnight de tendência longa e curta entre mercados com base no indicador EMA

EMA MA
Data de criação: 2024-11-12 10:49:00 última modificação: 2024-11-12 10:49:00
cópia: 2 Cliques: 483
1
focar em
1617
Seguidores

Estratégia de posição overnight de tendência longa e curta entre mercados com base no indicador EMA

Esta estratégia é uma estratégia de posicionamento nocturno entre mercados, baseada em indicadores técnicos EMA, que visa capturar oportunidades de negociação antes e depois do fechamento do mercado. A estratégia permite negociações inteligentes em diferentes ambientes de mercado através de controle de tempo preciso e filtragem de indicadores técnicos.

Visão geral da estratégia

A estratégia é gerada principalmente por entradas em um determinado horário antes do fechamento do mercado e saídas em um determinado horário após a abertura do mercado no dia seguinte. Em combinação com os indicadores EMA como confirmação de tendência, a estratégia busca oportunidades de negociação em vários mercados globais. A estratégia também integra a funcionalidade de negociação automatizada, permitindo a operação de guarda-valores não tripulados.

Princípio da estratégia

  1. Controle de tempo: de acordo com o horário de negociação de diferentes mercados, entrada de tempo fixo antes do fechamento e saída de tempo fixo após a abertura
  2. Filtragem EMA: sinais de entrada validados com indicadores EMA opcionais
  3. Opções de mercado: suporte para a adaptação dos horários de negociação nos três principais mercados: EUA, Ásia e Europa
  4. Proteção de fim de semana: forçar a liquidação antes do fechamento de sexta-feira para evitar riscos de fim de semana

Vantagens estratégicas

  1. Adaptabilidade em vários mercados: adaptabilidade dos horários de negociação em função das características dos diferentes mercados
  2. Controle de risco perfeito: Incluindo proteção de liquidação de fim de semana
  3. Alto nível de automação: suporte para interfaces de transação automáticas
  4. Parâmetros flexíveis: tempo de negociação e parâmetros de indicadores técnicos podem ser personalizados
  5. Considerações de custos de transação: incluindo taxas e configuração de ponto de deslizamento

Risco estratégico

  1. Risco de volatilidade do mercado: posicionamento durante a noite pode levar ao risco de queda
  2. Dependência de tempo: a eficácia da estratégia é afetada pela escolha do período de tempo do mercado
  3. Limitações de indicadores técnicos: um único indicador EMA pode estar atrasado Recomendação: estabelecer limites de parada e aumentar a verificação de indicadores técnicos

Direção de otimização da estratégia

  1. Adicionar mais pacotes de indicadores técnicos
  2. Introdução de um filtro de taxa de flutuação
  3. Optimizar a seleção de entradas e saídas
  4. Adição de ajuste de parâmetros de adaptação
  5. Modulo de controle de risco reforçado

Resumir

A estratégia permite um sistema de negociação confiável durante a noite, através de um controle preciso do tempo e filtragem de indicadores técnicos. A estratégia foi concebida levando em consideração as necessidades reais da batalha, incluindo adaptação a vários mercados, controle de risco e negociação automatizada, com um forte valor prático.

Código-fonte da estratégia
/*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)