Errores, fallos, preguntas - página 2916

 
Kira27:

Lo tengo! Como los nombres son idénticos, se selecciona la primera cifra más pequeña del número y es el 4º objeto, entonces como los 2 primeros objetos tienen una 4ª cifra, se selecciona la cifra más pequeña que sigue a la 4ª de los 2 primeros objetos.

A100:

Sí, sólo la conversión inversa no se puede hacer. Asignar números aleatorios a los objetos es como llamar al lenguaje MQL831 en lugar de MQL5.

En mi opinión, para procesar los objetos en el orden de su creación manualmente, hay que numerar los nombres después de todos ellos o durante el proceso de creación de cada uno de ellos y luego ejecutar el robot para procesar y escribir el array manteniendo la numeración de creación en los nombres. Esto permitirá ordenar correctamente los objetos de la lista en el futuro como en la funciónObjectName y otras similares, en el ordende creación de los objetos manualmente.

 
Kira27:

En mi opinión, para procesar los objetos en orden de creación manualmente, necesitamos o bien numerar los nombres después de que todos los objetos hayan sido creados o durante el proceso de creación de cada uno, y luego encender el robot, que procese y escriba un array manteniendo la numeración de creación en los nombres. En el futuro, esto permitirá seleccionar adecuadamente los objetos de la lista, tanto a través de la función ObjectName como de otras similares, en el ordende creación de los objetos manualmente.

¿Por qué no utilizar ObjectGetInteger() con el identificador de propiedad OBJPROP_CREATETIME?

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

¿Qué me impide utilizar ObjectGetInteger() con la propiedad ID OBJPROP_CREATETIME?

La idea es que quiero que todo lo que dibuje en el gráfico se escriba en el nombre de los objetos, incluyendo la numeración de la creación de los objetos en la lista, en el orden de creación, el timeframe, el tipo de nivel de Fibo y el número de serie del tipo de nivel de Fibo, a la vez que se escriben arrays con los datos de estos niveles en el orden en que se enumeran. Luego crearemos los criterios para las acciones comerciales por estos nombres y datos en arrays correspondientes al orden de creación de estos objetos.


Hasta ahora, he encontrado esta manera: creamos 4 objetos Fibo En la lista, se guarda el orden de creación, los numeramos para procesarlos según el orden de creación Ejecutar el Asesor Experto

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

Recorremos los objetos en el orden de su creación con cambio de nombres para mantener el orden de creación en la lista, y escribimos características y niveles de objetos en arrays en el orden de su creación como en la lista. La primera pasada de código, manteniendo el orden de creación de los objetos en la lista modifica los nombres, complementando con características para la orientación al crear criterios y manteniendo el orden en la lista de objetos para la correcta selección posterior pasando por el orden en caso de cambio de coordenadas de los objetos, y la correcta sobreescritura de las matrices en el orden de primer llenado.


Hasta ahora, la lógica se guarda en la primera pasada))

 
Kira27:

La cuestión es que quiero que todo lo que dibuje en el gráfico se escriba con el nombre de los objetos, incluyendo la numeración de los objetos en la lista, por orden de creación, el timeframe, el tipo de nivel Fibo y el número de serie del tipo de nivel Fibo, escribiendo paralelamente arrays con los datos de estos niveles en el orden de los objetos en la lista de objetos del gráfico. Luego crearemos los criterios para las acciones comerciales por estos nombres, y los datos en arrays correspondientes al orden de creación de estos objetos.


Hasta ahora, he encontrado el siguiente método. Creamos 4 objetos Fibo en la lista en el orden de su creación, los numeramos para el procesamiento de acuerdo con el orden de creación Lanzar Asesor Experto

La primera pasada del código, manteniendo el orden de los objetos en la lista, modifica los nombres de los objetos para mantener el orden de su creación y registrar características y niveles en arrays en el orden de creación de estos objetos como en la lista. La primera pasada del código, manteniendo el orden de los objetos en la lista, modifica los nombres, añadiendo características para orientarse al crear criterios y manteniendo el orden en la lista de objetos para una correcta selección posterior intentando cambiar el orden de las coordenadas de los objetos y sobrescribiendo correctamente los arrays en la primera pasada


Mientras que en la primera pasada, la lógica se guarda))

Todo sería mucho más sencillo si los objetos tuvieran un número en la lista de objetos que correspondiera al orden de creación.

 
Nikolay Kositsin:
La gente que es consciente de esto, se ha puesto a dibujar con la clase CCanvas. Y he descubierto un problema totalmente desconocido. Los rectángulos y círculos de fondo rellenos se dibujan bien, pero todos mis intentos de dibujar un círculo han terminado en un completo fracaso. Hay tres variantes de círculos en el código y ningún resultado de dibujarlos en el gráfico. ¿Funciona este código para los círculos o falta algo?
Nikolai Semko:
Siempre ha funcionado.
Estás haciendo algo mal.

Sí, todo funciona.
Prueba este script. Dibuja en tres algoritmos Círculo, CírculoAA y CírculoWu círculos de radios, color y transparencia aleatorios

Es mejor no utilizarCircleAA: es un algoritmo muy lento.

Archivos adjuntos:
 
Kira27:

Sería mucho más fácil si a los objetos se les asignara tácitamente un número en la lista de objetos correspondiente al orden en que fueron creados.

¿No es la hora de creación del objeto (utilice OBJPROP_CREATETIME como tipo ulong) un identificador del orden de creación del objeto?
 
Kira27:

La cuestión es que quiero que todo lo que dibuje en el gráfico se escriba con el nombre de los objetos, incluyendo la numeración de los objetos en la lista, en orden de creación, timeframe, tipo de nivel de Fibo y número de serie del tipo de nivel de Fibo, escribiendo paralelamente arrays con los datos de estos niveles en el orden de los objetos en la lista de objetos del gráfico. Luego crearemos los criterios para las acciones comerciales por estos nombres, y los datos en arrays correspondientes al orden de creación de estos objetos.


Hasta ahora, he encontrado el siguiente método. Creamos 4 objetos Fibo en la lista en el orden de su creación, los numeramos para su procesamiento de acuerdo con el orden de creación Ejecutar el Asesor Experto

La primera pasada del código, manteniendo el orden de los objetos en la lista, modifica los nombres de los objetos para mantener el orden de su creación y registrar las características y los niveles en arrays en el orden de creación de estos objetos como en la lista. La primera pasada del código, manteniendo el orden de los objetos en la lista, modifica los nombres, añadiendo características para la orientación en la creación de criterios y manteniendo el orden en la lista de objetos para la correcta selección posterior intentando cambiar el orden de las coordenadas de los objetos y sobrescribir correctamente los arrays en la primera pasada


Mientras que en la primera pasada, la lógica se conserva)))

Su pregunta está resuelta en "una vez". Basta con escribir el cambio de nombre de los objetos creados.

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

Ahora, cada vez que cree un objeto gráfico en el gráfico con un Asesor Experto instalado, los nombres de los objetos tendrán la hora de creación en lugar de un número aleatorio en el nombre y se ordenarán estrictamente en la secuencia de creación.

Archivos adjuntos:
000.mq5  5 kb
 
Hola a todos! ¿Pueden aconsejar a un "programador" analfabeto qué añadir al código del indicador en mql4, para superponer el histograma en el gráfico de un instrumento en un lugar determinado? También es deseable que el histograma sea semitransparente, para que no cubra el gráfico. En el archivo adjunto (no sé cómo adjuntarlo al mensaje como imagen) te he mostrado aproximadamente cómo debería ser.
Документация по MQL5: Операции с графиками / ChartClose
Документация по MQL5: Операции с графиками / ChartClose
  • www.mql5.com
ChartClose - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Archivos adjuntos:
 
Alexey Viktorov:

Su pregunta se resuelve en un instante. Basta con escribir el cambio de nombre de los objetos creados.


Ahora cada vez que cree un objeto gráfico en el gráfico con el Asesor Experto instalado, los nombres de los objetos, en lugar de un número aleatorio, en el nombre tendrán la hora de creación y se ordenarán estrictamente en la secuencia de creación.

Muchas gracias!!! No leer completamente sobre estas Funciones de Manejo de Eventos, simplifica la vida de un proger)

 
Artyom Trishkin:
¿No es el tiempo de creación del objeto (utilizado como tipo ulong) OBJPROP_CREATETIME un identificador del orden de creación del objeto?

¡Sí! ¡Gracias!