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

 

Доброго всем дня!

При обращении к хендлу индикатора ATR, первые 30-ть секунд выдает странные значения.

Не могу понять в чем причина?

int ATRdefinition = 0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   ATRdefinition = iATR(_Symbol,_Period,14);
   if(ATRdefinition == INVALID_HANDLE)
     {
      Print("Ошибка создания Хендла");
     }

   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   string signal = "";

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   double ATRarray[];
   ArraySetAsSeries(ATRarray,true);

   CopyBuffer(ATRdefinition,0,0,3,ATRarray);
   
   double ATRValue = NormalizeDouble(ATRarray[0],5);

   Print("ATRVALUE: ",ATRValue);
  }
Файлы:
ATR.png  51 kb
 
Pineapple88:

Доброго все дня!

При обращении к хендлу индикатора ATR, первые 30-ть секунд выдает странные значения.

Не могу понять в чем причина?

А готовность индикатора проверяете?

//--- determine the number of values calculated in the indicator 
   int calculated=BarsCalculated(handle); 

(вместо 'handle' вставьте свой хендл)

 

Получается что этих данных (402082) не достаточно для расчета индикатора?

Я думал что функция BarsCalculated должна выдавать ошибку (-1) если данных для расчета не хватает

Файлы:
ATR2.png  21 kb
 
Pineapple88:

Получается что этих данных (402082) не достаточно для расчета индикатора?

Я думал что функция BarsCalculated должна выдавать ошибку (-1) если данных для расчета не хватает

Похоже на то, что терминал продолжает подкачивать историю - соответственно индикатор всё время пересчитывается. Или другой вариант: в терминале у Вас выставлено ОЧЕНЬ большое число баров для отображения на графике, а Ваш компьютер ОЧЕНЬ слабый.


Добавлено.

Проверил на MetaTrader 5 x64 build 2470 и при настройках "Показывать баров" 100000 - при этом история давно закачена. Код отработал на отлично.

 
Vladimir Karputov:

Похоже на то, что терминал продолжает подкачивать историю - соответственно индикатор всё время пересчитывается. Или другой вариант: в терминале у Вас выставлено ОЧЕНЬ большое число баров для отображения на графике, а Ваш компьютер ОЧЕНЬ 

Спасибо за помощь! 

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

 

Здравствуйте! Есть индикатор для MT5 "Grid Builder", он рисует горизонтальные линии с шагом цены. Можно выбрать например 100п, 200п и тд. И строится горизонтальная сетка вверх и вниз с заданным шагом. Но у него одна  проблема, например, когда я  на таймфрейме  H4 рисую свою графические горизонтальные уровни( ставлю горизонтальные линии из инструментов рисования в терминале) и переключаю на любой другой таймфрейм, все мои линии удаляются. А остаются только горизонтальные уровни индикатора. Как в коде исправить эту ошибку? Чтобы мои горизонтальные уровни никогда не удалялись. Вот код индикатора.  (Вопрос писал уже в другой теме, но там пока ответа нету)

//+------------------------------------------------------------------+
//|                                                  GridBuilder.mq5 |
//|                                              Copyright 2015, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"
#property indicator_chart_window

//---- для расчёта и отрисовки индикатора использовано ноль буферов
#property indicator_buffers 0
//---- использовано всего ноль графических построений
#property indicator_plots   0
//--- входные параметры 
input int count = 50;      //количество линий вверх вниз от цены
input int step  = 333;     //шаг линий 
input double pr = 1.4622;  //цена от которой пляшем
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   ObjectsDeleteAll(0,0,OBJ_HLINE);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectsDeleteAll(0,0,OBJ_HLINE);
  }
//+------------------------------------------------------------------+ 
//| Создает горизонтальную линию                                     | 
//+------------------------------------------------------------------+ 
bool HLine(const string name="HLine",double price=0)
  {
//--- создадим горизонтальную линию 
   if(!ObjectCreate(0,name,OBJ_HLINE,0,0,price))
     {
      Print(__FUNCTION__,
            ": не удалось создать горизонтальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим цвет линии 
   ObjectSetInteger(0,name,OBJPROP_COLOR,clrGreen);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
   return(true);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   double price=pr;
//--- создадим горизонтальную линию 
   for(int i=0;i<=count;i++)
     {
      HLine("HLine"+(string)i,price+step*i*_Point);
      HLine("HLine"+(string)(i+count+1),price-step*i*_Point);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
При создании графического объекта функцией ObjectCreate() необходимо указать тип создаваемого объекта, который может принимать одно из значений перечисления ENUM_OBJECT. Дальнейшие уточнения свойств созданного объекта возможно с помощью функций по работе с графическими объектами.
 
Александр:

Здравствуйте! Есть индикатор для MT5 "Grid Builder", он рисует горизонтальные линии с шагом цены. Можно выбрать например 100п, 200п и тд. И строится горизонтальная сетка вверх и вниз с заданным шагом. Но у него одна  проблема, например, когда я  на таймфрейме  H4 рисую свою графические горизонтальные уровни( ставлю горизонтальные линии из инструментов рисования в терминале) и переключаю на любой другой таймфрейм, все мои линии удаляются. А остаются только горизонтальные уровни индикатора. Как в коде исправить эту ошибку? Чтобы мои горизонтальные уровни никогда не удалялись. Вот код индикатора.  (Вопрос писал уже в другой теме, но там пока ответа нету)

Обратите внимание на этот код:

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectsDeleteAll(0,0,OBJ_HLINE);
  }
//+------------------------------------------------------------------+ 

В частности прочтите про ObjectsDeleteAll() - там и причина и ответ как подправить.

Документация по MQL5: Графические объекты / ObjectsDeleteAll
Документация по MQL5: Графические объекты / ObjectsDeleteAll
  • www.mql5.com
[in]  Префикс, по которому будут удалены все объекты, чьи имена начинаются с данного набора символов. Префикс можно указывать как 'name' или 'name*' – оба варианта работают одинаково. Если в качестве префикса указана пустая строка, то будут удалены объекты с любым именем. Функция использует синхронный вызов – это...
 
Artyom Trishkin:

Обратите внимание на этот код:

В частности прочтите про ObjectsDeleteAll() - там и причина и ответ как подправить.

Спасибо!!! Разобрался, теперь работает без удаления. 

 
Операции с базой SQLite доступны из тестера ? Я про добавление и изменение данных.
 
Dmitri Custurov:
Операции с базой SQLite доступны из тестера ? Я про добавление и изменение данных.

Доступны. Только следите за расположением базы. Они создаются так-же как и файлы.