Errori, bug, domande - pagina 2916

 
Kira27:

Dato che i nomi sono identici, si seleziona la prima cifra più piccola del numero ed è il 4° oggetto, poi, dato che i primi 2 oggetti hanno una 4° cifra, si seleziona la cifra più piccola che segue la 4° dei primi 2 oggetti.

A100:

Sì, solo la conversione inversa non può essere fatta. Assegnare numeri casuali agli oggetti è come chiamare il linguaggio MQL831 invece di MQL5.

Secondo me, per elaborare manualmente gli oggetti nell'ordine della loro creazione, bisogna o numerare i nomi dopo tutti o durante il processo di creazione di ognuno di essi e poi eseguire il robot per elaborare e scrivere l'array mantenendo la numerazione di creazione nei nomi. Questo permetterà in futuro di ordinare correttamente gli oggetti della lista come nella funzioneObjectName e altre simili, nell'ordinedi creazione degli oggetti manualmente.

 
Kira27:

Secondo me, per elaborare manualmente gli oggetti in ordine di creazione, bisogna o numerare i nomi dopo che tutti gli oggetti sono stati creati o durante il processo di creazione di ciascuno, e poi accendere il robot, che elabora e scrive un array mantenendo la numerazione di creazione nei nomi. In futuro, questo permetterà di selezionare correttamente gli oggetti dalla lista, sia attraverso la funzione ObjectName che altre simili, nell'ordinedi creazione degli oggetti manualmente.

Perché non usare ObjectGetInteger() con l'identificatore di proprietà OBJPROP_CREATETIME?

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

Cosa mi impedisce di usare ObjectGetInteger() con la proprietà ID OBJPROP_CREATETIME?

L'idea è che voglio che tutto ciò che disegno sul grafico sia scritto nel nome degli oggetti, compresa la numerazione della creazione dell'oggetto nella lista, nell'ordine di creazione, timeframe, tipo di livello Fibo e numero di serie del tipo di livello Fibo, allo stesso tempo scrivendo array con questi dati di livello nell'ordine in cui sono elencati. Poi creeremo criteri per azioni di trading da questi nomi e dati in array corrispondenti all'ordine di creazione di questi oggetti.


Finora, ho trovato questo modo: creiamo 4 oggetti Fibo Nella lista, l'ordine di creazione è salvato, numerarli per l'elaborazione secondo l'ordine di creazione Eseguire l'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% в цене инструмента
  }
//+------------------------------------------------------------------+

Passiamo attraverso gli oggetti nell'ordine della loro creazione con cambio di nomi per mantenere l'ordine di creazione nella lista, e scriviamo caratteristiche e livelli degli oggetti in array nell'ordine della loro creazione come nella lista. Il primo passaggio di codice, mantenendo l'ordine di creazione degli oggetti nella lista modifica i nomi, integrando con le caratteristiche per l'orientamento durante la creazione dei criteri e mantenendo l'ordine nella lista degli oggetti per una corretta selezione ulteriore passando attraverso l'ordine in caso di cambiamento delle coordinate degli oggetti, e la corretta sovrascrittura degli array nell'ordine di primo riempimento.


Finora, la logica viene salvata al primo passaggio)))

 
Kira27:

Il punto è che voglio che tutto ciò che disegno sul grafico sia scritto nel nome degli oggetti, compresa la numerazione degli oggetti nella lista, in ordine di creazione, timeframe, tipo di livello Fibo e numero seriale del tipo di livello Fibo, in parallelo scrivendo gli array con i dati di questi livelli nell'ordine degli oggetti nella lista degli oggetti grafici. Poi creeremo criteri per azioni di trading con questi nomi, e dati in array corrispondenti all'ordine di creazione di questi oggetti.


Finora, ho trovato il seguente metodo. Creiamo 4 oggetti Fibo nella lista nell'ordine della loro creazione, li numeriamo per l'elaborazione secondo l'ordine di creazione Launch Expert Advisor

Il primo passaggio di codice, mantenendo l'ordine degli oggetti nella lista, modifica i nomi degli oggetti per mantenere l'ordine della loro creazione e registrare caratteristiche e livelli negli array nell'ordine di creazione di questi oggetti come nella lista. Il primo passaggio di codice, mantenendo l'ordine degli oggetti nella lista, modifica i nomi, aggiungendo caratteristiche per l'orientamento durante la creazione dei criteri e mantenendo l'ordine nella lista degli oggetti per una corretta selezione successiva cercando di cambiare l'ordine delle coordinate degli oggetti e sovrascrivendo correttamente gli array nel primo passaggio


Mentre al primo passaggio, la logica viene salvata)))

Tutto sarebbe molto più semplice se gli oggetti avessero un numero nella lista degli oggetti che corrisponde all'ordine di creazione.

 
Nikolay Kositsin:
Le persone che sono consapevoli di questo, hanno iniziato a fare sketch usando la classe CCanvas. E ho scoperto un problema totalmente sconosciuto. I rettangoli e i cerchi di sfondo riempiti vengono disegnati bene, ma tutti i miei tentativi di disegnare un cerchio sono finiti in un completo fallimento. Ci sono tre varianti di cerchi nel codice e nessun risultato di disegnarli sul grafico. Questo codice funziona per i cerchi o manca qualcosa?
Nikolai Semko:
Ha sempre funzionato.
Stai facendo qualcosa di sbagliato.

Sì, tutto funziona.
Prova questo script. Disegna in tre algoritmi Circle, CircleAA e CircleWu cerchi di raggio, colore e trasparenza casuali

CircleAA è meglio non usarlo - è un algoritmo molto lento.

File:
 
Kira27:

Sarebbe molto più facile se agli oggetti fosse tacitamente assegnato un numero nella lista degli oggetti corrispondente all'ordine in cui sono stati creati.

Il tempo di creazione dell'oggetto (usare OBJPROP_CREATETIME come tipo ulong) non è un identificatore dell'ordine di creazione dell'oggetto?
 
Kira27:

Il punto è che voglio che tutto ciò che disegno sul grafico sia scritto nel nome degli oggetti, compresa la numerazione degli oggetti nella lista, in ordine di creazione, timeframe, tipo di livello Fibo e numero seriale del tipo di livello Fibo, in parallelo scrivendo gli array con i dati di questi livelli nell'ordine degli oggetti nella lista degli oggetti grafici. Poi creeremo criteri per azioni di trading con questi nomi, e dati in array corrispondenti all'ordine di creazione di questi oggetti.


Finora, ho trovato il seguente metodo. Creiamo 4 oggetti Fibo nella lista nell'ordine della loro creazione, li numeriamo per l'elaborazione secondo l'ordine di creazione Esegui l'Expert Advisor

Il primo passaggio di codice, mantenendo l'ordine degli oggetti nella lista, modifica i nomi degli oggetti per mantenere l'ordine della loro creazione e registrare caratteristiche e livelli negli array nell'ordine di creazione di questi oggetti come nella lista. Il primo passaggio di codice, mantenendo l'ordine degli oggetti nella lista, modifica i nomi, aggiungendo caratteristiche per l'orientamento quando si creano i criteri e mantenendo l'ordine nella lista degli oggetti per una corretta selezione successiva cercando di cambiare l'ordine degli oggetti in caso di cambio di coordinate e corretta sovrascrittura degli array nell'ordine del primo passaggio


Mentre nel primo passaggio, la logica è conservata)))

La tua domanda è risolta su "una volta". È sufficiente scrivere la ridenominazione degli oggetti creati.

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

Ora ogni volta che si crea un oggetto grafico sul grafico con un Expert Advisor installato, i nomi degli oggetti avranno il tempo di creazione invece di un numero casuale nel nome e saranno ordinati rigorosamente nella sequenza di creazione.

File:
000.mq5  5 kb
 
Ciao a tutti, potete consigliare a un "programmatore" analfabeta cosa aggiungere al codice dell'indicatore in mql4, per sovrapporre l'istogramma sul grafico di uno strumento in un certo punto? È anche auspicabile che l'istogramma sia semitrasparente, in modo che non copra il grafico. Nel file allegato (non so come allegarlo al messaggio come immagine) vi ho mostrato approssimativamente come dovrebbe essere.
Документация по MQL5: Операции с графиками / ChartClose
Документация по MQL5: Операции с графиками / ChartClose
  • www.mql5.com
ChartClose - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
File:
 
Alexey Viktorov:

La tua domanda è risolta in un attimo. È sufficiente scrivere la ridenominazione degli oggetti creati.


Ora ogni volta che si crea un oggetto grafico sul grafico con l'Expert Advisor installato, i nomi degli oggetti, invece di un numero casuale, nel nome avranno il tempo di creazione e saranno ordinati rigorosamente nella sequenza di creazione.

Grazie mille!!! Non ho letto completamente queste funzioni di gestione degli eventi, semplificano la vita di un proger)

 
Artyom Trishkin:
Il tempo di creazione dell 'oggetto (usato come tipo ulong) OBJPROP_CREATETIME non è un identificatore dell'ordine di creazione dell'oggetto?

Sì, grazie!!!

Motivazione: