Melhor forma de fazer o robô operar apenas em mercado aberto, fora de leilão e etc.

 

Olá, tudo bem?

Estou precisando realizar alterações para que meu robô opere apenas dentro do mercado aberto, que não opere em leilão e depois da call de fechamento, vi que não tinha nada nativo para isso, então desenvolvi os seguintes métodos que rodam a cada tick:

// Verifica se o horário atual está dentro do horário permitido
bool IsMarketOpen()
{
    MqlDateTime currentTime;
    TimeToStruct(TimeLocal(), currentTime);

    int hour = currentTime.hour;
    int minute = currentTime.min;
    
    // Permitir operações apenas entre 09:00 e 17:55
    if ((hour > 9 || (hour == 9 && minute >= 0)) && (hour < 17 || (hour == 17 && minute < 55)))
        return true;
    return false;
}

// Função para encerrar todas as operações às 18h
void CloseAllAt18h()
{
    MqlDateTime currentTime;
    TimeToStruct(TimeLocal(), currentTime);

    int hour = currentTime.hour;
    int minute = currentTime.min;

    // Se for 18:00, encerra todas as posições abertas
    if (hour == 18 && minute == 0)
    {
        for (int i = PositionsTotal() - 1; i >= 0; i--)
        {
            if (PositionSelect(PositionGetSymbol(i)))
            {
                string symbol = PositionGetString(POSITION_SYMBOL);
                double volume = PositionGetDouble(POSITION_VOLUME);

                if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
                {
                    trade.Sell(volume, symbol);  // Fecha a posição comprada
                }
                else if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
                {
                    trade.Buy(volume, symbol);  // Fecha a posição vendida
                }
            }
        }
    }
}

void OnTick()
{
    CloseAllAt18h();  // Encerra todas as operações às 18h   

    // Verifica se está dentro do horário permitido
    if (!IsMarketOpen())
        return;
}


Essa abordagem está correta, e é a melhor a se seguir?


Agradeço antecipadamente!

 
Jvmelo:

Olá, tudo bem?

Estou precisando realizar alterações para que meu robô opere apenas dentro do mercado aberto, que não opere em leilão e depois da call de fechamento, vi que não tinha nada nativo para isso, então desenvolvi os seguintes métodos que rodam a cada tick:


Essa abordagem está correta, e é a melhor a se seguir?


Agradeço antecipadamente!

Recomendaria deixar os horarios de encerramento flexiveis por conta do verao americano que os futuros brasileiros tem horario extendido e nao temos aftermarket... O leilao de abertura tambem tem alguns que recomendam ficar de olho nos trades realizados e esperar vir a informação do primeiro negocio com volume. Isso diz que acabou o leilão, se procurar aqui no forum tem mais informação sobre isso.

Uma outra verificação seria do spread ter que ser positivo (bid < ask), esse é o comportamento normal do mercado e quando violado (bid > ask) tende a ser leilão. Se pretende operar forex transformar essa validacao do spread em um intervalo poderia ser bom.

 
Ricardo Rodrigues Lucca #:

Recomendaria deixar os horarios de encerramento flexiveis por conta do verao americano que os futuros brasileiros tem horario extendido e nao temos aftermarket... O leilao de abertura tambem tem alguns que recomendam ficar de olho nos trades realizados e esperar vir a informação do primeiro negocio com volume. Isso diz que acabou o leilão, se procurar aqui no forum tem mais informação sobre isso.

Uma outra verificação seria do spread ter que ser positivo (bid < ask), esse é o comportamento normal do mercado e quando violado (bid > ask) tende a ser leilão. Se pretende operar forex transformar essa validacao do spread em um intervalo poderia ser bom.

Olá Ricardo, desenvolvi o método abaixo para saber se o ativo está em leilão, concorda que irá ser eficaz?


// Função para verificar se o ativo está em leilão
bool IsAuction(string symbol)
{
    // Obtenção dos dados de bid e ask
    double bid = SymbolInfoDouble(symbol, SYMBOL_BID);
    double ask = SymbolInfoDouble(symbol, SYMBOL_ASK);

    // Verifica se o spread é negativo (bid > ask)
    bool isSpreadNegative = bid > ask;

    // Verifica se há negociações recentes
    bool isNoVolume = true;
    MqlTick ticks[];
    int count = CopyTicks(symbol, ticks, COPY_TICKS_ALL, 0, 1); // Obtém os ticks mais recentes

    if (count > 0)
    {
        // Se houver pelo menos um tick, significa que houve negociações
        isNoVolume = false;
    }

    // Se o spread for negativo ou não houve volume de trades, o ativo está em leilão
    if (isSpreadNegative || isNoVolume)
    {
        Print(symbol + " está em leilão. Spread negativo ou sem volume negociado.");
        return true;
    }

    // Caso contrário, não está em leilão
    return false;
}
 
Jvmelo #:

Olá Ricardo, desenvolvi o método abaixo para saber se o ativo está em leilão, concorda que irá ser eficaz?


A parte do negocio que tu copiou o os ticks fez errado, voce pediu movimento de ask/bid e negocios fechados. Em leilao o ask/bid move e o numero de negocios é zero. Tem esses topicos aqui com discussões que falam disso:

https://www.mql5.com/pt/forum/438309

https://www.mql5.com/pt/forum/343557

https://www.mql5.com/pt/forum/310907

Como encerrar trade no leilão de fechamento
Como encerrar trade no leilão de fechamento
  • 2022.12.19
  • Igor Tiosso
  • www.mql5.com
Estou tentando contratar programador de EA para uma estratégia minha mas TODOS falam que não querem fazer pq tem problemas na hora de operar no lei...