Advisor funciona no Demo, mas na conta real sempre abre ordens de venda a mais que o solicitado (modo hedge).

 

Boa tarde amigos, eu escrevi um advisor que na conta demo, trabalha exatamente como previsto. Mas na conta real faz algo interessante. Toda vez que os parametros pra abrir uma ordem são atingidos, ele abre a ordem programada no código E uma ordem de venda adicional. Exemplo, se era pra abrir uma ordem de compra e venda em hedge, ele abre 1 de compra e 2 de venda. Se é pra abrir somente uma nova ordem de compra, ele abre uma de compra e uma de venda. E se é pra abrir uma ordem de venda, ele abre duas ordens de venda. Alguem já observou esse tipo de comportamento antes em alguma conta real? Aprecio qualquer ajuda e abaixo o codigo em questão.


#include <Trade\Trade.mqh>
input double LotSize=1.0; // Lot size for the orders

CTrade trade;
double initialEntryValue = 0.0;
bool isInitialOrdersPlaced = false;
bool isSellDone = false;
bool isBuyDone = false;

int OnInit()
{
  return(INIT_SUCCEEDED);
}

void OnTick()
{
  if (IsTradeAllowed())
  {
    double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
    // Set the initial entry value when autotrading starts

    if (initialEntryValue == 0.0)
    {
      initialEntryValue = currentPrice;
    }

    // Place the initial BUY and SELL orders
    if (!isInitialOrdersPlaced)
    {
      OpenBuyOrder();
      OpenSellOrder();
      isInitialOrdersPlaced = true;
    }

    //Check if there is just one position
    if (PositionsTotal() == 1)
    {          
      CheckPositionType(currentPrice);
    }

    // Check if there are no open positions
    if (PositionsTotal() == 0)
    {
      // Check if price came back to initialEntryValue and
      // Reopen both orders
       if (currentPrice >= initialEntryValue - 10 && currentPrice <= initialEntryValue + 10) 
      {
        OpenBuyOrder();
        OpenSellOrder();
      }
    }
  }
}

void CheckPositionType(double currentPrice)
{
  // Select the position by symbol
  if (PositionSelect(_Symbol))
  {
    // Get the position type
    long position_type = PositionGetInteger(POSITION_TYPE);
    // Check if the position is long or short
    if (position_type == POSITION_TYPE_BUY)
    {
      if (currentPrice >= initialEntryValue - 10 && currentPrice <= initialEntryValue + 10)
      {
        OpenSellOrder();
      }
    }
    else if (position_type == POSITION_TYPE_SELL)
    {
      if (currentPrice >= initialEntryValue - 10 && currentPrice <= initialEntryValue + 10)


      {
        OpenBuyOrder();
      }
    }
  }
}

void OpenBuyOrder()
{
  double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
  double tp_buy = ask + 50 * _Point;
  double sl_buy = ask - 1000 * _Point;
 
  if (trade.Buy(LotSize, _Symbol, ask, sl_buy, tp_buy, "Buy order"))
  {
    Print("BUY order placed");
  }
}

void OpenSellOrder()
{
  double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
  double tp_sell = bid - 50 * _Point;
  double sl_sell = bid + 1000 * _Point;

  if (trade.Sell(LotSize, _Symbol, bid, sl_sell, tp_sell, "Sell order"))
  {
    Print("SELL order placed");
  }
}

// Check if trading is allowed
bool IsTradeAllowed()
{
  if (TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
    return true;
  else
    return false;
}



Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Estado de Ambiente / Propriedades do Terminal Cliente
Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Estado de Ambiente / Propriedades do Terminal Cliente
  • www.mql5.com
Informações sobre o terminal cliente podem ser obtidos através de duas funções: TerminalInfoInteger() e...
 
gadsouzaBoa tarde amigos, eu escrevi um advisor que na conta demo, trabalha exatamente como previsto. Mas na conta real faz algo interessante. Toda vez que os parametros pra abrir uma ordem são atingidos, ele abre a ordem programada no código E uma ordem de venda adicional. Exemplo, se era pra abrir uma ordem de compra e venda em hedge, ele abre 1 de compra e 2 de venda. Se é pra abrir somente uma nova ordem de compra, ele abre uma de compra e uma de venda. E se é pra abrir uma ordem de venda, ele abre duas ordens de venda. Alguem já observou esse tipo de comportamento antes em alguma conta real? Aprecio qualquer ajuda e abaixo o codigo em questão.

Bom dia, talvez a PositionsTotal() esteja retornando valores não atualizados enquanto as posições estão sendo adicionadas (ainda em processamento), você já verificou isso?

 
Vinicius Pereira De Oliveira #: Bom dia, talvez a PositionsTotal() esteja retornando valores não atualizados enquanto as posições estão sendo adicionadas (ainda em processamento), você já verificou isso?

Interessante, na conta demo ele conta PositionsTotal correto, mas na conta real não

DEMO

2025.01.24 15:40:09.200 Experts automated trading is enabled
2025.01.24 15:40:09.297 GDS_printPos (WING25,M5) BUY order placed. PositionsTotal: 1
2025.01.24 15:40:09.365 GDS_printPos (WING25,M5) SELL order placed. PositionsTotal: 2

REAL

2025.01.24 15:41:38.291 Experts automated trading is enabled
2025.01.24 15:41:38.499 GDS_printPos (WING25,M5) BUY order placed. PositionsTotal: 0
2025.01.24 15:41:38.581 GDS_printPos (WING25,M5) SELL order placed. PositionsTotal: 1
2025.01.24 15:41:38.657 GDS_printPos (WING25,M5) SELL order placed. PositionsTotal: 2

⚠️ Por favor utilizar o botão do CÓDIGO (Alt -S) ao inserir código ou registos

Botão de código no editor

 
gadsouza #: Interessante, na conta demo ele conta PositionsTotal correto, mas na conta real não
Voce manda a ordem a mercado e tem que aguardar a fila consumir a sua ordem para virar posição. Isso ai só mostra que o ativo foi lento para consumi-la.
 

gadsouza #Interessante, na conta demo ele conta PositionsTotal correto, mas na conta real não [ . . . ]

Sim, você vai encontrar bastante diferenças entre contas demo e real, principalmente se tratando de B3... Seguem alguns tópicos relacionados:




Agora que você identificou o problema, consegue contornar ou precisa de ajuda?