Бета-тестирование MetaTrader 5 началось! - страница 116

 

Примеру ради вот например можете попробовать:

//+------------------------------------------------------------------+
//|                                                       Ошибка.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"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
datetime Time[],TimeA,TimeB,TimeC;
double Ext[],ExtA,ExtB,ExtC;
int handle;
int OnInit()
  {
//---
ArraySetAsSeries(Ext,true);
ArraySetAsSeries(Time,true);
handle =iCustom(Symbol(),PERIOD_CURRENT,"Examples\\ZigZag",12,5,3);

ResetLastError();
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectsDeleteAll(0,0,OBJ_TREND);
   ObjectsDeleteAll(0,0,OBJPROP_TEXT);
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
int copied=CopyBuffer(handle,0,0,1000,Ext);
CopyTime(NULL,0,0,1000,Time);
if(copied<0)
  {
 Sleep(50);
  }

 
 int KolExt;
 for(int i;i<500;i++)
  {
  if(Ext[i]!=0 )
    {
    if(KolExt<3)
      {
      int q;
      q++;
              if(q==2)
                {
                ExtA=Ext[i];
                TimeA=Time[i];
                ObjectCreate(0,"A",OBJ_TEXT,0,TimeA,ExtA);
                ObjectSetString(0,"A",OBJPROP_TEXT,"A");
                }
                else if(q==3)
                       {  
                       ExtB=Ext[i];
                       TimeB=Time[i];
                       ObjectCreate(0,"B",OBJ_TEXT,0,TimeB,ExtB);
                       ObjectSetString(0,"B",OBJPROP_TEXT,"B");
                       } 
                       else if(q==4)
                              {  
                              ExtC=Ext[i];
                              TimeC=Time[i];
                              ObjectCreate(0,"C",OBJ_TEXT,0,TimeC,ExtC);
                              ObjectSetString(0,"C",OBJPROP_TEXT,"C");
                              }
       }
     }
  }
   ObjectCreate(0,"1",OBJ_TREND,0,TimeC,ExtC,TimeA,ExtA);
    ObjectSetInteger(0,"1",OBJPROP_RAY_RIGHT,1 );
    ObjectSetInteger(0,"1",OBJPROP_COLOR,Yellow );
  }
  
//+------------------------------------------------------------------+
 
arbuz >>:
Что то у меня с терминалом вещи какие то непонятные происходят...Вчера советник работал как положенно, а сегодня ....В советнике содержится цикл который считывает данные с ZigZaga и заносит их в глобальные переменные, далее изходя из этих данных строятся графические объекты. При присоединении советника на график все работает как положенно все линии рисуются правильно. При переключении таймфрема, глобальные переменные как бы не обнуляются, цикл о котором я писал пропускается и графические объекты строятся по данным с прошлого таймфрейма ни чего не пойму.В функии OnDeinit все объекты я удаляю, тоесть при переключении тайма все удаляется, и должно обнуляться. В чем может быть причина? Глюк?

Скорей всего это не глюк, а не точность алгоритма инициализации (деинициализации)...

Не видя кода сказать конечно что-то сложно, но как возможное решение проблемы можно посоветовать несколько вариантов:

1. Вместе с удалением объектов в OnDeinit прописываем и обнуление значений всех (одной) переменных в зависимости от логики и очистку содержимого динамических массивов если такие имеются;

2. Обрабатывать при инициализации момент смены ТФ. Я например в инициализации отлавливаю значение возвращаемое UninitializeReason(), если оно равно 0 то значит советник присоединен к графику и инициализация проводится впервые. В противном случае определяем причину инициализации и действуем соответственно;

3. Прописать в параметрах жесткую привязку к периоду, тогда при любой смене ТФ рисоваться все будет тока по тому ТФ что задан в параметрах

4. Другие способы, но тут все зависит алгоритма инициализации и фантазии автора эксперта.

 

Здравствуйте! Почему во всех индикаторах периоды int. а не double? Когда пытаешься исправить компилятор выдаёт замечание. Правда индикатор компилируется и работает, но не знаю, что там исправить, что бы не выдавал замечание. К тому же линия цены на графике 6H и 8H имеет разную толщину. Снимок состояния прилагается.


 
arbuz >>:

Примеру ради вот например можете попробовать:


Из преведенного кода мне не совсем понятно вот это место:

CopyTime(NULL,0,0,1000,Time);

насколько я понял вот такой должен быть шаблон вызова

int  CopyTime(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   int              start_pos,       // откуда начнем 
   int              count,           // сколько копируем
   datetime         time_array[]     // массив для копирования времени открытия
   );

а отсюда следует, что вызов должен быть примерно таков

CopyTime(Symbol(),PERIOD_CURRENT,0,1000,Time);
CopyTime(Symbol(),_Priod,0,1000,Time);
CopyTime(Symbol(),Priod(),0,1000,Time);
 
arbuz >>:
Что то у меня с терминалом вещи какие то непонятные происходят...Вчера советник работал как положенно, а сегодня ....В советнике содержится цикл который считывает данные с ZigZaga и заносит их в глобальные переменные, далее изходя из этих данных строятся графические объекты. При присоединении советника на график все работает как положенно все линии рисуются правильно. При переключении таймфрема, глобальные переменные как бы не обнуляются, цикл о котором я писал пропускается и графические объекты строятся по данным с прошлого таймфрейма ни чего не пойму.В функии OnDeinit все объекты я удаляю, тоесть при переключении тайма все удаляется, и должно обнуляться. В чем может быть причина? Глюк?

Хендл ЗигЗага освобождаешь в DeInit?

 
arbuz >>:

Примеру ради вот например можете попробовать:



В OnDeinit есть ошибка связанная с удалением текстовых меток (старый код не верен)

Следует применять что-то из этого:

ObjectsDeleteAll(0,0,OBJ_TEXT); //Для удаления только текста
ObjectsDeleteAll(0,0,-1);       //Сносим все объекты с графика

PS

Не понятно зачем нужен вот этот код?

Может там что-то и подразумевалось, но в примере я этого точно не вижу...

А вижу, что значение переменной всегда равно нулю

int KolExt;
............
if(KolExt<3)
..............
 

В ходе получения данных при помощи вот такого вызова (в момент смены ТФ)

copied=CopyBuffer(handle,0,0,1000,Ext);

частенько возвращается вот такая ошибка:

ERR_INDICATOR_DATA_NOT_FOUND

4806

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


Но поскольку в коде это предусмотрено будем считать что все ОК...

 

SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE);

должна вернуть - Стоимость минимального изменение цен

ВСЕГДА возвращает ноль, хлопцы я не понял на чем мы зарабатываем ;))

 
vdv2001 >>:

SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE);

должна вернуть - Стоимость минимального изменение цен

ВСЕГДА возвращает ноль, хлопцы я не понял на чем мы зарабатываем ;))

Похоже на то...

 
Уважаемые разработчики - При загрузке шаблона хочется и избавится от старого комментария (а нет, живучий гад попался)....
Причина обращения: