Erreurs, bugs, questions - page 2916

 
Kira27:

A mon avis, pour traiter les objets dans l'ordre de création manuellement, il faut soit numéroter les noms après que tous les objets aient été créés, soit pendant le processus de création de chacun d'eux, et ensuite mettre en marche le robot, qu'il traite et écrive un tableau en gardant la numérotation de création dans les noms. Dans le futur, cela permettra de sélectionner correctement les objets de la liste, à la fois par la fonction ObjectName et d'autres comme elle, dans l'ordrede création des objets manuellement.

Pourquoi ne pas utiliser ObjectGetInteger() avec l'identifiant de propriété OBJPROP_CREATETIME ?

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

Qu'est-ce qui m'empêche d'utiliser ObjectGetInteger() avec la propriété ID OBJPROP_CREATETIME ?

L'idée est que je veux que tout ce que je dessine sur le graphique soit écrit dans le nom des objets, y compris la numérotation de la création de l'objet dans la liste, dans l'ordre de création, timeframe, type de niveau Fibo et numéro de série du type de niveau Fibo, en même temps que l'écriture des tableaux avec ces données de niveau dans l'ordre où ils sont énumérés. Ensuite, nous allons créer des critères pour les actions de commerce par ces noms et les données dans les tableaux correspondant à l'ordre de création de ces objets.


Jusqu'à présent, j'ai trouvé cette méthode : nous créons 4 objets Fibo Dans la liste, l'ordre de création est sauvegardé, numérotez-les pour le traitement selon l'ordre de création Exécutez le Conseiller Expert

//+------------------------------------------------------------------+
//|                                                            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% в цене инструмента
  }
//+------------------------------------------------------------------+

On parcourt les objets dans l'ordre de leur création en changeant les noms pour garder l'ordre de création dans la liste, et on écrit les caractéristiques et les niveaux des objets dans des tableaux dans l'ordre de leur création comme dans la liste. Le premier passage du code, en gardant l'ordre de création des objets dans la liste, modifie les noms, en les complétant avec des caractéristiques pour l'orientation lors de la création des critères et en gardant l'ordre dans la liste des objets pour une sélection ultérieure correcte en passant par l'ordre en cas de changement des coordonnées de l'objet, et un écrasement correct des tableaux dans l'ordre du premier remplissage.


Jusqu'à présent, la logique est sauvegardée au premier passage))))

 
Kira27:

Le point est que je veux que tout ce que je dessine sur le graphique soit écrit dans le nom des objets, y compris la numérotation des objets dans la liste, dans l'ordre de création, timeframe, type de niveau Fibo et numéro de série du type de niveau Fibo, en parallèle l'écriture des tableaux avec les données de ces niveaux dans l'ordre des objets dans la liste des objets graphiques. Ensuite, nous allons créer des critères pour les actions commerciales par ces noms, et les données dans les tableaux correspondant à l'ordre de création de ces objets.


Jusqu'à présent, j'ai trouvé la méthode suivante. Nous créons 4 objets Fibo dans la liste dans l'ordre de leur création, les numérotons pour le traitement selon l'ordre de création Lancer Expert Advisor

La première passe du code, gardant l'ordre des objets dans la liste, modifie les noms des objets pour garder l'ordre de leur création et enregistre les caractéristiques et les niveaux dans des tableaux dans l'ordre de création de ces objets comme dans la liste. La première passe du code, gardant l'ordre des objets dans la liste, modifie les noms, ajoute les caractéristiques pour l'orientation lors de la création des critères et garde l'ordre dans la liste des objets pour une sélection ultérieure correcte en essayant de changer l'ordre des coordonnées des objets et en écrasant correctement les tableaux dans la première passe.


Alors qu'au premier passage, la logique est sauve)))

Tout serait beaucoup plus simple si les objets avaient un numéro dans la liste des objets qui correspond à l'ordre de création.

 
Nikolay Kositsin:
Les personnes qui en sont conscientes se sont mises à dessiner en utilisant la classe CCanvas. Et j'ai découvert un problème totalement inconnu. Les rectangles et les cercles remplis sont bien dessinés, mais toutes mes tentatives pour dessiner un cercle se sont soldées par un échec total. Il y a trois variantes de cercles dans le code et aucun résultat pour les dessiner sur le graphique. Ce code fonctionne-t-il pour les cercles ou y a-t-il quelque chose qui manque ?
Nikolai Semko:
Ça a toujours marché.
Tu fais quelque chose de mal.

Oui, tout fonctionne.
Essayez ce script. Il dessine en trois algorithmes des cercles Circle, CircleAA et CircleWu de rayon, de couleur et de transparence aléatoires.

Il est préférable de ne pas utiliserCircleAA- c'est un algorithme très lent.

Dossiers :
 
Kira27:

Ce serait beaucoup plus facile si on attribuait tacitement aux objets un numéro dans la liste des objets correspondant à l'ordre dans lequel ils ont été créés.

L'heure de création de l'objet (utiliser OBJPROP_CREATETIME comme type ulong) n'est-elle pas un identifiant de l'ordre de création de l'objet ?
 
Kira27:

Le point est que je veux que tout ce que je dessine sur le graphique soit écrit dans le nom des objets, y compris la numérotation des objets dans la liste, dans l'ordre de création, timeframe, type de niveau Fibo et numéro de série du type de niveau Fibo, en parallèle l'écriture des tableaux avec les données de ces niveaux dans l'ordre des objets dans la liste des objets graphiques. Ensuite, nous allons créer des critères pour les actions commerciales par ces noms, et les données dans les tableaux correspondant à l'ordre de création de ces objets.


Jusqu'à présent, j'ai trouvé la méthode suivante. Nous créons 4 objets Fibo dans la liste dans l'ordre de leur création, nous les numérotons pour les traiter selon l'ordre de création Exécuter le Conseiller Expert

La première passe du code, gardant l'ordre des objets dans la liste, modifie les noms des objets pour garder l'ordre de leur création et enregistre les caractéristiques et les niveaux dans les tableaux dans l'ordre de création de ces objets comme dans la liste. La première passe du code, gardant l'ordre des objets dans la liste, modifie les noms, ajoute les caractéristiques pour l'orientation lors de la création des critères et garde l'ordre dans la liste des objets pour une sélection ultérieure correcte en essayant de changer l'ordre des objets en cas de changement de coordonnées et un écrasement correct des tableaux dans l'ordre de la première passe.


Alors qu'au premier passage, la logique est préservée))))

Votre question est résolue sur "une fois". Il suffit d'écrire le renommage des objets créés.

/*******************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);  //  переименуем объект
   }
 }/******************************************************************/

Maintenant, chaque fois que vous créez un objet graphique sur le graphique avec un conseiller expert installé, les noms des objets auront l'heure de création au lieu d'un nombre aléatoire dans le nom et seront triés strictement dans la séquence de création.

Dossiers :
000.mq5  5 kb
 
Bonjour à tous ! Pouvez-vous conseiller un "programmeur" analphabète sur ce qu'il faut ajouter au code de l'indicateur dans mql4, pour superposer l'histogramme sur le graphique d'un instrument à un certain endroit ? Il est également souhaitable que l'histogramme soit semi-transparent, afin qu'il ne recouvre pas le graphique. Dans le fichier joint (je ne sais pas comment l'attacher au message en tant qu'image), je vous ai montré approximativement à quoi cela devrait ressembler.
Документация по MQL5: Операции с графиками / ChartClose
Документация по MQL5: Операции с графиками / ChartClose
  • www.mql5.com
ChartClose - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Dossiers :
 
Alexey Viktorov:

Votre question est résolue en un clin d'œil. Il suffit d'écrire le renommage des objets créés.


Maintenant, chaque fois que vous créez un objet graphique sur le graphique avec le conseiller expert installé, les noms des objets, au lieu d'un nombre aléatoire, dans le nom auront l'heure de création et seront triés strictement dans la séquence de création.

Merci beaucoup !!! Pas entièrement lu sur ces fonctions de gestion d'événements, simplifier la vie d'un proger)

 
Artyom Trishkin:
Le temps de création de l'objet (utilisé comme type ulong) OBJPROP_CREATETIME n'est-il pas un identifiant de l'ordre de création de l'objet ?

Oui ! Merci !!!

 
Kira27:

Merci beaucoup ! !! Je n'ai pas encore tout lu sur ces fonctions de gestion d'événements, cela rend la vie plus facile pour le proger).

Il suffit de faire attention aux noms des objets lors de leur création. Dans mon cas, le nom est composé de 3 sous-chaînes avec un espace. Et il n'y a pas de contrôle pour cela. Si vous créez un nom d'objet composé de 2, par exemple substring, ou pire encore, sans espace, alors nous obtenons une erreur critique et l'EA sera déchargée. Et cela peut arriver si l'objet est créé par un autre programme (autre EA ou indicateur). Donc si vous devez faire une vérification du nom pour éviter de telles erreurs.

Ou supprimez l'ancien nom et ajoutez votre propre préfixe.

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