Обсуждение статьи "Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее?" - страница 2

 
Rashid Umarov:
Коды предоставлены, любой может проверить самостоятельно и убедиться в обоснованности выводов. Здесь проблем нет.

Мой код

sinput int Interval = 30; // Интервал в секундах

class BENCH
{
protected:
  MqlTick FirstTick;
  int Count;
  ulong StartTime;

  int GetAmountTicks( const ulong From = 0, const int Amount = 10000 ) const
  {
    MqlTick Ticks[];

    return(::CopyTicks(this.symbol, Ticks, COPY_TICKS_ALL, From, Amount));
  }
  void Init( void )
  {
    this.Count = 0;

    this.GetAmountTicks(); // разогрев
    ::SymbolInfoTick(this.symbol, this.FirstTick);

    this.StartTime = ::GetMicrosecondCount();

    return;
  }

public:
  const string symbol;
  const int TimerInterval;

  BENCH( const int iTimerInterval, const string Symb = NULL ) :
         symbol((Symb == NULL) ? ::Symbol() : Symb), TimerInterval(iTimerInterval * (int)1e6)
  {
    this.Init();

    this.StartTime = 0;
  }

  ~BENCH( void )
  {
    ::Comment("");
  }

  void Refresh( const string Symb )
  {
    if (Symb == this.symbol)
    {
      if (this.GetBenchTime() >= this.TimerInterval)
      {
        if (Count > 0)
          ::Alert(this.ToString());

        this.Init();
      }

      Count++;
    }

    return;
  }
  int GetBenchTime( void ) const
  {
    return((int)(::GetMicrosecondCount() - this.StartTime));
  }

  string ToString( void ) const
  {
    const ulong BenchTime = this.GetBenchTime();
    const int Amount = this.GetAmountTicks(this.FirstTick.time_msc);

    if ((BenchTime == 0) || (Amount == 0))
     return(NULL);

    const double Velocity1 = 1e6 * this.Count / BenchTime;
    const double Velocity2 = 1e6 * Amount / BenchTime;

    return((string)this.Count + "/" + (string)Amount + " = " + ::DoubleToString(100.0 * Count / Amount, 2) + "%, ExChange_History = " +
           ::DoubleToString(Velocity2, 1) + " ticks/sec, MT5_RealTime = " + ::DoubleToString(Velocity1, 1) + " units/sec, Interval = " +
           ::DoubleToString(BenchTime / 1e6, 1) + " sec.");
  }
};

class BENCH_BOOK : public BENCH
{
public:
  BENCH_BOOK( const int iTimerInterval, const string Symb = NULL ) : BENCH(iTimerInterval, Symb)
  {
    ::MarketBookAdd(this.symbol);
  }

  ~BENCH_BOOK( void )
  {
    ::MarketBookRelease(this.symbol);
  }
};

/*
BENCH Bench(Interval);

void OnTick( void )
{
  Bench.Refresh(_Symbol);

  return;
}
*/

BENCH_BOOK BenchBook(Interval);

void OnBookEvent(const string &symbol )
{
  BenchBook.Refresh(symbol);

  return;
}

 Результат

2016.09.13 17:18:35.667 Bench (Si-9.16,M1)      851/754 = 112.86%, ExChange_History = 25.1 ticks/sec, MT5_RealTime = 28.3 units/sec, Interval = 30.1 sec.
2016.09.13 17:18:05.524 Bench (Si-9.16,M1)      662/506 = 130.83%, ExChange_History = 16.9 ticks/sec, MT5_RealTime = 22.1 units/sec, Interval = 30.0 sec.
2016.09.13 17:17:35.424 Bench (Si-9.16,M1)      883/1610 = 54.84%, ExChange_History = 53.6 ticks/sec, MT5_RealTime = 29.4 units/sec, Interval = 30.0 sec.
2016.09.13 17:17:05.319 Bench (Si-9.16,M1)      834/2707 = 30.81%, ExChange_History = 90.1 ticks/sec, MT5_RealTime = 27.8 units/sec, Interval = 30.0 sec.
2016.09.13 17:16:35.196 Bench (Si-9.16,M1)      789/627 = 125.84%, ExChange_History = 20.9 ticks/sec, MT5_RealTime = 26.3 units/sec, Interval = 30.0 sec.
2016.09.13 17:16:05.110 Bench (Si-9.16,M1)      900/822 = 109.49%, ExChange_History = 27.4 ticks/sec, MT5_RealTime = 30.0 units/sec, Interval = 30.0 sec.
2016.09.13 17:15:34.993 Bench (Si-9.16,M1)      772/747 = 103.35%, ExChange_History = 24.8 ticks/sec, MT5_RealTime = 25.7 units/sec, Interval = 30.1 sec.

Хорошо видно, насколько сильно различаются результаты даже на соседних полуминутах. Сравнение стаканов надо делать ТОЛЬКО одновременно!

 
Тестирование синхронных операций  — серия из 10 синхронных последовательных торговых операций Buy с подтверждением успешности выполнения каждой транзакции на бирже. Последующая операция не производится, пока не будет  получено подтверждение от торгового сервера, что операция прошла/не прошла на бирже. Скорость выполнения зависит от всей цепочки терминал — торговый сервер — биржа — торговый сервер — терминал. Чем меньше будет среднее время торговой синхронной операции, тем лучше.
//--- проводим цикл операций
      for(int i=0;i<Trades;i++)
        {
         req.price  =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
         req.comment=string(i+1);
         //--- action
         if(!OrderSend(req,res))
           {
            PrintFormat("OrderSend() failed, retcode=%d",res.retcode);
           }
         else
           {
            trades_finished++;
            PrintFormat("#%d Buy %s 1 lot",i+1,_Symbol);
           }
        }

А где то подтверждение, про которое Вы пишите? По коду не заметил. Если про ответ от OrderSend(), то из справки:

Возвращаемое значение

В случае успешной базовой проверки структур (проверка указателей) возвращается true - это не свидетельствует об успешном выполнении торговой операции. Для получения более подробного описания результата выполнения функции следует анализировать поля структуры result. 

Поясните, пожалуйста.
 
fxsaber:

На видео показано начало сессии. А на видео из статьи - самый "сок". Да и

количество маловато для начала сессии. Раскройте, пожалуйста, что такое "очередь" и "разогрев".

Посмотрите на время в тестах - это середина спокойного дня, а не старт сессии. Поэтому пропуск малого количества тиков обоснован и этого достаточно, чтобы избежать потенциальных остатков невыбранных тиков.

Мы же не дети с форумов, чтобы не уметь проводить тестовые замеры, а потом проиграть из-за плохих доказательств. Тесты были проведены десятки раз, чтобы удостовериться, что ошибок нет. Только после этого была публикация.

 
Alexey Kozitsyn:

А где то подтверждение, про которое Вы пишите? По коду не заметил. Если про ответ от OrderSend(), то из справки:

Поясните, пожалуйста.

OrderSend - это 100% синхронная операция, дожидающаяся результатов полной установки ордера в сервер.

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

 
Renat Fatkhullin:

Посмотрите на время в тестах - это середина спокойного дня, а не старт сессии.

Про сессию сказал Ваш коллега

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

Обсуждение статьи "Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее?"

Rashid Umarov, 2016.09.13 13:39

Если посмотрите это видео, то увидите, что перед началом торговой сессии проходят несколько одиночных обновлений стакана. Поэтому скрипт пропускает первые N тиков, чтобы убедиться, что пошел настоящий плот поток заявок в стакане. И только после этого начинает считать тики.


Если код остался неизменным от предыдущего видео - другое дело.
 
fxsaber:

Мой код

 Результат

Хорошо видно, насколько сильно различаются результаты даже на соседних полуминутах. Сравнение стаканов надо делать ТОЛЬКО одновременно!

Одновременно, это когда у вас разница в замерах плавает как 10%.

А вот когда по результатам десятков тестов у вас разница стабильно в 4-5 раз, то обсуждать уже нечего.

 
Alexey Kozitsyn:

А где то подтверждение, про которое Вы пишите? По коду не заметил. Если про ответ от OrderSend(), то из справки:

Поясните, пожалуйста.

OrderSend возвращает то же значение, что и OrderCheck. Но при этом, в случае возврата true, OrderSend закончит свое выполнение только тогда, когда придет ответ от торгового сервера.

Торговый сервер (шлюз)  - труба на биржу, где проверяется только ГО еще. Поэтому если ГО ошибочно, то до биржи приказ не долетит. И в этом смысле Вы правы, что хорошо бы проверять MqlTradeResult. Но в данном случае с ГО каждый раз было порядок, поэтому все приказы отправлялись на биржу. И OrderSend заканчивал свою работу, получив именно биржевой ответ.

Так что результат корректный. 

 
fxsaber:
Про сессию сказал Ваш коллега
Если код остался неизменным от предыдущего видео - другое дело.

Вы путаете с другим видео, представленным для визуального сравнения начала сессии в трех терминалах. В этом видео https://www.youtube.com/watch?v=i5vvD66I3Ik легко заметить явное визуальное превосходство МТ5 в скорости обновления данных.

В статье https://www.mql5.com/ru/articles/2635 мы доказали на цифрах разницу в скорости и специально взяли середину дня (2016.09.12 13:57 GMT+1), чтобы не было претензий по потенциальной возможности чьих-либо тормозов на старте рынка. Видео из статьи https://www.youtube.com/watch?v=J5nqWGQ1zh8 показывает чистый последовательный замер в течение трех минут без каких-либо прерываний.

3markets 25082016 blur
3markets 25082016 blur
  • 2016.08.25
  • www.youtube.com
Запись стаканов в терминалах MetaTrader 5, Quik и SmartX 25 августа 2016. Инструмент Si-9.16
 
Renat Fatkhullin:

Вы путаете с другим видео, представленным для визуального сравнения начала сессии в трех терминалах. В этом видео https://www.youtube.com/watch?v=i5vvD66I3Ik легко заметить явное визуальное превосходство МТ5 в скорости обновления данных.

В статье https://www.mql5.com/ru/articles/2635 мы доказали на цифрах разницу в скорости и специально взяли середину дня (13:57 GMT+1), чтобы не было претензий по потенциальной возможности чьих-либо тормозов на старте рынка. Видео из статьи https://www.youtube.com/watch?v=J5nqWGQ1zh8 показывает чистый последовательный замер в течение трех минут.

У меня был вопрос только по комментарию в исходнике к текущей статье

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

Обсуждение статьи "Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее?"

fxsaber, 2016.09.13 13:25

 //--- пропускаем первые тики для первичной очистки очереди и разогрева
   tickcounter++;
   if(tickcounter<ExtSkipFirstTicks)
      return;

 Требуется пояснение про влияние очереди и разогрева на производительность. 

Если это рудимент (от предыдущего видео) - одно, если нет - другое.
 
fxsaber:
У меня был вопрос только по комментарию в исходнике к текущей статье
Если это рудимент (от предыдущего видео) - одно, если нет - другое.

Любой тест должен содержать защиту от cold старта.

Поэтому пропуск N тиков - это показатель, что мы знаем и учитываем это обстоятельство. Просто чтобы избежать заведомо ожидаемой претензии "почему вы не компенсировали влияние cold старта".


Видео про старт сессии трех терминалов было подготовлено 25 августа 2016 для другой претензии трейдера, который утверждал, что МТ5 тормозит на старте сессии. Как в последствии оказалось, этот трейдер вообще не использовал МТ5, а транслировал домыслы с форума. Также выяснилось, что некоторые трейдеры не были в курсе, что для биржевых инструментов графики строятся не по Bid, а по проторгованным Last ценам. Изменение бидов в стакане с непоказом их на чартах они воспринимали как "тормоза МТ5".

Конечно, никаких тормозов нет.