Особенности языка mql5, тонкости и приёмы работы - страница 128

 
Для меня это огромное откровение
// Скрипт показыает, что цены открытия/закрытия не просто не нормализованы, но и разные при схожем значении

#property strict

#include <MT4Orders.mqh>

// Заполнение массива ценами открытия/закрытия
int FillPrices( double &Prices[] )
{
  const int Total = OrdersHistoryTotal();
  
  ArrayResize(Prices, Total << 1);
  
  int Amount = 0;
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      Prices[Amount++] = OrderOpenPrice();
      Prices[Amount++] = OrderClosePrice();
    }

  return(ArrayResize(Prices, Amount));
}

// true - нормализованная разность равна нуля, сама разность - отлична от нуля.
bool IsBadPrices( const double &Price1, const double &Price2 )
{
  return(!NormalizeDouble(Price1 - Price2, 5) && (Price1 != Price2));
}

// Находит цены открытия/закрытия, которые
// с нормализацией равны друг другу,
// без нормализации - не равны.
int CheckPrices( const double &Prices[] )
{
  int Res = 0;
  const int Size = ArraySize(Prices);
  
  for (int i = 0; i < Size - 1; i++)
  {
    const double Price = Prices[i];
    
    for (int j = i + 1; j < Size; j++)
      if (IsBadPrices(Price, Prices[j]))
      {
        Print((string)Price + " - " + (string)Prices[j] + " = " + (string)(Price - Prices[j])); // Распечатываем найденые цены
        
        Res++;
      }
  }
    
  return(Res);
}

void OnStart()
{
  double Prices[];
  
  FillPrices(Prices);
  Print(CheckPrices(Prices)); // Количество "несовпадающих" пар цен.
}


Результат

1.95562 - 1.95562 = -2.220446049250313e-016
1.95562 - 1.95562 = -2.220446049250313e-016
1.71599 - 1.71599 = -2.220446049250313e-016
1.71599 - 1.71599 = -2.220446049250313e-016
1.58028 - 1.58028 = -2.220446049250313e-016
14.806 - 14.806 = -1.77635683940025e-015
1.95521 - 1.95521 = -2.220446049250313e-016
1.95521 - 1.95521 = -2.220446049250313e-016
8


Запуск этого же скрипта на MT4 еще более удручает - там история побольше. Поясню.


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


ЗЫ Проверил Тестер - там такой гадости нет, похоже.

 
Ilya Malev:

Видимо опечатался.

Т.е. там минимальный спред реально?  Если так, то надо писать в техподдержку, чтобы исправили  (на средний).  Иначе это лакомый кусок для тестерных граалей.  

 
fxsaber:

ЗЫ Проверил Тестер - там такой гадости нет, похоже.

Во всех режимах Тестера, кроме реальных тиков, цены не нормализованы!

// Советник выводит цены, которые не нормализованы

#property strict

// true - нормализованная цена не равна оригинальной
bool IsBadPrice( const double &Price )
{
  return(NormalizeDouble(Price, 5) != Price);
}

#define TOSTRING(A) #A + " = " + (string)(A) + " "

//const bool Init = EventSetMillisecondTimer(50);
//void OnTimer()
void OnTick()
{
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const string Symb = SymbolName(i, true);
    
    const double PriceBid = SymbolInfoDouble(Symb, SYMBOL_BID);
    const double PriceAsk = SymbolInfoDouble(Symb, SYMBOL_ASK);
    
    if (IsBadPrice(PriceBid))
      Print(TOSTRING(Symb) + TOSTRING(PriceBid) + TOSTRING(NormalizeDouble(PriceBid, 5) - PriceBid));

    if (IsBadPrice(PriceAsk))
      Print(TOSTRING(Symb) + TOSTRING(PriceAsk) + TOSTRING(NormalizeDouble(PriceAsk, 5) - PriceAsk));
  }
}


Результат

2019.02.18 23:57:24   Symb = EURUSD PriceBid = 1.13088 NormalizeDouble(PriceBid,5)-PriceBid = -2.220446049250313e-016 
2019.02.18 23:57:26   Symb = EURUSD PriceAsk = 1.13112 NormalizeDouble(PriceAsk,5)-PriceAsk = -2.220446049250313e-016 
2019.02.18 23:57:27   Symb = EURUSD PriceBid = 1.13085 NormalizeDouble(PriceBid,5)-PriceBid = -2.220446049250313e-016 
2019.02.18 23:58:18   Symb = EURUSD PriceAsk = 1.13112 NormalizeDouble(PriceAsk,5)-PriceAsk = -2.220446049250313e-016 


Мягко говоря, это баг Тестера.

 

Допустим, Вы не можете соединиться с торговым сервером, когда пытаетесь зайти на счет.

Или, например, демо-счет истек и попытка логина выдает "Invalid account".


Несмотря на эту неудачу, вся торговая история доступна, даже если она не показывается в Терминале!

 
fxsaber:

Допустим, Вы не можете соединиться с торговым сервером, когда пытаетесь зайти на счет.

Или, например, демо-счет истек и попытка логина выдает "Invalid account".


Несмотря на эту неудачу, вся торговая история доступна, даже если она не показывается в Терминале!

А где же хранится история?

 
Alexey Navoykov:

Т.е. там минимальный спред реально?  Если так, то надо писать в техподдержку, чтобы исправили  (на средний).  Иначе это лакомый кусок для тестерных граалей.  

В ветке "ошибки, вопросы" уже ответили официально, что ничего менять не будут. Точнее просто проигнорировали все рациональные вопросы и ответили "тестируйте по реальным тикам", что я интерпретирую как ответ строго отрицательный

Это "лакомый кусок" для досадного самообмана. Хотя может быть кто-то ещё и коммерчески для обмана как-то сможет воспользоваться( а именно ДЦ - которые создают таким образом ложное впечатление о норме спредов, если чел не лезет в реальные тики, а 99.9% не полезут)
 
Ilya Malev:

Хотя может быть кто-то ещё и коммерчески для обмана как-то сможет воспользоваться( а именно ДЦ - которые создают таким образом ложное впечатление о норме спредов, если чел не лезет в реальные тики, а 99.9% не полезут)

По идее всё должно быть синхронизировано на сервере.  То что в тиках - должно быть и в барах.  Но я конечно не знаю, как там в реальности дело обстоит.

 
Комментарии, не относящиеся к этой теме, были перенесены в "Особенности языка mql4, тонкости и приёмы работы".
 

В ME есть комбинация ALT+V, где можно видеть предыдущие значения системного буфера обмена. Даже если что-то скопировали из браузера, а ME работал фоном, ME это увидит и запомнит.

Грубо говоря, ME видит многое из того, что делаете на компе. Например, вставляете через буфер пароль к счету или личному кабинету другого ресурса - он попадет в историю текущей сессии ME.

 
fxsaber:

В ME есть комбинация ALT+V, где можно видеть предыдущие значения системного буфера обмена. Даже если что-то скопировали из браузера, а ME работал фоном, ME это увидит и запомнит.

Грубо говоря, ME видит многое из того, что делаете на компе. Например, вставляете через буфер пароль к счету - он попадет в историю текущей сессии ME.

Ого, а Я пароли от криптобирж копирую. Насколько это пагубно для меня?