Fehler, Irrtümer, Fragen - Seite 2916

 
Kira27:

Da die Namen identisch sind, wird die kleinste erste Ziffer der Zahl ausgewählt, die das vierte Objekt ist, und da die ersten beiden Objekte eine vierte Ziffer haben, wird die kleinste Ziffer nach der vierten der ersten beiden Objekte ausgewählt.

A100:

Ja, nur die umgekehrte Umwandlung kann nicht durchgeführt werden. Die Zuweisung von Zufallszahlen an Objekte ist so, als würde man die Sprache MQL831 statt MQL5 nennen.

Um die Objekte in der Reihenfolge ihrer Erstellung manuell zu verarbeiten, müssen Sie meiner Meinung nach entweder die Namen nach allen oder während des Prozesses der Erstellung jedes einzelnen Objekts nummerieren und dann den Roboter laufen lassen, um das Array zu verarbeiten und zu schreiben, wobei die Nummerierung der Erstellung in den Namen beibehalten wird.

 
Kira27:

Meiner Meinung nach müssen wir, um Objekte in der Reihenfolge ihrer Erstellung manuell zu bearbeiten, entweder die Namen nummerieren, nachdem alle Objekte erstellt wurden, oder bei der Erstellung jedes Objekts und dann den Roboter einschalten, damit er ein Array verarbeitet und schreibt, das die Nummerierung der Erstellung in den Namen beibehält. In Zukunft wird dies ermöglichen, Objekte aus der Liste richtig auszuwählen, sowohl durch die ObjectName-Funktion als auch durch andere ähnliche Funktionen, in der Reihenfolgeder manuellerstellten Objekte.

Warum nicht ObjectGetInteger() mit der Eigenschaftskennung OBJPROP_CREATETIME verwenden?

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

Was hindert mich daran, ObjectGetInteger() mit der Eigenschafts-ID OBJPROP_CREATETIME zu verwenden?

Die Idee ist, dass ich möchte, dass alles, was ich auf dem Chart zeichne, im Namen von Objekten geschrieben wird, einschließlich der Nummerierung der Objekterstellung in der Liste, in der Reihenfolge der Erstellung, des Zeitrahmens, des Fibo-Level-Typs und der Seriennummer des Fibo-Level-Typs, gleichzeitig schreiben wir Arrays mit diesen Level-Daten in der Reihenfolge, in der sie aufgelistet sind. Dann werden wir Kriterien für Handelsaktionen durch diese Namen und Daten in Arrays entsprechend der Reihenfolge der Erstellung dieser Objekte erstellen.


Bisher habe ich diesen Weg gefunden: Wir erstellen 4 Fibo-Objekte In der Liste wird die Reihenfolge der Erstellung gespeichert, nummerieren Sie sie für die Verarbeitung entsprechend der Reihenfolge der Erstellung Führen Sie den Expert Advisor

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

Wir gehen die Objekte in der Reihenfolge ihrer Erstellung durch, wobei wir ihre Namen ändern, um die Reihenfolge der Erstellung in der Liste beizubehalten, und schreiben die Merkmale und Ebenen der Objekte in Arrays in der Reihenfolge ihrer Erstellung wie in der Liste. Der erste Durchlauf des Codes, der die Reihenfolge der Erstellung von Objekten in der Liste beibehält, ändert die Namen, ergänzt mit Merkmalen zur Orientierung bei der Erstellung von Kriterien und behält die Reihenfolge in der Liste der Objekte für eine korrekte weitere Auswahl bei, indem er die Reihenfolge im Falle einer Änderung der Objektkoordinaten durchgeht, und das korrekte Überschreiben von Arrays in der Reihenfolge der ersten Befüllung.


Bislang wird die Logik beim ersten Durchgang gespeichert)))

 
Kira27:

Der Punkt ist, dass ich möchte, dass alles, was ich auf dem Chart zeichne, im Namen von Objekten geschrieben wird, einschließlich der Nummerierung von Objekten in der Liste, in der Reihenfolge der Erstellung, des Zeitrahmens, des Typs des Fibo-Levels und der Seriennummer des Fibo-Level-Typs, parallel dazu schreiben wir Arrays mit den Daten dieser Levels in der Reihenfolge der Objekte in der Liste der grafischen Objekte. Dann werden wir Kriterien für Handelsaktionen mit diesen Namen und Daten in Arrays entsprechend der Reihenfolge der Erstellung dieser Objekte erstellen.


Bisher habe ich die folgende Methode gefunden: Wir erstellen 4 Fibo-Objekte in der Liste in der Reihenfolge ihrer Erstellung, nummerieren sie für die Verarbeitung entsprechend der Reihenfolge der Erstellung Führen Sie den Expert Advisor

Der erste Durchlauf des Codes, der die Reihenfolge der Objekte in der Liste beibehält, ändert die Namen der Objekte, um die Reihenfolge ihrer Erstellung beizubehalten, und zeichnet Merkmale und Ebenen in Arrays in der Reihenfolge der Erstellung dieser Objekte wie in der Liste auf.


Während des ersten Durchlaufs wird die Logik gespeichert)))

Alles wäre viel einfacher, wenn den Objekten in der Objektliste implizit eine Nummer zugewiesen würde, die der Reihenfolge entspricht, in der sie erstellt wurden.

 
Nikolay Kositsin:
Leute, die sich dessen bewusst sind, haben das Skizzieren mit der CCanvas-Klasse aufgenommen. Und ich habe ein völlig unbekanntes Problem entdeckt. Gefüllte Hintergrundrechtecke und Kreise werden gut gezeichnet, aber alle meine Versuche, einen Kreis zu zeichnen, endeten in einem kompletten Fehlschlag. Es gibt drei Varianten von Kreisen im Code und kein Ergebnis beim Zeichnen dieser Kreise im Diagramm. Funktioniert dieser Code für Kreise, oder fehlt da etwas?
Nikolai Semko:
Es hat immer funktioniert.
Sie machen etwas falsch.

Ja, alles funktioniert.
Versuchen Sie dieses Skript. Es zeichnet in drei Algorithmen Circle, CircleAA und CircleWu Kreise mit beliebigem Radius, Farbe und Transparenz

CircleAA sollte besser nicht verwendet werden - es ist ein sehr langsamer Algorithmus.

Dateien:
 
Kira27:

Es wäre viel einfacher, wenn den Objekten in der Liste der Objekte stillschweigend eine Nummer zugewiesen würde, die der Reihenfolge entspricht, in der sie erstellt wurden.

Ist der Zeitpunkt der Objekterstellung (verwenden Sie OBJPROP_CREATETIME als ulong-Typ) nicht ein Identifikator für die Reihenfolge der Objekterstellung?
 
Kira27:

Der Punkt ist, dass ich möchte, dass alles, was ich auf dem Chart zeichne, im Namen von Objekten geschrieben wird, einschließlich der Nummerierung von Objekten in der Liste, in der Reihenfolge der Erstellung, des Zeitrahmens, des Typs des Fibo-Levels und der Seriennummer des Fibo-Level-Typs, parallel dazu schreiben wir Arrays mit den Daten dieser Levels in der Reihenfolge der Objekte in der Liste der grafischen Objekte. Dann werden wir Kriterien für Handelsaktionen mit diesen Namen und Daten in Arrays entsprechend der Reihenfolge der Erstellung dieser Objekte erstellen.


Bisher habe ich die folgende Methode gefunden: Wir erstellen 4 Fibo-Objekte in der Liste in der Reihenfolge ihrer Erstellung, nummerieren sie für die Verarbeitung entsprechend der Reihenfolge der Erstellung Führen Sie den Expert Advisor

Der erste Durchlauf des Codes, der die Reihenfolge der Objekte in der Liste beibehält, ändert die Namen der Objekte, um die Reihenfolge ihrer Erstellung beizubehalten, und zeichnet Merkmale und Ebenen in Arrays in der Reihenfolge der Erstellung dieser Objekte wie in der Liste auf.


Beim ersten Durchgang bleibt die Logik erhalten)))

Ihre Frage ist auf "einmal" gelöst. Es reicht aus, die Umbenennung der erstellten Objekte zu schreiben.

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

Jedes Mal, wenn Sie nun ein grafisches Objekt auf dem Chart mit einem installierten Expert Advisor erstellen, werden die Objektnamen die Zeit der Erstellung anstelle einer zufälligen Zahl im Namen tragen und streng in der Reihenfolge der Erstellung sortiert sein.

Dateien:
000.mq5  5 kb
 
Können Sie einem ungebildeten "Programmierer" raten, was er zum Code des Indikators in mql4 hinzufügen muss, um das Histogramm an einer bestimmten Stelle auf dem Chart eines Instruments einzublenden? Es ist auch wünschenswert, dass das Histogramm halbtransparent ist, so dass es das Diagramm nicht verdeckt. In der angehängten Datei (ich weiß nicht, wie ich sie als Bild an die Nachricht anhängen kann) habe ich Ihnen ungefähr gezeigt, wie es aussehen sollte.
Документация по MQL5: Операции с графиками / ChartClose
Документация по MQL5: Операции с графиками / ChartClose
  • www.mql5.com
ChartClose - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Dateien:
 
Alexey Viktorov:

Ihre Frage ist im Handumdrehen gelöst. Es genügt, die Umbenennung der erstellten Objekte zu schreiben.


Jedes Mal, wenn Sie nun ein grafisches Objekt auf dem Chart erstellen, auf dem der Expert Advisor installiert ist, wird der Name des Objekts anstelle einer Zufallszahl den Zeitpunkt der Erstellung enthalten und streng in der Reihenfolge der Erstellung sortiert sein.

Vielen Dank!!! Nicht vollständig gelesen über diese Event-Handling-Funktionen, vereinfachen das Leben eines proger)

 
Artyom Trishkin:
Ist die Objekterstellungszeit (Verwendung als ulong-Typ) OBJPROP_CREATETIME nicht ein Identifikator für den Auftrag zur Objekterstellung?

Ja! Danke!!!