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

 
Aleksey Vyazmikin:

Как найти причину такому сообщению?

Профилировщик

 
Artyom Trishkin:

Вы не знаете как проверить возвращаемое значение на ноль? И не знаете как выйти из OnCalculate() с возвратом нуля? Вы никогда не пытались искать информацию по поиску на сайте?

  1. Получаем требуемое значение из функции
  2. Проверяем его на ноль
    1. Если ноль, то return 0;
    2. Если не ноль, то к п3
  3. Работаем с полученным значением
Никогда не думал, что буду рассказывать на этом ресурсе азы логики человеку с рейтингом, перевалившем за 13 тысяч...

Это не индикатор.

Я специально уточнил, нужно ли делать проверки при каждом вызове, или достаточно одной в начале OnTick...

Ретурны мне не приемлемы... а зациклить ожидание в тестере нельзя, а на реале должно получаться (или нет?).

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

Спасибо за понимание.

 

А если оно бывает раз в сутки или того реже?

 
Здравствуйте. Почему то хендэл передает только когда установлен на все периоды, а ставлю на определенный и ничего нет. В чем проблема непонятно. Пробовал вбивать в хендэл напрямую не из глобальных переменных, результат тот же. Что не так??? Надо что бы значение было из одного периода.
//+------------------------------------------------------------------+
//|                                                        77777.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 1            |
//+----------------------------------------------+
//----
input string xBars="2018.11.19 00:00";            //Дата начала отсчета
input bool DataBars=false;                        //Считать по дате (true)
input int InpMAShift=1;                           //Сдвиг бара расчета 
input ENUM_TIMEFRAMES Timeframes=PERIOD_D1;       //Таймфрейм скользящей
input ENUM_MA_METHOD  Method=MODE_EMA;            //Метод  расчета скользящей
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; //Расчет цены скользящей
input ENUM_LINE_STYLE MAStyle=STYLE_DASH;         //Стиль всех скользящих линий
input int InpMAPeriod1=5;                         //Скользящая 1 периода

//----
int handle_ma,shift;
double BufferPrice[];
//---
int period;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   period=(InpMAPeriod1<1 ? 1 : InpMAPeriod1);
//---
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
   ArraySetAsSeries(BufferPrice,true);
//--- create MA's handles
   ResetLastError();

//----------------------------------------------------------------+
//                     ПРОБЛЕМА ТУТ 
//
//----------------------------------------------------------------+
   handle_ma=iMA(NULL,PERIOD_D1,period,0,MODE_SMA,PRICE_CLOSE);         //ПРОБЛЕМА ТУТ 
 //  handle_ma=iMA(NULL,PERIOD_CURRENT,period,0,MODE_SMA,PRICE_CLOSE);      // БЕЗ ПРОБЛЕМЫ
   if(handle_ma==INVALID_HANDLE)
     {
      Print("The iMA (",(string)period,") object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  ObjectDelete(0,"Proba");
   Comment("");
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- Проверка количества доступных баров
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;
//----   
if(DataBars==false)
    shift=InpMAShift;
 else
    shift=iBarShift(NULL,PERIOD_CURRENT,StringToTime(xBars)); 
    
 double ma1=BufferPrice[shift];
 datetime tm=iTime(NULL,Timeframes,shift);
 
 Comment(NormalizeDouble(BufferPrice[shift],_Digits),"    ",shift);
 
 
   HLine("Proba","",tm,ma1,MAStyle,1,Red);

//--- return value of prev_calculated for next call

   return(rates_total);
  }
//+------------------------------------------------------------------+
void HLine(string name,
           string text,
           datetime tm,
           double price,
           int stl,
           int wid,
           color clr)
  {
   if(ObjectFind(0,name)!=0)
     {
      ObjectCreate(0,name,OBJ_HLINE,0,tm,price);
      ObjectSetInteger(0,name,OBJPROP_TIME, tm);
      ObjectSetString(0,name,OBJPROP_TEXT,text); 
      ObjectSetString(0,name,OBJPROP_FONT,"Times New Roman"); 
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,10); 
      ObjectSetInteger(0,name,OBJPROP_STYLE, stl);
      ObjectSetInteger(0,name,OBJPROP_WIDTH, wid);
      ObjectSetInteger(0,name,OBJPROP_COLOR, clr);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true); 
     }
  }

 
kopeyka2:
Здравствуйте. Почему то хендэл передает только когда установлен на все периоды, а ставлю на определенный и ничего нет. В чем проблема непонятно. Пробовал вбивать в хендэл напрямую не из глобальных переменных, результат тот же. Что не так???
      ResetLastError();
   if(CopyBuffer(handle_ma,0,0,count,BufferPrice)<0)
     {
      PrintFormat("Failed to copy data from the handle_ma indicator, error code %d",GetLastError());
      return(0.0);
     }
//   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);

Изучайте ошибку, правильно же Артём говорит, что надо все проверять по 10 раз...

2019.01.25 20:12:26.169 Test777 (Si Splice,M1)  Failed to copy data from the handle_ma indicator, error code 4806

ERR_INVALID_ARRAY

4006

Массив неподходящего типа, неподходящего размера или испорченный объект динамического массива


ERR_INDICATOR_DATA_NOT_FOUND

4806

Запрошенные данные не найдены


 
kopeyka2:
Здравствуйте. Почему то хендэл передает только когда установлен на все периоды, а ставлю на определенный и ничего нет. В чем проблема непонятно. Пробовал вбивать в хендэл напрямую не из глобальных переменных, результат тот же. Что не так??? Надо что бы значение было из одного периода.

Вы же примеры берёте из КодоБазы из индикаторов от Scriptor? Верно? Тогда поищите в его кодах (совсем недавно публиковались) примеры, в названии которых фигурирует MTF, но без MCP.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Т.е., раз вы хотите получать данные на текущем символе, но с иного таймфрейма нежели период графика, то вам нужен пример мультитаймфреймного индикатора. В MCP пока не стоит лезть - там на ООП с использованием стандартных классов. Запутаетесь.

Например, вот этот расчёт:

//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;

он только для МА, работающей на текущем периоде и символе. Для работы на ином периоде, расчёт будет отличаться. Поищите - всё близко, и направление я вам подсказал.

 
Artyom Trishkin:

Вы же примеры берёте из КодоБазы из индикаторов от Scriptor? Верно? Тогда поищите в его кодах (совсем недавно публиковались) примеры, в названии которых фигурирует MTF, но без MCP.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Т.е., раз вы хотите получать данные на текущем символе, но с иного таймфрейма нежели период графика, то вам нужен пример мультитаймфреймного индикатора. В MCP пока не стоит лезть - там на ООП с использованием стандартных классов. Запутаетесь.

Например, вот этот расчёт:

он только для МА, работающей на текущем периоде и символе. Для работы на ином периоде, расчёт будет отличаться. Поищите - всё близко, и направление я вам подсказал.

Спасибо...
 
Aleksey Vyazmikin:

Изучайте ошибку, правильно же Артём говорит, что надо все проверять по 10 раз...

ERR_INVALID_ARRAY

4006

Массив неподходящего типа, неподходящего размера или испорченный объект динамического массива

Спасибо
 
kopeyka2:
Спасибо

Пожалуйста, только не ту ошибку я скопировал, надо так

ERR_INDICATOR_DATA_NOT_FOUND

4806

Запрошенные данные не найдены

Суть в том, что число баров разное на разных ТФ и это надо учитывать.

 
Aleksey Vyazmikin:

Пожалуйста, только не ту ошибку я скопировал, надо так

ERR_INDICATOR_DATA_NOT_FOUND

4806

Запрошенные данные не найдены

Суть в том, что число баров разное на разных ТФ и это надо учитывать.

Как раз это  проверял. Но ПРОБЛЕМА в том, что установив  хендэл  на один постоянный период,   в 

CopyBuffer значение на  других таймфреймах НЕ ПЕРЕДАЕТСЯ. На установленном хендлэ периоде  значение было, а на меньших таймфремах 0.0 (ноль). Подвигал в поисках по буферу... ноль. Почему не передается в  CopyBuffer  ?

Причина обращения: