Обсуждение статьи "Переход с MQL4 на MQL5" - страница 4

 
Interesting :

Что-то я сильно стал сомневаться в работоспособности вот этой конструкции. Как не пытался понять логику блока, не смог (а я сильно старался)...

А в чём сомнение? Считает правильно.

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//+------------------------------------------------------------------+
#include <InitMQL4.mqh>
double   close[];
int      total,count;
datetime time[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   count=Bars(_Symbol,_Period);
   total=CopyClose(_Symbol,_Period,0,count,close);
   total=CopyTime(_Symbol,_Period,0,count,time);
   ArraySetAsSeries(time,true);
   ArraySetAsSeries(close,true);
   int N=7;
   int shift=iBarShiftMQL4(_Symbol,_Period,time[N]);
   Print("TIME",time[N],"BAR=",shift," CLOSE=",close[shift]);
  }
//+------------------------------------------------------------------+
int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }
//+------------------------------------------------------------------+
 
DC2008 :

А в чём сомнение? Считает правильно.

А теперь фокус-покус


1. В MT4 пишем такую строку и выполняем код на H4

Print(iBarShift(Symbol(),Period(),1274356800,false)); //дата 20.05.2010 12:00

Затем проделываем тоже самое с MT5 и строкой

int shift=iBarShiftMQL4(_Symbol,_Period,StringToTime("20.05.2010 12:00"),false);

в итоге получаем 8


2. После чего проделываем точно такую операцию, только с D1.

В итоге MT4 возвращает - 1, а MT5 - 0

И кто теперь мне скажет насколько вот такая реализация iBarShiftMQL4 соответствует необходимой...

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }
 

Попробуйте вот этот вариант:

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
     {
      if(ArraySize(Arr)>2) return(ArraySize(Arr)-1);
      if(time<time1) return(1);
      else return(0);
     }
   else return(-1);
  }

 

опять таки вы читали про функцию про которую пишете???

на мкл4 написано точно

double iClose( string symbol, int timeframe, int shift)
Возвращает значение цены закрытия указанного параметром shift бара с соответствующего графика (symbol, timeframe). В случае ошибки функция возвращает 0. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().
Для текущего графика информация о ценах закрытия находится в предопределенном массиве Close[].

а у вас....

return(-1);

ваше куда модераторы смотрят...

 

Спасибо, CoreWinTT.

Исправил функции: iClose, iLow, iHigh, iOpen, iTime, iVolume. При ошибке возвращают 0, а не -1.

 

 а когда они появятся в библиотеке???

так что были хотябы

а то если её открыть встаёт вопрос, а смысл выше всего написанного????

и также хотябы собрать уже функции по которым все вопросы решены и преступить и изучению ошибок в остальных.

 
bool  SetIndexBuffer(
   int                    index,         // индекс буфера
   double                 buffer[],      // массив
   ENUM_INDEXBUFFER_TYPE  data_type      // что будем хранить
   );

на днях один человек предложил грамотное средство создание мкл4 среды

путём использования массивов из 

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])

но с ними будет сложно поскольку они имеют состояние const

создать глобальные буфера не получится

поскольку их необходимо объявить с помошью

SetIndexBuffer

Связывает указанный индикаторный буфер с одномерным динамическим массивом типа double, объявленном на глобальном уровне.

но только тип дабл, а объёмы и массивы дате тайм не пройдут.

остаётся только инициировать данные массивы внутри модуля mql4

что практически равноценно переписи индикатора....

 
CoreWinTT:

 а когда они появятся в библиотеке???

Уже появились.
 
там пусто и было пусто и только куча дефайнов и ничего более....
 
CoreWinTT:

 а когда они появятся в библиотеке???

так что были хотябы

а то если её открыть встаёт вопрос, а смысл выше всего написанного????

и также хотябы собрать уже функции по которым все вопросы решены и преступить и изучению ошибок в остальных.

Дык в частных библиотеках давно есть куча решений на эту тему.

Я к примеру с самого начала использую IsTesting() и подобные вещи, также давно все решено с датой и временем (конечно есть и другие решения)...

 

Другое дело в наличии таких "Устаревших решений" в самом МТ5...