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

 

Предлагаю миграцию double MarketInfo(string symbol, int type) осуществлять в виде набора функций возвращающих различные типы данных, согласно спецификации входных параметров


К примеру вот такие функции:

int MarketInfoInt(string symbol, int type);

string MarketInfoStr(string symbol, int type)....

Когда-то общался с разработчиками по поводу ПЕРЕГРУЗКИ и результатов функций, но они отказались это делать (а жаль).


PS

Исходя из этого наилучшим решением на этот момент думаю будет являться библиотека MarketInfo в которой буду находится все требуемые функции.

Кстати, именно так я и поступил у себя :)

 
Interesting:

На мой взгляд для работы с ТФ в условиях миграции необходимы две функции:

1. Преобразует число секунд в ТФ - скажем ENUM_TIMEFRAMES SecondToPeriod(int Value);

2. Преобразует период в секунды - скажем int PeriodToSecond(ENUM_TIMEFRAMES Value).


Что в своем модуле миграции я с успехом и сделал еще в самом начале (при этом есть еще и вариант с DLL).


PS

Для максимального соответствия MQL4 лично я избавился от всех нестандартных для него периодов



функция хороша и полезна, но вот исполнение....

я бы так сделал

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void FixTF(int &tf)
  {
   switch(tf)
     {
      case 0: tf = 0;break;
      case 1: tf = PERIOD_M1;break;
      case 5: tf = PERIOD_M5;break;
      case 15: tf = PERIOD_M15;break;
      case 30: tf = PERIOD_M30;break;
      case 60: tf = PERIOD_H1;break;
      case 240: tf= PERIOD_H4;break;
      case 1440: tf=PERIOD_D1;break;
      case 10080: tf = PERIOD_W1;break;
      case 43200: tf = PERIOD_MN1;break;
      default: tf=0;break;
     }
  }
//+------------------------------------------------------------------+



во всех функция просто необходимо определить размер массивов

просто как азъ буки веди.

 
CoreWinTT:

функция хороша и полезна, но вот исполнение..... ересь наиполнеешая

ваша работа??

ГДЕ БРЕАК!!!!!! горе програмисты!!!


Чем return хуже break?
 
приношу извенения.
 
CoreWinTT:

во всех функция просто необходимо определить размер массивов
просто как азъ буки веди.

Не всегда, смотрим раздел Доступ к таймсериям и индикаторам:

Функции для работы с таймсериями и индикаторами. Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым). Для копирования значений таймсерий и индикаторов рекомендуется использовать только динамические массивы, так как функции копирования самостоятельно распределяют необходимый размер массивов-приемников значений.

Из этого правила есть важное исключение: если копирование таймсерий и значений индикаторов необходимо делать часто, например, при каждом вызове OnTick() в экспертах или при каждом вызове OnCalculate() в индикаторах, то в этом случае лучше использовать статически распределенные массивы, так как операции распределения памяти под динамические массивы требуют дополнительного времени и это скажется при тестировании и оптимизации экспертов.


 
Rosh:

Не всегда, смотрим раздел Доступ к таймсериям и индикаторам:


как показывает моя практика это лучше сделать чем нет.

иначе появлется ошибка доступа к данным

особенно с глобальными массивами.


во первых потому что в массиве с обозначенным размером индексация статическая и нету эти опасных моментов массивов перевертышей

во вторых более экономно выделяется место под массивы

а в третих вероятность появление ошибки доступа к массиву снижается в разы

поэтому я считаю что для данных функций просто необходима функция определения размера массива 

 
CoreWinTT:

функция хороша и полезна, но вот исполнение....

я бы так сделал

В статью внесены изменения:

  • восстановлена в первоначальном виде функция TFMigrate()
  • изменены функции в разделе 18
 
В справочник добавлена функция iMAOnArray(...)

 
Исправил функцию iMAOnArray. В режиме MODE_SMA значительно сокращено время расчёта.

 

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

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);
  }
Причина обращения: