오류, 버그, 질문 - 페이지 2916

 
Kira27 :

이해했다! 이름이 동일하기 때문에 숫자에서 가장 작은 첫 번째 숫자가 선택되고 이것이 4번째 개체입니다. 그러면 처음 2개의 개체에 첫 번째 숫자가 4이므로 처음 2개의 개체 중 4개 다음의 작은 숫자가 선택됩니다. . 등.

A100 :

예, 하지만 역변환은 할 수 없습니다. 객체에 난수를 할당하는 것은 MQL5가 아니라 MQL831이라는 언어의 이름을 지정하는 것과 같습니다.

그럼 제가 보기엔 생성된 순서대로 수동으로 개체를 처리하기 위해서는 모든 개체를 생성한 후 또는 각각 생성하는 과정에서 생성된 순서대로 이름에 번호를 매겨야 하는 것 같습니다. 로봇이 어레이를 처리하고 기록하도록 로봇을 켜고 이름에 생성 번호를 유지합니다. 앞으로는 ObjectName 함수와 유사한 기능을 통해 수동으로 개체를 생성하는 순서대로 목록에서 개체를 올바르게 선택할 수 있습니다.

 
Kira27 :

그럼 제가 보기엔 생성된 순서대로 수동으로 개체를 처리하려면 모든 개체를 생성한 후 또는 각각 생성하는 과정에서 생성된 순서대로 이름에 번호를 매겨야 하는 것 같습니다. 로봇이 어레이를 처리하고 기록하도록 로봇을 켜고 이름에 생성 번호를 유지합니다. 앞으로는 ObjectName 함수와 유사한 기능을 통해 수동으로 개체를 생성하는 순서대로 목록에서 개체를 올바르게 선택할 수 있습니다.

속성 식별자 OBJPROP_CREATETIME과 함께 ObjectGetInteger() 를 사용하지 못하는 이유는 무엇입니까?

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

속성 식별자 OBJPROP_CREATETIME과 함께 ObjectGetInteger() 를 사용하지 못하는 이유는 무엇입니까?

결론은 내가 차트에 그리는 모든 것이 목록에 있는 개체의 생성 번호를 포함하여 개체의 이름으로 작성되기를 원한다는 것입니다. 생성 순서, 시간 프레임, fibo 수준 유형 및 그래픽 개체 목록에서 개체가 발견되는 순서대로 이러한 수준의 데이터와 함께 배열을 병렬로 쓰는 fibo 수준 유형의 서수. 그런 다음 거래 행동에 대한 기준은 이러한 이름과 이러한 개체가 생성된 순서에 해당하는 배열의 데이터로 생성됩니다.


그런 방법을 찾는 동안 우리는 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 :

결론은 내가 차트에 그리는 모든 것이 목록에 있는 개체의 생성 번호를 포함하여 개체의 이름으로 작성되기를 원한다는 것입니다. 생성 순서, 시간 프레임, fibo 수준 유형 및 그래픽 개체 목록에서 개체가 발견되는 순서대로 이러한 수준의 데이터와 함께 배열을 병렬로 쓰는 fibo 수준 유형의 서수. 그런 다음 거래 행동에 대한 기준은 이러한 이름과 이러한 개체가 생성된 순서에 해당하는 배열의 데이터로 생성됩니다.


그런 방법을 찾았지만 4개의 fibo 객체를 생성합니다 생성 순서가 목록에 저장되고 생성 순서대로 처리를 위해 번호가 매겨집니다 Expert Advisor 시작

목록의 생성 순서를 유지하기 위해 이름을 변경하여 객체 생성 순서대로 객체를 열거하고, 목록과 같이 객체 생성 순서대로 객체의 특성과 레벨을 배열에 씁니다. 목록의 객체 생성 순서를 유지하는 코드의 첫 번째 패스는 이름을 수정하고, 기준을 생성할 때 방향 특성을 보완하고, 다음과 같은 경우에 순서대로 반복하여 올바른 추가 선택을 위해 객체 목록의 순서를 유지합니다. 객체의 좌표를 변경하고 첫 번째 채우기 순서대로 배열을 올바르게 다시 작성합니다.


첫 번째 패스에서 논리가 유지되는 동안)))

생성 순서에 해당하는 객체 목록의 번호가 암시적으로 객체에 할당된다면 모든 것이 훨씬 간단할 것입니다.

 
Nikolay Kositsin :
아는 사람들 이 CCanvas 클래스를 사용하여 스케치를 시작했습니다. 그리고 전혀 알 수 없는 문제를 발견했습니다. 배경으로 채워진 사각형과 원은 정상적으로 그려지지만, 원을 그리려는 나의 모든 시도는 완전히 실패로 끝났다. 코드에는 세 가지 원 변형이 있으며 차트에서 뽑아도 결과가 없습니다. 서클용 코드가 작동합니까, 아니면 누락된 것이 있습니까?
니콜라이 셈코 :
항상 일했습니다.
당신은 뭔가 잘못하고 있습니다.

예, 모든 것이 작동합니다.
이 스크립트를 시도하십시오. Circle, CircleAA 및 CircleWu의 세 가지 알고리즘을 사용하여 임의의 반지름, 색상 및 투명도로 원을 그립니다.

CircleAA는 사용하지 않는 것이 좋습니다. 매우 느린 알고리즘입니다.

파일:
 
Kira27 :

생성 순서에 해당하는 객체 목록의 번호가 암시적으로 객체에 할당된다면 모든 것이 훨씬 간단할 것입니다.

그리고 객체 생성 시점 (ulong 타입으로 사용) OBJPROP_CREATETIME은 객체 생성 순서의 식별자가 아닙니까?
 
Kira27 :

결론은 내가 차트에 그리는 모든 것이 목록에 있는 개체의 생성 번호를 포함하여 개체의 이름으로 작성되기를 원한다는 것입니다. 생성 순서, 시간 프레임, fibo 수준 유형 및 그래픽 개체 목록에서 개체가 발견되는 순서대로 이러한 수준의 데이터와 함께 배열을 병렬로 쓰는 fibo 수준 유형의 서수. 그런 다음 거래 행동에 대한 기준은 이러한 이름과 이러한 개체가 생성된 순서에 해당하는 배열의 데이터로 생성됩니다.


그런 방법을 찾았지만 4개의 fibo 객체를 생성합니다 생성 순서가 목록에 저장되고 생성 순서대로 처리를 위해 번호가 매겨집니다 Expert Advisor 시작

목록의 생성 순서를 유지하기 위해 이름을 변경하여 객체 생성 순서대로 객체를 열거하고, 목록과 같이 객체 생성 순서대로 객체의 특성과 레벨을 배열에 씁니다. 목록의 객체 생성 순서를 유지하는 코드의 첫 번째 패스는 이름을 수정하고, 기준을 생성할 때 방향 특성을 보완하고, 다음과 같은 경우에 순서대로 반복하여 올바른 추가 선택을 위해 객체 목록의 순서를 유지합니다. 객체의 좌표를 변경하고 첫 번째 채우기 순서대로 배열을 올바르게 다시 작성합니다.


첫 번째 패스에서 논리가 유지되는 동안)))

귀하의 질문은 "하나"에서 해결되었습니다. 생성된 개체의 이름 바꾸기를 작성하는 것으로 충분합니다.

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

이제 Expert Advisor가 설치된 차트에서 그래픽 개체 가 생성될 때마다 임의의 숫자 대신 개체의 이름이 이름에 생성 시간을 가지며 생성 순서에 따라 엄격하게 정렬됩니다.

파일:
000.mq5  5 kb
 
안녕하세요! 문맹 "프로그래머"에게 특정 위치의 기호 차트에 히스토그램을 중첩하기 위해 mql4 표시기 코드에 무엇을 추가해야 하는지 알려주시겠습니까? 또한 히스토그램이 그래프를 가리지 않도록 반투명한 것이 바람직합니다. 첨부파일에서   (나는 메시지에 그림을 삽입하는 방법을 모릅니다) 어떻게 보일지 보여주었습니다.
Документация по MQL5: Операции с графиками / ChartClose
Документация по MQL5: Операции с графиками / ChartClose
  • www.mql5.com
ChartClose - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
파일:
 
Alexey Viktorov :

귀하의 질문은 "하나"에서 해결되었습니다. 생성된 개체의 이름 바꾸기를 작성하는 것으로 충분합니다.


이제 Expert Advisor가 설치된 차트에서 그래픽 개체 가 생성될 때마다 임의의 숫자 대신 개체의 이름이 이름에 생성 시간을 가지며 생성 순서에 따라 엄격하게 정렬됩니다.

정말 감사합니다!!! 나는 이러한 이벤트 처리 함수에 대해 완전히 읽지 않았으며 프로그램의 수명을 단순화합니다)

 
Artyom Trishkin :
그리고 객체 생성 시점 (ulong 타입으로 사용) OBJPROP_CREATETIME은 객체 생성 순서의 식별자가 아닙니까?

예! 감사해요!!!