Библиотеки: TimeSeries - Библиотека функций для работы с таймсериями - страница 2

 

Вообще у меня двоякое отношение к таким разработкам.

С одной стороны человек потрудился, и не пожалел выложить, респект и уважуха.

С другой это нужно для лабухов тупо портирующих коды с МТ4 на МТ5. "Тупо" значит не вдаваясь в возможности языка и не вникая в саму стратегию.

Кстати сам такое сейчас делаю человеку :) , поэтому критика и ко мне направлена.

Попробую более развёрнуто про тупость и возможности у MQL5.

Возъём простую функцию iClose, в МТ4 не было возможности получить сразу всю таймсерию (только поштучно), в МТ5 её получение оптимизированно настолько что не ощущается разницы при копировании одного значения и всей серии (ну немного утрированно но почти так). Так что на организацию массива в который будет скопированы данные зачастую уходит сравнимое количество времени, так что получать поштучно Close нет смысла. Более того в индикаторах эти серии вообще уже есть по умолчанию. Так что при портировании имеет смысл разбивать код на расчётный (который выностися в индикатор) и торговый (который исполняется в советнике).

К чему я веду, с одной стороны такие коды это полезная работа для новичков, им становится проще жить.

С другой стороны задаётся неверный стандарт программирования, программирование через Ж.

ЗЫ кстати вот ещё одна фича к инклюднику:

// это в инклюдник
MqlTick last_tick;
#define Ask last_tick.ask
#define Bid last_tick.bid
// это в OnTick
SymbolInfoTick(_Symbol,last_tick);
// теперь в любом месте можно пользовать
 Ask; // и
 Bid;



 

Вот тебе ещё доработачка.

ЗЫ Но по правильному лучше бы всё переписать на основе стандартной библы.



Файлы:
 
Сорри, а там, что некорректный код ?  Переход с MQL4 на MQL5
 
BoraBo:
Сорри, а там, что некорректный код ?  Переход с MQL4 на MQL5

Почему же не корректный, корректный (я оттуда и скомуниздил часть кода),

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

+ я там OrderSend портировал, думаю львиная доля проблем именно с установкой ордеров связана.

кстати много чего нет, например весь торговый функционал неперебит (я сделал только OrderSend и OrderClose).

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

 
Urain:

Просто код, что в статье, что в этой библиотеке практически один в один, думал може чего в статье не то.

 

 
BoraBo:

Просто код, что в статье, что в этой библиотеке практически один в один, думал може чего в статье не то.

 

А чего велосипеды изобретать, скопипастил то что уже есть, отредактировал, добавил своего.

Вуаля и всё работает.

для этого и публикуются исходники, что другие пользовались.

Иначе каждый программист до сих пор бы писал на ассемблере.

 
komposter:

С удовольствием сделаю аналоги всех необходимых функций (в т.ч. по учету виртуальных сделок), когда дойдут руки.

Сейчас понадобились эти функции, готовой библиотеки не нашел. Вот и пришлось сделать свою.

Года три уже пользуюсь своей библиотекой, постоянно ее дорабатывая. все работает как швейцарские часы.

У вам нашел несколько интересных моментов, нужно будет подумать над реализацией.

 
Interesting:

У вам нашел несколько интересных моментов, нужно будет подумать над реализацией.

подскажите по коду, какие интересные моменты вы нашли?
 
sergeev:
подскажите по коду, какие интересные моменты вы нашли?

Некоторые вещи сделаны проще и более функциональней, чем у меня. В определенных местах я проверок на ошибки не ставил.

Мой код иногда раза в 3-4 больше.

PS

Мой код правда, как мне кажется, больше соответствует MQL4 (могут быть и иные варианты)

 

как пример (самые первые реализации) для iHighest и iOpen

//Function iHighest
int iHighest(string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0) export 
//Returns the shift of the maximum value over a specific number of periods depending on type. 
{
//----------------------------------------------------------------------------//
//Work variables
ENUM_TIMEFRAMES TF; //Period as ENUM_TIMEFRAMES

double Arr[];
long Volume[];
datetime Time[];

int Result = -1; //Returned importance
//----------------------------------------------------------------------------//

TF = MinuteToPeriod(timeframe);

  if(start<0)  start = 0;
  if(count<=0) count = Bars(symbol,TF);
//MODE_OPEN
  if(type==MODE_OPEN)
  {
  ArraySetAsSeries(Arr,true);

  CopyOpen(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_LOW
  if(type==MODE_LOW)
  {
  ArraySetAsSeries(Arr,true);

  CopyLow(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_HIGH
  if(type==MODE_HIGH)
  {
  ArraySetAsSeries(Arr,true);

  CopyHigh(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_CLOSE
  if(type==MODE_CLOSE)
  {
  ArraySetAsSeries(Arr,true);

  CopyClose(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_VOLUME
  if(type==MODE_VOLUME)
  {
  ArraySetAsSeries(Volume,true);

  CopyTickVolume(symbol,TF,start,count,Volume);

  Result = ArrayMaximum(Volume,0,count) + start;
  }
//MODE_TIME
  if(type==MODE_TIME)
  {
  ArraySetAsSeries(Time,true);

  CopyTime(symbol,TF,start,count,Time);

  Result = ArrayMaximum(Time,0,count) + start;
  }
//Checking for presence of the errors  
  if(GetLastError()!=0)
  {
  Result = -1; //Message on error
  }  
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}
//Function iOpen
double iOpen(string symbol, int timeframe, int shift) export 
//Returns Open value for the bar of indicated symbol with timeframe and shift.
//If local history is empty (not loaded), function returns 0.
//For the current chart, the information about open prices is in the predefined array named Open[]. 
{
//----------------------------------------------------------------------------//
//Work variables
ENUM_TIMEFRAMES TF; //Period as ENUM_TIMEFRAMES

double Arr[];

double Result = 0; //Returned importance
//----------------------------------------------------------------------------//

ResetLastError();

  if(shift>=0)
  {
  TF = MinuteToPeriod(timeframe);

  CopyOpen(symbol,TF,0,Bars(symbol,TF),Arr);
  
    if(ArraySize(Arr)>0)
    {
    ArraySetAsSeries(Arr,true);
    Result = Arr[shift];
    } 

  }
//Checking for presence of the errors  
  if(GetLastError()!=0)
  {
  Result = 0; //Message on error
  }  
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}