Справка по языку MQL5 - страница 41

 

в mql4 просто и эффективно можно узнать high low любого дня например

iHigh( Symbol(), PERIOD_D1, iDAY );

iLow( Symbol(), PERIOD_D1, iDAY );


каким образом эффективно то же самое в MQL5?

--

CopyRates ?

 
YuraZ писал(а) >>

в mql4 просто и эффективно можно узнать high low любого дня например

iHigh( Symbol(), PERIOD_D1, iDAY );

iLow( Symbol(), PERIOD_D1, iDAY );

каким образом эффективно то же самое в MQL5?

--

CopyRates ?

В mql4 это было просто, но неэффективно. При таком запросе в "историческую базу эксперта" сначала копировался весь массив котировок, имеющийся в исторической базе клиентского терминала (правда копирование это - однократное, зато на каждом следующем тике проверяется и обновляется этот массив, независимо от того, будет он использован или нет). А только потом из этого локального массива отдаётся нужное значение.

В mql5 необходимо копировать соответствующий массив (High, Low etc) в свой локальный массив в необходимом объёме (хоть один элемент)

 
YuraZ >>:

в mql4 просто и эффективно можно узнать high low любого дня например

iHigh( Symbol(), PERIOD_D1, iDAY );


каким образом эффективно то же самое в MQL5?

Вот пример эксперта

//+------------------------------------------------------------------+
//|                                                   HighAndLow.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#property description "Пример вывода значений High[i] и Low[i]"
#property description "для баров, выбранных случайным образом"

double High[],Low[];

//+------------------------------------------------------------------+
//| Получим Low для заданного номера бара                           |
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(symbol,timeframe,0,60,Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+
//| Получим High для заданного номера бара                           |
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(symbol,timeframe,0,60,High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   datetime t=TimeCurrent();
   int sec=t%60;
   printf("High[%d] =%G  Low[%d] =%G",
          sec,iHigh(Symbol(),0,sec),
          sec,iLow(Symbol(),0,sec));
  }
//+------------------------------------------------------------------+
 
Rosh писал(а) >>

Вот пример эксперта

//+------------------------------------------------------------------+
//| Получим Low для заданного номера бара |
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double low=0;
ArraySetAsSeries(Low,true);
int copied=CopyHigh(symbol,timeframe,0,60,Low);
if(copied>0 && index<copied) low=Low[index];
return(low);
}

int copied=CopyLow(symbol,timeframe,0,60,Low);

-----------------------

В MQL4 были готовые функции. В MQL5 похоже, многие функции надо будет создавать самостоятельно.

В MQL4 мы не знали внутренней реализации функций. Поэтому трудно судить со стороны, насколько эффективно было реализовано.

Приведенные примеры немного пугают объемом кода. В примере Юрия :

iLow( Symbol(), PERIOD_D1, iDAY );

все выглядит проще.

Это не критика. А просто описание ощущений от новшеств. Хотя с примерами реальной работы МТ5 и реальной эффективностью MQL5 пока мало кто сталкивался.

 
stringo писал(а) >>

В mql5 необходимо копировать соответствующий массив (High, Low etc) в свой локальный массив в необходимом объёме (хоть один элемент)

1) А далее этот локальный массив остается таким и никуда не исчезает до конца работы эксперта? Например необходимо произвести обработку этого локального массива и организовать новый массив, но не копий значений из этого локального массива, а массив ссылок на элементы локального массива таймсерии. Чтобы не тратить время на копирование.

2) Теперь в обязательном порядке будет необходимо копировать таймсерии, прежде чем производить какие-либо вычисления с таймсериями?

В МТ4 мы не задумывались о необходимости копирования.

 
nen >>:

Это не критика. А просто описание ощущений от новшеств. Хотя с примерами реальной работы МТ5 и реальной эффективностью MQL5 пока мало кто сталкивался.

А кто сказал, что будет легко? ;)

 
stringo >>:

В mql4 это было просто, но неэффективно. При таком запросе в "историческую базу эксперта" сначала копировался весь массив котировок, имеющийся в исторической базе клиентского терминала (правда копирование это - однократное, зато на каждом следующем тике проверяется и обновляется этот массив, независимо от того, будет он использован или нет). А только потом из этого локального массива отдаётся нужное значение.

В mql5 необходимо копировать соответствующий массив (High, Low etc) в свой локальный массив в необходимом объёме (хоть один элемент)

Спасибо!

может удивительно но примерно так и представлял, внутренний механизм mt4

--

c MQL5 видимо все намного быстрее

копирование элемента происходит при каждом обрщении?

видимо копия идет не всего массива от а до я, а только четко указанной части - что ускоряет

причем как я понял копирование (имеется ввиду извлечение данных с базы котировок идет один раз)...

второй раз просто извлечение готовых данных из готового массива

---


Rosh - спасибо за пример!

--

хотел добавить, чем больше будет понятных расжованных примеров, тем быстрее пойдет освоение!

 
TheXpert писал(а) >>

А кто сказал, что будет легко? ;)

Идет погружение в тему...

--------------------

Мы еще не скоро в полной мере ощутим, куда мы попали.

 
nen >>:

1) А далее этот локальный массив остается таким и никуда не исчезает до конца работы эксперта? Например необходимо произвести обработку этого локального массива и организовать новый массив, но не копий значений из этого локального массива, а массив ссылок на элементы локального массива таймсерии. Чтобы не тратить время на копирование.

2) Теперь в обязательном порядке будет необходимо копировать таймсерии, прежде чем производить какие-либо вычисления с таймсериями?

В МТ4 мы не задумывались о необходимости копирования.

попробую ответить как понимаю

--


2) верно не задумывались

теперь просто получили - более приближенный механизм - более оголенный - более быстрый

имеем массив - серию - далее делаем что хотим и как хотим


функции типа iLow напишем сами


1) сам бы хотел услышать разработчиков

---

 
stringo >>:

В mql4 это было просто, но неэффективно. При таком запросе в "историческую базу эксперта" сначала копировался весь массив котировок, имеющийся в исторической базе клиентского терминала (правда копирование это - однократное, зато на каждом следующем тике проверяется и обновляется этот массив, независимо от того, будет он использован или нет). А только потом из этого локального массива отдаётся нужное значение.

В mql5 необходимо копировать соответствующий массив (High, Low etc) в свой локальный массив в необходимом объёме (хоть один элемент)


корректен ли такой вариант ? получения хай лов текущего дня - и есть ли более быстрое извлечение


 

MqlRates rates_arrayDAY[];

      int iCod=CopyRates(Symbol(),PERIOD_D1,0,1,rates_arrayDAY);

      if ( iCod > 0 )

     {

        // rates_arrayDAY[0].high

        // rates_arrayDAY[0].low

     }