Bibliotecas: MT4Orders - página 80

 
fxsaber #:

Experimente a versão mais recente. Copiar e colar.

Obrigado, fxsaber. Levarei algum tempo para confirmar, mas até agora o uso da memória não parece ser menor.

Por curiosidade, onde está definido o OrderSwap()? Parece que não consigo encontrá-lo no código.

 
pcdeni #:

Até o momento, o uso da memória não parece estar diminuindo.

Preciso de dados para reproduzir o problema. Código lacônico e acesso de investimento à conta de negociação onde o problema ocorre. Talvez em mensagens privadas.

Por curiosidade, onde está definido o OrderSwap()? Parece que não consigo encontrá-lo no código.

MT4_ORDERFUNCTION(Swap, double, ::PositionGetDouble(POSITION_SWAP), 0, true)
 
Olá, estou com um problema estranho. Uso essa biblioteca há algum tempo e quero agradecer imensamente por sua incrível ajuda,

Portanto, nunca tive problemas ao incluir essa biblioteca/código em EAs há anos.

Agora, quando estou compilando o MT5 EA, ele retorna 3 erros desse código, todos eles são basicamente de uma linha: (veja o código abaixo)
'=' - token inesperado MT4Orders.mqh 192 25
')' - token inesperado MT4Orders.mqh 192 68
'*=' - nome esperado MT4Orders.mqh 194 13

No meu EA, também estou incluindo:

#include <stderror.mqh>
#include <stdlib_mq5.mqh>
#import"kernel32.dll"

Você tem alguma ideia do que pode estar acontecendo aqui?

A biblioteca sozinha compila sem erros, sem problemas, como de costume. Somente ao tentar compilar o EA, ele gera esses erros.

#define  ORDER_SELECT (-2)

   static int GetDigits( double Price )
  {
    int Res = 0;

    while ((bool)(Price = ::NormalizeDouble(Price - (int)Price, 8)))   // <- LINE 192 então, aparentemente, esse é um problema "= :: "
    {
      Price *= 10; // LINE 194

      Res++;
    }

    return(Res);
  }

Encontrei algo suspeito em meu EA:
union Price
  {
   uchar             buffer[8];
   double            close;
  };

Então, o nome do preço dessa união substitui o nome do preço na função GetDigits? Esse pode ser o problema?
 
Filip Valkovic #:
Descobri algo suspeito em meu EA:
. Então, o nome do preço dessa união sobrescreve o nome do preço na função GetDigits? Esse pode ser o problema?

Esse é o motivo.

 
Por favor, ajude-me a identificar um erro no cálculo da comissão. Para fazer isso, execute este script em qualquer conta de negociação disponível.
// Cálculo e comparação da comissão/troca/lucro total via MT4/MT5-Style.

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // Tempo máximo (em µs) para aguardar a sincronização do ambiente de negociação
#include <MT4Orders.mqh>

#define  TOSTRING(A) (#A + " = " + DoubleToString(A, 2))
#define  PRINT(A, B) Print(TOSTRING(A) + ", " + TOSTRING(B) + ", " + (string)!NormalizeDouble((A) - (B), 2))

// Estilo MT4
void Calc_MT4( double &Commission, double &Swap, double &Profit )
{
  Commission = 0;
  Swap = 0;
  Profit = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      Commission += OrderCommission();
      Swap += OrderSwap();
      Profit += OrderProfit();
    }
}

// Estilo MT5
void Calc_MT5( double &Commission, double &Swap, double &Profit )
{
  Commission = 0;
  Swap = 0;
  Profit = 0;
  
  if (HistorySelect(0, INT_MAX))  
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
      
      if (HistoryDealGetInteger(Ticket, DEAL_TYPE) <= DEAL_TYPE_SELL)
      {
        Commission += HistoryDealGetDouble(Ticket, DEAL_COMMISSION);
        Swap += HistoryDealGetDouble(Ticket, DEAL_SWAP);
        Profit += HistoryDealGetDouble(Ticket, DEAL_PROFIT);
      }
    }
}

void OnStart()
{
  if (PositionsTotal())
    MessageBox("The script works when there are no open positions.");
  else
  {
    double Commission_MT4, Swap_MT4, Profit_MT4;
    double Commission_MT5, Swap_MT5, Profit_MT5;
    
    Calc_MT4(Commission_MT4, Swap_MT4, Profit_MT4); // Estilo MT4
    Calc_MT5(Commission_MT5, Swap_MT5, Profit_MT5); // Estilo MT5
    
    PRINT(Commission_MT4, Commission_MT5);
    PRINT(Swap_MT4, Swap_MT5);
    PRINT(Profit_MT4, Profit_MT5);
  }
}


Ele produzirá algo parecido com isto.

Commission_MT4 = -15591.12, Commission_MT5 = -15591.12, true
Swap_MT4 = -5948.77, Swap_MT5 = -5948.77, true
Profit_MT4 = 34851.13, Profit_MT5 = 34851.13, true


Caso haja algo falso no espaço destacado, informe-me. Obrigado.

 
2023.01.02 13:23:28.780 fxsaber_test (EURCHF,H1)        Commission_MT4 = -2875.33, Commission_MT5 = -2875.29, false
2023.01.02 13:23:28.835 fxsaber_test (EURCHF,H1)        Swap_MT4 = -1051.56, Swap_MT5 = -1051.56, true
2023.01.02 13:23:28.835 fxsaber_test (EURCHF,H1)        Profit_MT4 = 7198.08, Profit_MT5 = 7198.08, true
 
Enrique Dangeroux #:

Tem certeza de que compilou com essa linha?

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Bibliotecas: MT4Orders

fxsaber, 2023.01.02 12:24 pm.

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // Tempo máximo (em µs) para aguardar a sincronização do ambiente de negociação
EX5 do telegrama dá falso?
 
Compilado por copypaste 1:1, exceto pela falta de ponto e vírgula após Swap = 0.
 
fxsaber #:

O EX5 do telegrama está se tornando falso?

Essa é provavelmente a maneira mais confiável de descartar a incompatibilidade da versão de origem.

 
Escreva para as mensagens privadas do EX5, pois não tenho acesso ao telegrama no momento