Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5 - страница 94

 
Nikolai Semko:

Удобство в том, что для получения полной истории достаточно скачать только M1, что означает что и остальные ТФ уже скачены. Раньше я мучался со скачиванием всех ТФ. 

А вот это палка о двух концах. Принудительное скачивание минуток (а это большой объём данных) далеко не всегда полезно.  Если нам требуется только анализ D1, то зачем нам скачивать минутки, теряя время и потребляя ненужный трафик.  Платить нужно только за то, что используешь.   Если требуется выкачать все таймфреймы, было бы логично сделать специальную опцию для этого.
 
Alexey Navoykov:
А вот это палка о двух концах. Принудительное скачивание минуток (а это большой объём данных) далеко не всегда полезно.  Если нам требуется только анализ D1, то зачем нам скачивать минутки, теряя время и потребляя ненужный трафик.  Платить нужно только за то, что используешь.   Если требуется выкачать все таймфреймы, было бы логично сделать специальную опцию для этого.
Да, с этим трудно не согласиться.
 
Alexey Navoykov:
И ещё момент касательно неявного оператора копирования. У вас он имеет тип void, а в C++ он возвращает ссылку на объект.  Коль уж MQL пока не поддерживает ссылки, то можно было бы возвращать константную копию объекта, это хоть какой-то компромисс, дающий возможность использования константных методов у возвращаемого объекта.

Спасибо за предложение.

Для оператора копирования по умолчанию, правильнее будет вернуть ссылку на объект, для которого этот оператор вызывается.

 

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

Баг компилятора: not actual parameters count for macro

Alexey Navoykov, 2019.01.07 13:33

Билд 1966, 64 бит.   Ошибка в макросах:

void F(int,int) {  }


#define M(a)  F(a, 0)

#define F(a)  M(a)


void OnInit()
{
  F(1);  // 'F' - not actual parameters count for macro
}

В C++ работает корректно.

 
Renat Fatkhullin:

У вас несколько погрешностей:

  1. Нельзя тестировать CopyXXX функции из индикаторов, так как в индикаторах отдается только то, что есть без контроля полноты данных
  2. Не проверяются результаты операций
  3. Месячные данные на многих инструментах в МТ4 в урезанном виде, так что не всегда можно получить запрошенные 500 MN баров

Я переписал пример в виде скрипта, уменьшил MN до 250 баров, добавил проверки и вывод информации об окружении.

Вот результаты на последних бетах MT4 1150 (доступно на MetaQuotes-Demo) и MT5 1959: данные в микросекундах

 MT4
MT5
Холодный запуск
Было:  Total: 51 442 msc в 1150
Стало: Total: 52 679 msc в 1170

Было:  Total: 1 434 053 msc в 1959 билде
Стало: Total:   262 883 msc в 1968 билде
Горячий запуск
Было:  Total: 15 524 msc в 1150
Стало: Total: 15 791 msc в 1170
Было:  Total:    21 456 msc в 1959 билде
Стало: Total:    13 658 msc в 1968 билде

Разница в холодном подъеме в том, что МТ5 проводит полную проверку истории и гарантированно сверяется с торговым сервером, чтобы докачать недостающие или отсутствующие данные.


Мы серьезно оптимизировали поднятие и синхронизацию баз данных в MetaTrader 5 build 1968 (бета уже доступна).

В 5 раз быстрее базы поднимаются при холодном запуске и в 1.5 раза быстрее при горячем.

Причем в горячем режиме подъем баз стал быстрее, чем в четверке.

 

I haven't checked it myself but a user of the German forum has a problem - I guess caused by OrderSelect().

In the reference is written:

Сам я его не проверял, но у одного из пользователей немецкого форума возникла проблема - наверное, из-за OrderSelect().

В справке написано:

bool  PositionSelect( 
   string  symbol,     // Werkzeugname 
   );

And that's the way he was using it:

И вот как он его использовал:

double CountPipsLong()
  {
   int total=PositionsTotal();
   double Pips=0;
   if(total>0)
     {
      for(int j=total-1;j>=0;j--)
        {

         PositionSelect(_Symbol);
         double Price_open = PositionGetDouble(POSITION_PRICE_OPEN);
         double Price_curr = PositionGetDouble(POSITION_PRICE_CURRENT);

         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
           {
            Pips+=Price_curr-Price_open;
           }

        }
     }

   Print(Pips);
   return(Pips);

  }


To select a position by OrderSelect(_Symbol) - but how can this function perform this? I would expect to enter a index like OrderSelect(p) like PositionGetTicket(p):

Выбрать позицию по OrderSelect(_Symbol) - но как эта функция может это сделать? Я бы хотел ввести такой индекс, как OrderSelect(p), как PositionGetTicket(p):

int p = PositionsTotal();
   while(p-->0) { // returns the number of open positions
      ulong ticket=PositionGetTicket(p);

Am I wrong?

Я ошибаюсь?
 
Карл Шрайбер :

Я ошибся?

Я ошибаюсь?

Да, нужно использовать PositionGetTicket и PositionSelectByTicket, вот так

   int total= PositionsTotal ();
   double Pips= 0 ;
   if (total> 0 )
     {
       for ( int j=total- 1 ;j>= 0 ;j--)
        {
         ulong ticket= PositionGetTicket (j); 
         PositionSelectByTicket (ticket);
         double Price_open = PositionGetDouble ( POSITION_PRICE_OPEN );
         double Price_curr = PositionGetDouble ( POSITION_PRICE_CURRENT );

         if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
           {
            Pips+=Price_curr-Price_open;
           }

        }
     }

   Print (Pips);
   return (Pips);
 
Rashid Umarov:

Да, нужно использовать PositionGetTicket и PositionSelectByTicket, вот так

Я извиняюсь, а зачем дважды выбирать позицию?

         ulong ticket= PositionGetTicket (j); // первый раз выбрали позицию
         PositionSelectByTicket (ticket);     // второй раз выбрали позицию

Ведь в документации написано

PositionGetTicket

Функция возвращает тикет позиции по индексу в списке открытых позиций и автоматически выбирает эту позицию для дальнейшей работы с ней


Выходит что эта строка

         PositionSelectByTicket (ticket);     // второй раз выбрали позицию

совершенно лишняя.

 
Alexey Viktorov:

Я извиняюсь, а зачем дважды выбирать позицию?

Ведь в документации написано

Выходит что эта строка

совершенно лишняя.

Да, на втомате добавил

 
Rashid Umarov:

Да, нужно использовать PositionGetTicket и PositionSelectByTicket, вот так

I have suggested that - but my concerns were about the function PositionSeletct(_Symbol) in MQL5. I think this function cannot work as intended!

Я предположил это, но меня беспокоила функция PositionSeletct(_Symbol) в MQL5. Я думаю, что эта функция не может работать должным образом!

Причина обращения: