Ошибки, баги, вопросы - страница 2916

 
Kira27:

Понял! так как имена идентичны то выбирается самая маленькая первая цифра в номере и это 4 объект, далее так как у первых 2х объектов первая цифра 4 то выбирается меньшая цифра следующая за четверкой у первых 2х объектов.   ИТД.

A100:

Да, только обратное преобразование нельзя сделать. Присваивать объектам случайные номера это все равно что назвать язык не MQL5, а MQL831

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

 
Kira27:

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

А что мешает воспользоваться ObjectGetInteger() с идентификатором свойства OBJPROP_CREATETIME ?

Документация по MQL5: Графические объекты / ObjectGetInteger
Документация по MQL5: Графические объекты / ObjectGetInteger
  • www.mql5.com
2. Возвращает true или false в зависимости от успешности выполнения функции.  В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром. [in]  Модификатор указанного свойства. Для первого варианта по умолчанию значение модификатора равно 0. Большинство свойств не требуют модификатора...
 
Artyom Trishkin:

А что мешает воспользоваться ObjectGetInteger() с идентификатором свойства OBJPROP_CREATETIME ?

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


Пока нашёл такой способ, создаём 4 объекта фибо   В списке сохранён порядок создания, нумеруем их для обработки по порядку создания   Запускаем советник 

//+------------------------------------------------------------------+
//|                                                            F.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                  Fibo_Massiv.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
string NameFiboUp[15];                               // Объявление массива
string NameFiboDown[15];                               // Объявление массива
string NameFibo[9];                               // Объявление массива
int TimeFrame[9];
string Num[9];

int Frame;
//string New_N;




//+------------------------------------------------------------------+
int OnInit()
  {
//______________________________Массив новых имён с индексацией номеров очерёдности________________________________
   NameFiboUp[1]="FiboUp1 ";
   NameFiboDown[1]="FiboDown1 ";
   NameFiboUp[2]="FiboUp2 ";
   NameFiboDown[2]="FiboDown2";
   NameFiboUp[3]="FiboUp3";
   NameFiboDown[3]="FiboDown3 ";
   NameFiboUp[4]="FiboUp4 ";
   NameFiboDown[4]="FiboDown4 ";
   NameFiboUp[5]="FiboUp5";
   NameFiboDown[5]="FiboDown5 ";
   NameFiboUp[6]="FiboUp6 ";
   NameFiboDown[6]="FiboDown6 ";
   NameFiboUp[7]="FiboUp7 ";
   NameFiboDown[7]="FiboDown7 ";
   NameFiboUp[8]="FiboUp8 ";
   NameFiboDown[8]="FiboDown8 ";
   NameFiboUp[9]="FiboUp9 ";
   NameFiboDown[9]="FiboDown9 ";
   NameFiboUp[10]="FiboUp10 ";
   NameFiboDown[10]="FiboDown10";
   NameFiboUp[11]="FiboUp11 ";
   NameFiboDown[11]="FiboDown11 ";
   NameFiboUp[12]="FiboUp12 ";
   NameFiboDown[12]="FiboDown12 ";
   NameFiboUp[13]="FiboUp13 ";
   NameFiboDown[13]="FiboDown13";
   NameFiboUp[14]="FiboUp14 ";
   NameFiboDown[14]= "FiboDown14";
//____________________string Массив таймфреймов______________________________
   NameFibo[1]="M1";
   NameFibo[2]="M5";
   NameFibo[3]="M15";
   NameFibo[4]="H1";
   NameFibo[5]="H4";
   NameFibo[6]="Da";
   NameFibo[7]="We";
   NameFibo[8]="Mo";
//___________________int Массив таймфреймов__________________________________________
   TimeFrame[1]=1;
   TimeFrame[2]=5;
   TimeFrame[3]=15;
   TimeFrame[4]=60;
   TimeFrame[5]=240;
   TimeFrame[6]=1440;
   TimeFrame[7]=10080;
   TimeFrame[8]=43200;
//_____________________________________________________________________________
   Num[1]="1";
   Num[2]="2";
   Num[3]="3";
   Num[4]="4";
   Num[5]="5";
   Num[6]="6";
   Num[7]="7";
   Num[8]="8";

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int G=0;
   int UP=1;    //Счётчик очерёдности типов фибо
   int Down=1;  //Счётчик очерёдности типов фибо
   string  nameUP   = "FiboUp";
   string  nameDown = "FiboDown";
   double FiboDown[4][10],FiboUp[4][10];  // 2x мерный  массив
//  Alert("ArraySize(FiboDown)= ", ArraySize(FiboDown));
   int Fibo_Koll = ObjectsTotal(0,0,OBJ_FIBO);     //Запрос колличества объектов Fibo

//_________________________________________________________
   if(Fibo_Koll==0) //Если нет не одного фибо выход        //
      return;                                              //
//_________________________________________________________//

 //  int Koll[];  //Индексация и запись в массив по порядку появления фибо в окне инструментов
  // int Tip[];    //Запись типа Fibo в массив по порядку появления фибо в окне инструментов
   //ArrayResize(Koll,Fibo_Koll); // Устанавливает новый размер в первом измерении массива Koll []
   //ArrayResize(Tip,Fibo_Koll);  // Устанавливает новый размер в первом измерении массива Tip []


//  ObjectName(0,0,0,OBJ_FIBO); //Вытаскивает имя найденого фибо

   for(int i=0; i < Fibo_Koll; i++)
     {
      G++; // Нумератор объектов из списка объектов
      string n =ObjectName(0,i,0,OBJ_FIBO); //Имя для обрезки до 2х первых знаков для получения тайм-фрейма
      string Name_Static =ObjectName(0,i,0,OBJ_FIBO);
      //--------------------------------------------------------

      //----------------------------------------------------------------------------------------
      double   Fibo_Level_0= ObjectGetDouble(
                                0,          // идентификатор графика
                                n,              // имя объекта
                                OBJPROP_PRICE,           // идентификатор свойства
                                0     // модификатор свойства
                             );


      double   Fibo_Level_1= ObjectGetDouble(
                                0,          // идентификатор графика
                                n,              // имя объекта
                                OBJPROP_PRICE,           // идентификатор свойства
                                1     // модификатор свойства
                             );
      //------------------------------------------------------------------------------------------------------
      if(Fibo_Level_0>Fibo_Level_1)
        {

         //вызов функции расчёта уровня 78.6
         double Fibo_78_Up = Function_Up(Fibo_Level_0, Fibo_Level_1);
         //Изменение имени объекта
         bool l =  StringSetLength(      //Устанавливает для  строки указанную длину в символах 2
                      n,       // строка
                      2    // новая длина строки
                   );
         //-----------------------------------------------------------
         int N = 1;
         string q;

         for(int e = 1; N != 0; e++) // пока N не == 0, гоняем функцию StringCompare. сравнивая обрезанную переменную(StringSetLength) с массивом NameFibo[]
           {
            N= StringCompare(
                  n,              // первая сравниваемая строка
                  NameFibo[e],    // вторая сравниваемая строка
                  true      // режим учета регистра букв при сравнении
               );

            q= NameFibo[e];
            Frame= TimeFrame[e];
           }
         string New_N =Num[G];
         string r= New_N+q+NameFiboUp[UP];


         //--------------------------------------------------------------------
         FiboUp[UP][1]=1;    // Тип обектов 1 == FiboUp
         FiboUp[UP][2]=UP;     // Нумерация обектов FiboUp по типу
         FiboUp[UP][3]=Fibo_78_Up;   // 78.6%
         FiboUp[UP][4]=Frame;       // Тайм фрейм
         FiboUp[UP][5]=0;         // 50%

         //----------------------------------------------------------------------------------------------------------

         bool  F =ObjectSetString(0,Name_Static,OBJPROP_NAME,r);

         UP++;
        }
      //----------------------------------------------------------------------------------
      else
        {
         //вызов функции расчёта уровня 78.6
         double Fibo_78_Down = Function_Down(Fibo_Level_0, Fibo_Level_1);
         //Изменение имени объекта
         bool l =  StringSetLength(      //Устанавливает для  строки указанную длину в символах 2
                      n,       // строка
                      2    // новая длина строки
                   );
         //-----------------------------------------------------------
         int N = 1;
         string q;


         for(int e = 1; N != 0; e++) // пока N не == 0, гоняем функцию StringCompare. сравнивая обрезанную переменную(StringSetLength) с массивом NameFibo[]
           {
            N= StringCompare(
                  n,              // первая сравниваемая строка
                  NameFibo[e],    // вторая сравниваемая строка
                  true      // режим учета регистра букв при сравнении
               );

            q= NameFibo[e];
            Frame= TimeFrame[e];


           }
         string New_N =Num[G];
         string r= New_N+q+NameFiboDown[Down];

         //-------------------------------------------------------------------
         FiboDown[Down][1]=2;    // // Тип обектов 2 == FiboDown
         FiboDown[Down][2]=Down;     // Нумерация обектов  по типу
         FiboDown[Down][3]=Fibo_78_Down;   // 78.6%
         FiboDown[Down][4]=Frame;       // Тайм фрейм
         FiboDown[Down][5]=0;         // 50%
         //------------------------------------------------------------------
         //Изменение имени объекта
         bool  F =ObjectSetString(0,Name_Static,OBJPROP_NAME,r);
         Down++;
        }
     }
//+------------------------------------------------------------------+
   ArrayPrint(
      FiboUp,             // выводимый массив
      6,      // количество десятичных знаков после запятой
      NULL,      // разделитель между значениями полей структуры
      0,             // индекс первого выводимого элемента
      WHOLE_ARRAY,   // количество выводимых элементов
      ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_ALIGN
   );

   ArrayPrint(
      FiboDown,             // выводимый массив
      6,      // количество десятичных знаков после запятой
      NULL,      // разделитель между значениями полей структуры
      0,             // индекс первого выводимого элемента
      WHOLE_ARRAY,   // количество выводимых элементов
      ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_ALIGN
   );

  }
// for(int i=0; i<ArraySize(Koll); i++)
//  printf("Koll[%d] = %d",i,Koll[i]);


//------------------------------------------------------------------------------------------------------

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
double Function_Up(double a, double b)    // имя функции и список параметров
  {
   double Sum_100 = a - b; //Вычисляем 100% В пунктах от точек построения фибо
   double Sum_78  = Sum_100 * 78.6 / 100;  //Вычисляем 78.6% В пунктах
   return (Sum_78 + b);           // Вычисляем 78.6% в цене инструмента
  }
//+------------------------------------------------------------------+
double Function_Down(double a, double b)    // имя функции и список параметров
  {
   double Sum_100 = b - a ; //Вычисляем 100% В пунктах от точек построения фибо
   double Sum_78  = Sum_100 * 21.4 / 100;  //Вычисляем 78.6% В пунктах
   return (Sum_78 + a);           // Вычисляем 78.6% в цене инструмента
  }
//+------------------------------------------------------------------+

Происходит перебор объектов в порядке создания объектов с изменением имён для сохранения порядка создания в списке, и запись характеристик и уровней объектов в массивы в порядке создания этих объектов как в списке.   Первый проход кода, сохраняя порядок создания объектов в списке модифицирует имена, дополняя характеристиками для ориентации при создании критериев и сохраняя порядок в списке объектов для правильной дальнейшей выборки путём перебора по порядку на случай смены координат объектов, и правильной перезаписи массивов в порядке первого заполнения.


Пока на первом проходе логика сохраняется)))

 
Kira27:

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


Пока нашёл такой способ, создаём 4 объекта фибо   В списке сохранён порядок создания, нумеруем их для обработки по порядку создания   Запускаем советник 

Происходит перебор объектов в порядке создания объектов с изменением имён для сохранения порядка создания в списке, и запись характеристик и уровней объектов в массивы в порядке создания этих объектов как в списке.   Первый проход кода, сохраняя порядок создания объектов в списке модифицирует имена, дополняя характеристиками для ориентации при создании критериев и сохраняя порядок в списке объектов для правильной дальнейшей выборки путём перебора по порядку на случай смены координат объектов, и правильной перезаписи массивов в порядке первого заполнения.


Пока на первом проходе логика сохраняется)))

Всё было бы куда проще если бы за объектами негласно закреплялся бы номер в списке объектов соответствующий порядку создания.

 
Nikolay Kositsin:
Народ, кто в курсе, занялся зарисовками с использованием с использованием класса CCanvas. И какую-то совсем неведомую проблему обнаружил. Залитые фоном прямоугольники и круги рисуются нормально, а вот все мои попытки нарисовать окружность закончились полным провалом. В коде три варианта окружностей и никакого результата по их вытаскиванию на график. Этот код для окружностей рабочий, или в нём чего-то не хватает?
Nikolai Semko:
Работали всегда.
Что-то не так делаете.

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

CircleAA лучше не использовать - очень медленный алгоритм. 

Файлы:
 
Kira27:

Всё было бы куда проще если бы за объектами негласно закреплялся бы номер в списке объектов соответствующий порядку создания.

А время создания объекта (используйте как тип ulong) OBJPROP_CREATETIME разве не является идентификатором порядка создания объекта?
 
Kira27:

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


Пока нашёл такой способ, создаём 4 объекта фибо   В списке сохранён порядок создания, нумеруем их для обработки по порядку создания   Запускаем советник 

Происходит перебор объектов в порядке создания объектов с изменением имён для сохранения порядка создания в списке, и запись характеристик и уровней объектов в массивы в порядке создания этих объектов как в списке.   Первый проход кода, сохраняя порядок создания объектов в списке модифицирует имена, дополняя характеристиками для ориентации при создании критериев и сохраняя порядок в списке объектов для правильной дальнейшей выборки путём перебора по порядку на случай смены координат объектов, и правильной перезаписи массивов в порядке первого заполнения.


Пока на первом проходе логика сохраняется)))

Ваш вопрос решается на «раз». Достаточно написать переименование создаваемых объектов.

/*******************Expert initialization function*******************/
int OnInit()
 {
  ChartSetInteger(ChartID(), CHART_EVENT_OBJECT_CREATE, true);
  return(INIT_SUCCEEDED);
 }/******************************************************************/


/***********************OnChartEvent function************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
 {
  if(id == CHARTEVENT_OBJECT_CREATE)
   {
    string result[];      //  массив для получения строк
    StringSplit(sparam, ' ', result); //  получим из имени созданного объекта подстроки
    ulong timeCreate = ObjectGetInteger(0, sparam, OBJPROP_CREATETIME); //  получим время создания объекта
    string newName = result[0]+" "+result[1]+" "+string(timeCreate); //  сформируем новое имя объекта
    ObjectSetString(0, sparam, OBJPROP_NAME, newName);  //  переименуем объект
   }
 }/******************************************************************/

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

Файлы:
000.mq5  5 kb
 
Всем привет! Подскажите малограмотному "программисту", что добавить в код индикатора на mql4, чтобы наложить гистограмму на график инструмента в определённом месте? Также желательно, чтобы гистограмма была полупрозрачной, чтобы не закрывала график. В прикреплённом файле   (не знаю как вставить в сообщение картинкой) показал, как это  примерно должно  выглядеть. 
Документация по MQL5: Операции с графиками / ChartClose
Документация по MQL5: Операции с графиками / ChartClose
  • www.mql5.com
ChartClose - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Файлы:
 
Alexey Viktorov:

Ваш вопрос решается на «раз». Достаточно написать переименование создаваемых объектов.


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

Спасибо огромное!!!   Не полностью читал про эти Функции обработки событий, упрощают житуху прогеру)

 
Artyom Trishkin:
А время создания объекта (используйте как тип ulong) OBJPROP_CREATETIME разве не является идентификатором порядка создания объекта?

Да!  Спасибо!!!

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