错误、漏洞、问题 - 页 2916

 
Kira27:

找到了!由于名字相同,所以选择数字中最小的第一个数字,它是第4个物体,然后由于前2个物体有第4个数字,所以选择前2个物体中第4个之后的最小数字。

A100:

是的,只有逆向转换不能做。将随机数分配给对象就像调用语言MQL831而不是MQL5。

在我看来,为了手动处理对象的创建顺序,你必须在所有对象之后或在每个对象的创建过程中对名称进行编号,然后运行机器人来处理并写入数组,保持名称中的创建编号。 这将允许将来像ObjectName 函数和其他类似函数一样,按照对象的创建 顺序手动对列表中的对象进行正确排序。

 
Kira27:

在我看来,为了手动处理对象的创建顺序,我们需要在所有对象创建后或在每个对象的创建过程中对名称进行编号,然后打开机器人,它处理并写入一个数组,保持名称中的创建编号。 在未来,这将允许从列表中正确选择对象,包括通过ObjectName函数和其他类似函数,手动选择对象创建 顺序。

为什么不使用属性标识符为OBJPROP_CREATETIME的ObjectGetInteger()?

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

是什么阻止了我使用属性ID为OBJPROP_CREATETIME的ObjectGetInteger()?

我的想法是,我希望我在图表上画的所有东西都写在对象的名称中,包括对象创建的编号,按照创建的顺序,时间框架,费波水平类型和费波水平类型序列号,同时按照这些水平数据的顺序写成数组。 然后我们将通过这些名称和数据在与这些对象创建顺序相对应的数组中创建交易行为的标准。


到目前为止,我发现了这种方式:我们创建了4个Fibo对象 在列表中,创建的顺序被保存,根据创建的顺序对它们进行编号处理 运行专家顾问

//+------------------------------------------------------------------+
//|                                                            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个Fibo对象,根据创建顺序对它们进行编号处理 启动专家顾问

第一遍代码,保持列表中对象的顺序,修改对象的名称,保持其创建的顺序,并按照这些对象创建的顺序在数组中记录特征和级别,因为在列表中。 第一遍代码,保持列表中对象的顺序,修改名称,在创建标准时增加特征的定位,并保持对象列表中的顺序,以便通过尝试改变对象坐标的顺序和正确地覆盖数组来进一步正确选择


虽然在第一遍时,逻辑被保存下来了)))

如果对象在对象列表中有一个与创建顺序相对应的编号,一切都会简单得多。

 
Nikolay Kositsin:
意识到这一点的人,已经开始使用CCanvas类画 素描了。而且我发现了一些完全未知的问题。填充背景的矩形和圆形画得很好,但我所有试图画圆的努力都以完全失败告终。在代码中,有三种圆形的变体,在图表中没有画出它们的结果。这段代码对圆圈有效吗,还是有什么遗漏?
尼古拉-塞姆科
,它总是有效。
你做错了什么。

是的,一切正常。
试试这个脚本。它以三种算法绘制随机半径、颜色和透明度的圆、CircleAA和CircleWu圆

CircleAA 最好不要使用--它是一种非常缓慢的算法。

附加的文件:
 
Kira27:

如果这些对象在对象列表中被默许地分配一个与它们被创建的顺序相对应的编号,那就容易多了。

对象创建的时间(使用OBJPROP_CREATETIME作为ulong类型)不是对象创建顺序的标识吗?
 
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不是对象创建顺序的一个标识符吗?

是的!谢谢你!!!。