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 ?
2. Возвращает true или false в зависимости от успешности выполнения функции. В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром. [in] Модификатор указанного свойства. Для первого варианта по умолчанию значение модификатора равно 0. Большинство свойств не требуют модификатора...
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;//+------------------------------------------------------------------+intOnInit()
{
//______________________________Массив новых имён с индексацией номеров очерёдности________________________________
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 |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
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.6double 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.6double 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))))
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.
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 ?
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.
/***********************OnChartEvent function************************/voidOnChartEvent(constint id, // идентификатор событияconstlong& lparam, // параметр события типа longconstdouble& dparam, // параметр события типа doubleconststring& 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.
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.
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 ?
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************************/voidOnChartEvent(constint id, // идентификатор событияconstlong& lparam, // параметр события типа longconstdouble& dparam, // параметр события типа doubleconststring& 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); // переименуем объект
}
}/******************************************************************/
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 ?
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
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))))
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.
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 ?
Ça a toujours marché.
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.
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.
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.
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.
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)
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 !!!
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.