Ошибки, баги, вопросы - страница 1849

МТ5 проигрывает МТ4 по времени доступа к данным в 6-10 раз?!

МТ4

2017.04.11 07:45:57.495 время копирования буфера EURUSD,M15: uninit reason 0
2017.04.11 07:45:57.495 время копирования буфера EURUSD,M15: общее время = 1397
2017.04.11 07:45:57.495 время копирования буфера EURUSD,M15: проход = 99  время= 6
2017.04.11 07:45:57.495 время копирования буфера EURUSD,M15: проход = 98  время= 6
2017.04.11 07:45:57.495 время копирования буфера EURUSD,M15: проход = 97  время= 6
2017.04.11 07:45:57.494 время копирования буфера EURUSD,M15: проход = 2  время= 7
2017.04.11 07:45:57.494 время копирования буфера EURUSD,M15: проход = 1  время= 18
2017.04.11 07:45:57.494 время копирования буфера EURUSD,M15: проход = 0  время= 36
2017.04.11 07:45:57.493 время копирования буфера EURUSD,M15: initialized

МТ5

2017.04.11 07:46:22.908 время копирования буфера (AGRX,D1)      проход = 0  время= 83
2017.04.11 07:46:22.908 время копирования буфера (AGRX,D1)      проход = 1  время= 106
2017.04.11 07:46:22.909 время копирования буфера (AGRX,D1)      проход = 2  время= 69
2017.04.11 07:46:22.909 время копирования буфера (AGRX,D1)      проход = 3  время= 41
2017.04.11 07:46:22.923 время копирования буфера (AGRX,D1)      проход = 97  время= 42
2017.04.11 07:46:22.923 время копирования буфера (AGRX,D1)      проход = 98  время= 46
2017.04.11 07:46:22.923 время копирования буфера (AGRX,D1)      проход = 99  время= 40
2017.04.11 07:46:22.923 время копирования буфера (AGRX,D1)      общее время = 15406

Скрипт для проверки можно скомпилировать как в МТ5, так и в МТ4

#property script_show_inputs
input string Pair="EURUSD";
ulong StartTime,FinishTime;
ulong StartTime1,FinishTime1;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   StartTime1=GetMicrosecondCount();
   double buf[];
   ArrayResize(buf,1000);
   for ( int i=0; i<100; i++ )
   {
      StartTime = GetMicrosecondCount();
      CopyClose(Pair,0,1,1000,buf);
      FinishTime = GetMicrosecondCount();
      Print("проход = ",i,"  время= ",FinishTime-StartTime);
    //  Sleep(5000);
   }   
   FinishTime1=GetMicrosecondCount();
   Print("общее время = ",FinishTime1-StartTime1);
  }
//+------------------------------------------------------------------+
kaus_bonus:

МТ5 проигрывает МТ4 по времени доступа к данным в 6-10 раз?!

Это не так - проверил.
fxsaber:
Советник для тестера (Metaquotes-Demo)

Результат

Скольжение лимитника на биржевом символе - БАГ!

Скольжение лимитного ордера на биржевом рынке нормальное явление:

Пусть текущий рынок - 114300 / 114280

Вы ставите лимитный ордер buy limit 114250. Кто то на рынке решил продать с гарантированной ценой (не хуже указанной в ордере) и поставил sell limit 114200, как результат он собрал все ордера buy limit в диапазоне от рынка до 114200.

Это вполне нормальная ситуация на биржевом рынке.
MQ Alexander:

Скольжение лимитного ордера на биржевом рынке нормальное явление:

Вынес наше обсуждение (для удобства) сюда.
fxsaber:
Это не так - проверил.


спасибо. я проверял на двух компах  и wine 1.6 и 2.4. сейчас проверил на win xp, разницы между мт4 и мт5 нет.

Может кто подскажет решение по функциям Copy...

На фондовой секции MOEX баров внутри аукционов нет, но функции Copy... эти диапазоны времени включают как бары, т.е. если заказать часовые бары за несколько дней, то в массив тайм-серии попадут бары 09:00:00. Не хочется брать кусками тайм-серии и потом их сращивать, может есть какое другое решение?

Это баг?
struct STRUCT
{
  int a;
  
  STRUCT() {} // Если закомментировать, ошибка пропадает
};

void OnStart()
{
  STRUCT Struct = {1}; // cannot be initialized with initializer list
}

баг при использовании стилизатора?

предположим,мы писали с использованием табуляции.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
   input int x=0;
   #define TWO_DIM (10000)
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double      massive[][TWO_DIM];
  }
//+------------------------------------------------------------------+

ошибок нет.

затем используем стилизатор,получаем

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
input int x=0;
#define TWO_DIM(10000)
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double      massive[][TWO_DIM];
  }
//+------------------------------------------------------------------+
'10000' - unexpected in macro formal parameter list     bug.mq5 7       17
'[' - invalid index value       bug.mq5 13      25

т.е. стилизатор подтирает пробел между TWO_DIM(10000)

Ошибка компиляции
template <typename T>
struct STRUCT
{
  template <typename T1>  
  STRUCT( T1 Value ) {} // 'STRUCT<int><int>' - declaration without type

};

void OnStart()
{
  STRUCT<int> Struct(0); // 'STRUCT<int>' - cannot to apply function template
}
Небольшой лайфхак. Обход оператора присваивания
template <typename T>
struct STRUCT_COPY
{
  T Value;
  
  STRUCT_COPY( const T& tValue)
  {
    this = (STRUCT_COPY)tValue;
  }  
};

struct STRUCT
{
  int i;
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

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

void OnStart()
{
  STRUCT Struct;  
  Struct.i = 1;  
  PRINT(Struct.i);
  
  STRUCT StructCopy1 = Struct;
  PRINT(StructCopy1.i);
  
  // Обходим void STRUCT::operator=(const STRUCT&)
  STRUCT_COPY<STRUCT> StructCopy2(Struct);
  PRINT(StructCopy2.Value.i);  
}

Результат

Struct.i = 1
StructCopy1.i = 5
StructCopy2.Value.i = 1