Новая версия платформы MetaTrader 5 build 5260: улучшения в Algo Forge, расширение OpenBLAS и новые правила наследования в MQL5 - страница 8

 
Sergei Samokhin #:
Как правильно узнать Профит/Лосс по сделке из истории счета?

В документации написано так
HistoryDealGetDouble(dealTicket, DEAL_PROFIT);

Возвращает 0, хотя объем ордера возвращает, комментарий сделки так же находит, все находит кроме прибыли сделки

В тестере при прогоне на визуализации сделок все считается и находит Профит каждой сделки из истории. Все норм в режиме визуализации.

Список исторических сделок загружаю через 
total=HistoryDealsTotal()

Делаю всё как в примере туториала.
Находит, повторюсь, все о сделке (время, тикер, символ и тд)
Кроме профита конкретной сделки

    HistorySelect(0, TimeCurrent());
    for(int i=HistoryDealsTotal() - 1; i>=0; i--) {
      ulong ticket = HistoryDealGetTicket(i);
      if(ticket>0) {
        if(HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol
            && HistoryDealGetInteger(ticket, DEAL_MAGIC) == Magic
            && HistoryDealGetInteger(ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)  {
 

Может имеет смысл warnings добавить?

 
Vladislav Boyko #:

Может имеет смысл warnings добавить?

Хотя наверное это сложно. Неспроста ведь компилятор молчит о конфликтах между #property и .mqproj файлом (насколько я помню, он молча возьмет свойства из .mqproj и проигнорирует #property).
 
Vitaly Muzichenko #:
Спасибо! Посмотрю на практике 
 
Ihor Herasko #:
Сделки бывают двух видов: вход (DEAL_ENTRY_IN) и выход (DEAL_ENTRY_OUT). Скорее всего, берете сделку входа, у которой профит всегда 0. Проверьте у сделки свойство DEAL_ENTRY.
Спасибо за подсказку!
 
fxsaber #:

Интересно, можно ли заметить ускорение при отказе от виртуальных функций...

class A1
{
public:
  virtual void Func1() {}
  void Func2() {}
};

class A2 : public A1
{
public:
  virtual void Func1() override {} // Создает таблицу виртуальных функций.
};

#define BENCH(A)                                                             \
  {                                                                          \
    const ulong StartTime = GetMicrosecondCount();                           \
    A;                                                                       \
    Print(#A + ":" + (string)(GetMicrosecondCount() - StartTime) + " mcs."); \
  }      
  
void OnStart()
{
  A1* a = new A1;
  
  BENCH(for (int i = 0; i < 1e7; i++) a.Func1();) // 32100 mcs.
  BENCH(for (int i = 0; i < 1e7; i++) a.Func2();) // 24205 mcs.
  
  delete a;
}
 
fxsaber # :

Интересный.

С C++

for ( int i = 0 ; i < 1e7; i++) a->Func1(); Execution time: 22580 microseconds
for ( int i = 0 ; i < 1e7; i++) a->Func2(); Execution time: 22902 microseconds

 

Баг в файле Include\Canvas\Charts\LineChart.mqh в строке 244:

Не учитывается смещение графика. Там такая строка:

y2=(int)(m_y_0-value*m_scale_y);

А должно быть так:

y2=(int)(m_y_0-(value-m_v_scale_min)*m_scale_y);

Такая же ошибка в строке 232 для первой точки графика.

Ещё баг в файле ChartCanvas.mqh:

При установке параметра grid(количество горизонтальных линий сетки) в 1 или меньше метода CChartCanvas::VScaleParams(const double max,const double min,const uint grid), обновление отображаемого графика CChartCanvas::DrawChart(void) зависает. И принудительное завершение индикатора с этим кодом не завершает зависший поток.

 
Vitaly Muzichenko #:
Vitaly Muzichenko #: все равно не видит результата в сделке 
Вот часть кода где считаю результаты прошлых сделок. Все считается: лоты, количество сделок, количество дней и тд, кроме суммы профитов
А DEAL_ENTRY_OUT так понимаю. как фильтр только выступает, а не параметр вывода сделок из истории торгов

        int startFor = HistoryDealsTotal() - 1;

int endFor = 0;

       for (int Index = startFor ; Index >= endFor; Index--) {

          ulong posTicket = HistoryDealGetTicket(Index);

          ulong posMagic = HistoryDealGetInteger(posTicket, DEAL_MAGIC);

          string symb = HistoryDealGetString(posTicket, DEAL_SYMBOL);

          if(posTicket > 0) {

if (symb == Symbol()) {

string orderComment = HistoryDealGetString(posTicket, DEAL_COMMENT);
                if(magic != "" && isMagicContain(orderComment, magic) == false) continue;
string type = HistoryDealGetInteger(posTicket, DEAL_ENTRY);
if (type != DEAL_ENTRY_OUT) continue;

double lot = HistoryDealGetDouble(posTicket, DEAL_VOLUME);
                double posProfit = HistoryDealGetDouble(posTicket, DEAL_PROFIT);
                profitToday += posProfit;
                levelsDealsNum++;
  levelsDealsContract += lot;

             }

       }
  }

 
Ihor Herasko #:
Сделки бывают двух видов: вход (DEAL_ENTRY_IN) и выход (DEAL_ENTRY_OUT). Скорее всего, берете сделку входа, у которой профит всегда 0. Проверьте у сделки свойство DEAL_ENTRY.
Посмотрите мой ответ выше с моим кодом. Что надо исправить в коде что бы профит сделки считался?

Если что брокер RoboForex . На МТ4 все нормально считается. На МТ5 все выводит кроме профита сделки