エラー、バグ、質問 - ページ 2916

 
Kira27:

名前が同じなので、数字の1桁目が小さいものを選んで4番目にし、最初の2個は4桁目なので、最初の2個の4桁目に続く小さい数字を選びます。

A100:

はい、逆変換のみはできません。オブジェクトに乱数を割り当てるのは、MQL5ではなくMQL831という言語を呼び出すようなものです。

私見ですが、手動でオブジェクトの作成順に処理するためには、すべてのオブジェクトの後か、それぞれのオブジェクトの作成過程で名前に番号を振って、その名前に作成時の番号をつけたままロボットを動かして処理し配列を書き込む必要があります。 これによって、将来、オブジェクト名 関数などのようにリストからオブジェクトの作成 順に正しくソートして、手動でオブジェクトを 作成することができます。

 
Kira27:

私見ですが、手動でオブジェクトを作成順に処理するためには、すべてのオブジェクトが作成された後、または各オブジェクトの作成中に名前に番号を振って、ロボットの電源を入れ、名前に作成時の番号を保持する配列を処理し書き込む必要があります。 将来的には、オブジェクトの作成 順に手動でオブジェクトをリストから適切に選択できるようにするために、オブジェクト名関数やその他の同様の関数を通して、このような関数が使用できるようになる予定です。

プロパティ識別子OBJPROP_CREATETIMEでObjectGetInteger() を使用しないのはなぜですか?

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

ObjectGetInteger() をプロパティ ID OBJPROP_CREATETIME で使用できない理由は何ですか?

考え方は、チャートに描くものは全てオブジェクトの名前で、オブジェクト作成時のナンバリングも含めて、作成順、タイムフレーム、フィボレベルタイプ、フィボレベルタイプシリアルナンバー、同時にこれらのレベルデータをリスト順に配列で書いて欲しい。 そして、これらのオブジェクトの作成順に対応する配列で、これらの名前とデータによってトレード行動の基準を作成することにする。


これまでのところ、私はこの方法を発見した:我々は4 Fiboオブジェクトを作成する リストでは、作成の順序に従って処理のためにそれらを番号付け、保存されます 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% в цене инструмента
  }
//+------------------------------------------------------------------+

リストの作成順を維持するために名前を変えながらオブジェクトを作成順に見ていき、、オブジェクトの特性やレベルをリストと同様に作成順に配列に書き込んでいきます。 コードの最初のパスは、リスト内のオブジェクトの作成の順序を維持することは、名前を変更し、基準を作成し、オブジェクトの座標の変更の場合に順序を通過することによって正しいさらなる選択のためのオブジェクトのリスト内の順序を維持し、最初の充填の順序で配列の正しい上書きをするときに向きのための特性を補完します。


今のところ、最初のパスでロジックを保存しています)))

 
Kira27:

ポイントは、私はチャート上に描画するすべてのオブジェクトの名前で、作成順、タイムフレーム、フィボレベルタイプとフィボレベルタイプのシリアル番号を含む、並行してこれらのレベルのデータを持つ配列を書くグラフィックオブジェクトのリスト内のオブジェクトの順序で書きたい。 その後、これらの名前で取引行動のための基準を作成し、これらのオブジェクトの作成順に対応する配列にデータを作成することになります。


今のところ、次のような方法を見つけました。 リストに4つのFiboオブジェクトを作成し、作成順に番号を振って処理する。 Expert Advisorを起動する。

コードの最初のパスは、リスト内のオブジェクトの順序を維持し、オブジェクトの名前を変更し、これらのオブジェクトの作成順序で配列に特性とレベルを記録します。 コードの最初のパスは、リスト内のオブジェクトの順序を維持し、名前を変更し、基準の作成時に方向のための特性を追加し、オブジェクトの座標と正しく最初のパスで配列を上書きして順序を変更しようとして、さらに正しく選択するためにオブジェクトリスト内の順序を維持することです


最初のパスで、ロジックを保存している間)))

オブジェクトのリストに、作成順に対応する番号があれば、すべてがもっとシンプルになるはずです。

 
Nikolay Kositsin:
このことを知った人たちは、CCanvasクラスを使って スケッチをするようになりました。そして、まったく未知の問題を発見してしまったのです。背景を塗りつぶした長方形や円はうまく描けるのですが、円を描こうとするとすべて失敗に終わります。コードには3種類の円のバリエーションがあり、チャート上に描画した結果もありません。このコードは円に対して有効ですか?それとも何か足りないものがありますか?
ニコライ・セムコ
いつもうまくいっていました。
やり方が悪いんだ。

はい、すべてうまくいきました。
このスクリプトを試してみてください。ランダムな半径、色、透明度の円をCircle、CircleAA、CircleWuの3つのアルゴリズムで描画します。

CircleAAは 使わないほうがいい - とても遅いアルゴリズムだ。

ファイル:
 
Kira27:

オブジェクトのリストで、作成順に対応した番号が暗黙のうちに割り当てられていれば、かなり楽になりますね。

オブジェクトの作成時刻(ulong型としてOBJPROP_CREATETIMEを使用)は、オブジェクトの作成順序の識別子になりませんか?
 
Kira27:

ポイントは、私はチャート上に描画するすべてのものは、グラフィックオブジェクトのリスト内のオブジェクトの順序で、作成、タイムフレーム、フィボレベルの種類とフィボレベルのタイプのシリアル番号、これらのレベルのデータを持つ配列を並行して書き込みの番号付けなど、オブジェクトの名前で書きたい。 その後、これらの名前で取引行動の基準を作成し、これらのオブジェクトの作成順に対応する配列にデータを作成することになります。


今までのところ、次のような方法を見つけました。 リスト内に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は、オブジェクト作成順序の識別子ではないでしょうか?

はい!ありがとうございます!!!