MT4-Tester VS MT5-Tester - страница 3

 
fxsaber:
Доказательство

Это не доказательство.

Вы ошиблись.

Мое утверждение в силе - указанный эксперт тестирует исключительно доступ в историю сделок.
 
Renat Fatkhullin:

Это не доказательство.

Вы ошиблись.

В чем ошибка? Даже проверил себя, поставил BreakPoints везде, где есть History-функции, и запустил отладку по CTRL+F5. Все чисто отработало.
Renat Fatkhullin:
Мое утверждение в силе - указанный эксперт тестирует исключительно доступ в историю сделок.

Поспешили с выводами.

 

Не уверен, что подобные сравнения имеют какой-то смысл - облачные вычисления сводят все преимущества тестера МТ4 в скорости на нет.

И, кроме того, данном случае, действительно, советник тестирует ислючительно скорость доступа к данным. Но, я не думаю, что это является "бутылочным горлом" для большей части советников.

После введения счетов с хеджирующими позициями в МТ5 - лично я для себя вобще ни одного плюса МТ4 не вижу. Использую кроссплатформенные библиотеки только потому, что на реальных счетах у меня МТ4.

Единственно, чего не хватает лично мне - указателей или ссылок на массивы. Чтобы не требовалось лишний раз копировать данные в индикаторах. Остальное - в MQL5 все есть.

Распределенные вычисления в сети MQL5 Cloud Network
Распределенные вычисления в сети MQL5 Cloud Network
  • cloud.mql5.com
Заработать деньги, продавая мощности своего компьютера для сети распределенных вычислений MQL5 Cloud Network
 
fxsaber:
Поспешили с выводами.
А что там еще ? Запрос данных, и скидывание в файл. Вроде больше никаких действий не производится - что же по-твоему, тестирует данный советник ?
 
fxsaber:

ЗЫ Не все прогоны совпали идеально. Значит, кто-то из тройки точно врет (MT4+TDS, MT5, MT4Orders). Будем искать.

Благодаря сабжу нашелся виновник, так всегда бывает, когда есть возможность сравнивать.

Советник, показывающий баг

// MQL4&5-code

#property strict

#ifdef __MQL5__
  #define Bid (SymbolInfoDouble(_Symbol, SYMBOL_BID))
  #define Ask (SymbolInfoDouble(_Symbol, SYMBOL_ASK))
#endif // __MQL5__

#define PRINT(A) Print(#A + " = " + (string)(A));

void OnTick()
{
  static bool FirstRun = true;
  
  static const double PrevBid = Bid;
  static const double PrevAsk = Ask;
  
  if (FirstRun)
  {
    PRINT((PrevBid != Bid) || (PrevAsk != Ask))
    
    FirstRun = false;
  }
}


MT4

2017.05.08 10:57:33.056 2017.04.10 00:00:08  TDS_Test EURUSD,M1: (PrevBid!=Bid)||(PrevAsk!=Ask) = false


MT5

2017.05.08 11:01:31.266 2017.04.10 00:00:08   (PrevBid!=Bid)||(PrevAsk!=Ask) = true
 
George Merts:
А что там еще ? Запрос данных, и скидывание в файл. Вроде больше никаких действий не производится - что же по-твоему, тестирует данный советник ?
Предлагаю прочесть полностью обсуждение, тогда таких вопросов даже возникать не будет.
George Merts:

После введения счетов с хеджирующими позициями в МТ5 - лично я для себя вобще ни одного плюса МТ4 не вижу.

Данная ветка несколько выделяется концентрацией конструктива. Поэтому о личных предпочтениях лучше сюда, например.

 
fxsaber:
В чем ошибка? Даже проверил себя, поставил BreakPoints везде, где есть History-функции, и запустил отладку по CTRL+F5. Все чисто отработало.

Поспешили с выводами.

Во всем:

  1. работа с историей идет вовсю, сделки после скана истории закрываются
  2. использовать MT4Orders.mqh - это сразу ставить крест на чистоте эксперимента. чудовищная библиотека с оверхедом, написанная отвратительно и нечитаемо. кто-то сурово проявил свою лень
  3. писать for(i=200 000; i>=0; i--) OrderSelect на каждом тике - это ничто как сумашествие и попытка исключительно повторить анекдот про японскую пилу и русских мужиков
       for(int i=OrdersTotal()-1; i>=0; i--)
          if(OrderSelect(i,SELECT_BY_POS) && ((!TradeTime) || (OrderProfit()>0) || 
             ((OrderType() == OP_BUY)  && (PriceToInteger(OrderOpenPrice()) - IntBid >= Limit)) ||
             ((OrderType() == OP_SELL) && (IntAsk - PriceToInteger(OrderOpenPrice()) >= Limit))))
             OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
    
  4. весь тест был написан исключительно ради цикла из пункта 3

    Грубо берем 1 800 000 тиков в тесте, где за 5 дней открывается 200 000 сделок. Упрощаем для простоты до 900 000 тиков, где идет сканирование 100 000 ордеров в истории и получаем 900 000 * 100 000 = 900 000 000 000 вызовов OrderSelect(да еще и с оверхедом от библиотеки). Вот именно 900 миллиардов OrderSelect и тестируются.

    Причем из них 99.99% вызовов абсолютно лишние и сделаны исключительно ради демонстрации "тормозов".


Если хотите провести чистый тест, напишите два идентичных чистых примера без библиотек. Так будет гарантия чистоты и отсутствие встроенного ради совместимости оверхеда.

Мы оптимизировали доступ к истории и полностью свели на нет эту демонстрацию. Ее ведь специально так написали.

 
Renat Fatkhullin:

Во всем:

  1. работа с историей идет вовсю, сделки после скана истории закрываются
Где?
  1. использовать MT4Orders.mqh - это сразу ставить крест на чистоте эксперимента. чудовищная библиотека с оверхедом, написанная отвратительно и нечитаемо. кто-то сурово проявил свою лень
Это был я.
  1. писать for(i=200 000; i>=0; i--) OrderSelect на каждом тике - это ничто как сумашествие и попытка исключительно повторить анекдот про японскую пилу и русских мужиков
Вы совсем забыли MQL4. Здесь нет обращения к истории.
  1. весь тест был написан исключительно ради цикла из пункта 3

    99.99% вызовов абсолютно лишние и сделаны исключительно ради демонстрации "тормозов".
Пример не был выдуман, в исходнике дана ссылка на оригинал. Это один из самых известных и старых скальперов.

Если хотите провести чистый тест, напишите два идентичных чистых примера без библиотек. Так будет гарантия чистоты и отсутствие встроенного ради совместимости оверхеда.

Хочу иметь возможность сравнивать два тестера. Видеть плюсы и минусы каждого. А еще сравнение - это один из самых эффективных способов выявления багов.

Ветка начинается с демонстрации идентичности исходных данных обоих тестеров. Это основа, без которой никуда. Далее уже каждый может выбирать советник для теста.

Мы оптимизировали доступ к истории и полностью свели на нет эту демонстрацию. Ее ведь специально так написали.

Благодаря чьей-то заявке в СД же так сделали. Конструктивная критика - это хорошо.
 

Работа с историей - это OrderSelect и аналогичные OrderXXXX команды. Не надо делать вид, что вы это не понимаете. Тем более, если библиотеку вы написали.

По MQL4 не забыл и там тоже работа с историей.

Написать сканер истории на 200 000 сделок вглубь на каждом тике и забыть условие разумного выхода из цикла? Это называется - специально сыграть в русских мужиков.

И не надо ссылаться на неких скальперов. Цикл был написан так тупо специально. И даже в рамках 5 дней теста там тестировалось ни что иное, как сотни миллиардов OrderXXX функций, из которых 99.99% не нужно было вызывать.


Проблема в том, что вы начали спорить с абсолютно точным утверждением "Весь пример эксперта написан так, что он занимается только одной вещью - страшно неэффективно сканит всю историю сделок на каждом тике", хотя отлично знали, почему вы так специально написали тест. Ведь могли же одним движением руки убрать 99.99% тупого скана, но тогда и тест бы провалился.
 
Renat Fatkhullin:

Работа с историей - это OrderSelect и аналогичные OrderXXXX команды. Не надо делать вид, что вы это не понимаете. Тем более, если библиотеку вы написали.

По MQL4 не забыл и там тоже работа с историей.

Написать сканер истории на 200 000 сделок вглубь на каждом тике и забыть условие разумного выхода из цикла? Это называется - специально сыграть в русских мужиков.

И не надо ссылаться на неких скальперов. Цикл был написан специально. И даже в рамках 5 дней теста там тестировалось ни что иное, как сотни миллиардов OrderXXX функций, из которых 99.99% не нужно было вызывать.

Не буду спорить. Прошу форумчан, знакомых с MQL4, посмотреть этот короткий исходник и объяснить, что имеет в виду Ренат.

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

MT4-Tester VS MT5-Tester

fxsaber, 2017.05.08 01:11

Советник

// Idea - https://www.mql5.com/ru/code/7464
#property strict

input int Shift = 3; 
input int Limit = 18;
input double Lots = 0.1;

int PriceToInteger( const double Price )
{
  return((int)(Price / _Point + 0.1));
}

void OnTick()
{
  static int PrevBid = PriceToInteger(Bid);
  static int PrevAsk = PriceToInteger(Ask);    

  const int IntBid = PriceToInteger(Bid);
  const int IntAsk = PriceToInteger(Ask);
  
  const bool TradeTime = (TimeCurrent() % (24 * 60 * 60) < D'1970.01.01 23:50'); // exclude swaps
  
  if (TradeTime && (IntAsk - IntBid < Limit))
  {
    if ((IntBid - PrevBid >= Shift)) 
      OrderSend(_Symbol, OP_SELL, Lots, Bid, 0, 0, 0);
    
    if (PrevAsk - IntAsk >= Shift) 
      OrderSend(_Symbol, OP_BUY, Lots, Ask, 0, 0, 0);
  }

  PrevBid = IntBid;
  PrevAsk = IntAsk;
  
  for (int i = OrdersTotal() - 1; i >= 0; i--) 
    if (OrderSelect(i, SELECT_BY_POS) && ((!TradeTime) || (OrderProfit() > 0) ||
        ((OrderType() == OP_BUY)  && (PriceToInteger(OrderOpenPrice()) - IntBid >= Limit)) ||
        ((OrderType() == OP_SELL) && (IntAsk - PriceToInteger(OrderOpenPrice()) >= Limit)))) 
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0); 
}

Наверное, я ошибаюсь, но в упор не вижу, в каком месте идет работа с историей в MT4. Прошу помощи.