Особенности языка mql5, тонкости и приёмы работы - страница 57

 
A100:

 Подарок в виде трудноуловимой ошибки при выполнении

Чем ::CopyTicks лучше Copyticks ?

И почему результат всегда -1. О таких ошибках необходимо сообщать во время компиляции

Так все логично. ERR_INVALID_ARRAY получили ошибку.

CopyTicks ровно до типа, лишь бы размер его был равен sizeof(MqlTick). Конечно, именно этот размер можно проверять на этапе компиляции.

Ну а кастомная CopyTicks подчиняется всем MQL-правилам.


Массивы потомков не в состоянии преобразоваться в массивы предков. А вот поэлементно - да. В этом имеется ограничение ArrayCopy, которое было бы хорошо снять.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от начинающих MQL5 MT5 MetaTrader 5

fxsaber, 2017.10.19 21:13

// Возвращает true, если нет бара с таким временем ("дырка")
bool IsHole( const string Symb, const ENUM_TIMEFRAMES TimeFrame, const datetime time )
{
  return(Bars(Symb, TimeFrame, SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_FIRSTDATE), time) +
         Bars(Symb, TimeFrame, time, SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_LASTBAR_DATE)) ==
         SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_BARS_COUNT));
}

Работает без обращению к серверу.

 
A100:

 Подарок в виде трудноуловимой ошибки при выполнении

В следующем билде подарок отключат, к сожалению.

 
ты еще будешь работать на этом счету или нет?
Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Каждый скрипт и каждый эксперт работает в собственном отдельном потоке. Все индикаторы, рассчитываемые на одном символе, даже если они запущены на разных графиках, работают в одном потоке. Таким образом, все индикаторы на одном символе делят между собой ресурсы одного потока. В одном потоке с индикаторами также последовательно выполняются...
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: Expert

fxsaber, 2017.10.31 01:27

Небольшой лайфхак - запуск советников/скриптов на OBJ_CHART-объектах.

Так запущенные советники висят мертво - никак не выполняются. А вот скрипты работают отлично. Поэтому это открывает некоторые возможности.

Например, можно использовать Order-функции из индикаторов на чартах, где уже есть запущенный советник. И при этом никаких новых вспомогательный чартов открывать не требуется.

 
fxsaber:

Вы использовали лайфхак, хотя индикатор может торговать и без него, через события


 
Vitaly Muzichenko:

Вы использовали лайфхак, хотя индикатор может торговать и без него, через события

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

В примере несколько иная ситуация: один чарт и на нем уже запущен какой-то советник. И хочется без открытия новых иногда пробросить OrderSend через индикатор.

Конечно, без DLL, чтобы Маркет прошел.

 
fxsaber:

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

В примере несколько иная ситуация: один чарт и на нем уже запущен какой-то советник. И хочется без открытия новых иногда пробросить OrderSend через индикатор.

Конечно, без DLL, чтобы Маркет прошел.

Ну в видео также работает без DLL. Советник-прослушка нужен всего один на любом чарте, можно и на текущем.

 
Vitaly Muzichenko:

Советник-прослушка нужен всего один на любом чарте, можно и на текущем.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.10.31 06:08

В примере несколько иная ситуация: один чарт и на нем уже запущен какой-то советник. И хочется без открытия новых иногда пробросить OrderSend через индикатор.

 
// Сохранение Bitmap-объекта в bmp/gif/png-файле (прозрачность не учитывается)
bool BitmapObjectToFile( const long chartID, const string ObjName, const string FileName, const bool FullImage = false )
{  
  const ENUM_OBJECT Type = (ENUM_OBJECT)ObjectGetInteger(chartID, ObjName, OBJPROP_TYPE);  
  bool Res = (Type == OBJ_BITMAP_LABEL) || (Type == OBJ_BITMAP);
             
  if (Res)
  {
    const string Name = __FUNCTION__ + (string)MathRand();

    ObjectCreate(chartID, Name, OBJ_CHART, 0, 0, 0);
    ObjectSetInteger(chartID, Name, OBJPROP_XDISTANCE, -1e3);
    
    const long chart = ObjectGetInteger(chartID, Name, OBJPROP_CHART_ID);
        
    Res = ChartSetInteger(chart, CHART_SHOW, false) && ObjectCreate(chart, Name, OBJ_BITMAP_LABEL, 0, 0, 0) &&
          ObjectSetString(chart, Name, OBJPROP_BMPFILE, ObjectGetString(chartID, ObjName, OBJPROP_BMPFILE)) &&
          (FullImage || (ObjectSetInteger(chart, Name, OBJPROP_XSIZE, ObjectGetInteger(chartID, ObjName, OBJPROP_XSIZE)) &&
                         ObjectSetInteger(chart, Name, OBJPROP_YSIZE, ObjectGetInteger(chartID, ObjName, OBJPROP_YSIZE)) &&
                         ObjectSetInteger(chart, Name, OBJPROP_XOFFSET, ObjectGetInteger(chartID, ObjName, OBJPROP_XOFFSET)) &&
                         ObjectSetInteger(chart, Name, OBJPROP_YOFFSET, ObjectGetInteger(chartID, ObjName, OBJPROP_YOFFSET)))) &&
                         ChartScreenShot(chart, FileName, (int)ObjectGetInteger(chart, Name, OBJPROP_XSIZE),
                                                          (int)ObjectGetInteger(chart, Name, OBJPROP_YSIZE));
    ObjectDelete(chartID, Name);
  }                    

  return(Res);
}


Применение

// Сохраняет в png-файлах все Bitmap-объекты текущего чарта
void OnStart()
{  
  for (int i = ObjectsTotal(0) - 1; i >= 0; i--)
  {
    const string Name = ObjectName(0, i);
    
    BitmapObjectToFile(0, Name, (string)ChartID() + "\\" + Name + ".png");    
  }      
}


ЗЫ Так же реализовывается конвертер файлов BMP->GIF/PNG.