Библиотеки: MT4Orders - страница 80

 
fxsaber #:

Попробуйте последнюю версию. Копировать-вставить.

Спасибо fxsaber. Мне потребуется некоторое время, чтобы подтвердить это, но пока что использование памяти не кажется меньшим.

Из любопытства, где определяется OrderSwap()? Я не могу найти ее в коде.

 
pcdeni #:

пока что использование памяти не кажется меньшим.

Нужны данные для воспроизведения проблемы. Лаконичный код и инвестиционный доступ к торговому счету, на котором возникает проблема. Возможно, в личных сообщениях.

Из любопытства, где определяется OrderSwap()? Я не могу найти его в коде.

MT4_ORDERFUNCTION(Swap, double, ::PositionGetDouble(POSITION_SWAP), 0, true)
 
Здравствуйте, у меня странная проблема. Я использую эту библиотеку уже некоторое время, я хочу сказать ОГРОМНОЕ СПАСИБО, ее невероятная помощь,

Так что у меня никогда не было никаких проблем с включением этой библиотеки / кода в советники в течение многих лет.

Теперь, когда я компилирую советник MT5, он возвращает 3 ошибки из этого кода, все они в основном около 1 строки: ( см. код ниже )
'=' - неожиданная лексема MT4Orders.mqh 192 25
')' - неожиданная лексема MT4Orders.mqh 192 68
'*=' - ожидается имя MT4Orders.mqh 194 13

в моем советнике я также включаю:

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

Есть ли у вас идеи, что здесь может происходить?

Библиотека сама по себе компилируется без ошибок, без проблем, как обычно. Только при попытке скомпилировать EA она выдает эти ошибки.

#define  ORDER_SELECT (-2)

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

    while ((bool)(Price = ::NormalizeDouble(Price - (int)Price, 8)))   // <- LINE 192, так что это, видимо, проблема "= :: "
    {
      Price *= 10; // LINE 194

      Res++;
    }

    return(Res);
  }

Я нашел кое-что подозрительное в моем советнике:
union Price
  {
   uchar             buffer[8];
   double            close;
  };

, так что этот союз Имя цены перезаписывает имя цены в функции GetDigits ? это может быть проблемой ?
 
Filip Valkovic #:
Я нашел кое-что подозрительное в моем советнике:
так это имя цены союза перезаписывает имя цены в функции GetDigits? это может быть проблемой?

Вот в чем причина.

 
Прошу помочь выявить ошибку в расчете комиссии. Для этого на любых доступных торговых счетах нужно запустить этот скрипт.
// Вычисление и сравнение суммарных комиссии/свопа/прибыли через MT4/MT5-Style.

#define MT4ORDERS_BYPASS_MAXTIME 1000000 // Максимальное время (в мкс.) на ожидание синхронизации торгового окружения
#include <MT4Orders.mqh>

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

// MT4-Style
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();
    }
}

// MT5-Style
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); // MT4-Style
    Calc_MT5(Commission_MT5, Swap_MT5, Profit_MT5); // MT5-Style
    
    PRINT(Commission_MT4, Commission_MT5);
    PRINT(Swap_MT4, Swap_MT5);
    PRINT(Profit_MT4, Profit_MT5);
  }
}


Он выдаст нечто подобное.

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


В случае, если в выделенном месте будет false, дайте знать. Спасибо.

 
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 #:

Вы уверены, что компилировали с этой строкой?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: MT4Orders

fxsaber, 2023.01.02 12:24

#define MT4ORDERS_BYPASS_MAXTIME 1000000 // Максимальное время (в мкс.) на ожидание синхронизации торгового окружения
EX5 из телеграма выдает false?
 
Скомпилировано копипастом 1:1, за исключением пропущенных точек с запятой после Swap = 0.
 
fxsaber #:

EX5 из телеграма выдает false?

Наверное, это самый надежный способ исключить несоответствие версий исходников.

 
Пишите в EX5 личные сообщения, сейчас у меня нет доступа к телеграм