MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1099

 
Igor Makanu:

メモリ配置は 例1、例2

例2は宣言と初期化の両方、例1は宣言のみ

すでにもっと明確なことがヘルプに書かれていたかもしれません。クラスで静的計算をしているので、new演算子でオブジェクトを作る必要がないため、すぐに宣言しました。

つまり、クラスを宣言し、配列を宣言して、その配列にクラスへのポインタを格納したいのですが、可能でしょうか、それとも不可能でしょうか?

 
Seric29:

クラスを宣言して、配列を宣言して、その配列にクラスへのポインタを格納したいのですが、可能でしょうか、不可能でしょうか?

を何度も何度もクラスは、まず第一に、int、double...のようなデータ型である。

このデータ型の配列が欲しいのですか?- 配列を宣言 し,配列が動的な場合はサイズを変更し,必要なデータで各要素を初期化する - ポインタが必要なら,クラスへのポインタで初期化し,クラスのインスタンスが必要なら,配列の各要素はポインタではなくオブジェクト自体となる

それがOOPの本質で、どんなクラスもまずユーザーデータ型なんです......。しかし、新しいインスタンスの初期化は必ずコンストラクタから始まり、そのコンストラクタはデフォルトで、パラメータ付きでもパラメータなしでも、オブジェクトをどのように初期化するかを選択できるようになっています。

 
Igor Makanu:

通常は、一番外側の上下の注文を建値で判断し、何らかの値を加えて新しい価格を求め、このレベル条件を破ったときに監視して新規注文を出すか、あるいはすぐに最大注文数を目指して保留注文を グリッド状に配置し、このグリッドをトレースします。

ご興味をお持ちいただきありがとうございます。しかし、私が言いたかったのは、チャートの点線のグリッドのことです。


mt4とmt5でグリッドの水平レベルがどのように計算されるか教えてください。 固定スケールなしでチャートをスクロール させると、mt4とmt5少し違った 形でシフト します。多分、誰かがどのように計算されているか知っているので、私はインデントやバインディングなどで推測する必要はありません。

 
Andrey Sokolov:

すれ違わなくてありがとうございます。でも、そんなことより、チャートの点線グリッドの話です。


mt4とmt5のグリッドの水平レベルの計算方法を教えてください。 スケールが固定でない場合、チャートをスクロールするとずれるのですが、mt4とmt5で少しずれが 違います。多分、誰かが計算方法を知っているので、私はインデントやバインディングなどで推測する必要はありません。

画面の解像度に応じて、ウィンドウを均等に分割して表示するだけです。

MT4とMT5の両方で縦に15分割しています。

 
Igor Makanu:

を何度も何度もクラスは、まず第一に、int、double...のようなデータ型である。

その型のデータの配列が欲しいのか?- 配列を宣言 し,配列が動的な場合はサイズを変更し,必要なデータで各要素を初期化する - ポインタが必要なら,クラスへのポインタで初期化し,クラスインスタンスが必要なら,配列の各要素はポインタではなく,オブジェクト自体になります.

それがOOPの本質で、どんなクラスもまずユーザーデータ型なんです......。どこまで言っていいのかわかりませんが、方法論は通常のデータ型と同じで、クラスの中に何を書くかは個人の問題ですが、新しいインスタンスの初期化は必ずコンストラクタから始まり、どのコンストラクタで-デフォルトで、パラメータあり、パラメータなしで-オブジェクトを初期化するか選択できます...うう、それでも本を読めば、この方法でやるしかないのです。

配列の作成時に型を指定する必要があり、異なるクラスのポインタを1つの配列に保存したいので、配列が異なる型やmqlの雑多なものにならないため、うまくいかないのだとわかりました。だから、私のアイデアはここでは通用しないのです。

 
Seric29:

はい、私はあなたが配列を作成するとき、プログラムはあなたが型を指定する必要があるため、これは不可能であることを実現し、私は1つの配列で異なるクラスのポインタを保存したいので、配列が異なるタイプまたは品種にすることはできませんので、それは動作しませんmqlで、C + +はそれをしたが、そのように複雑なオブジェクトではありません。だから、私のアイデアはここでは通用しないのです。

すべて完了しました。オブジェクトをベースクラスから継承し、ベースクラスの型を持つ配列を作成するのです。また、継承されたオブジェクトはすべて配列に入れることができます。
 
Artyom Trishkin:
すべて完了しました。オブジェクトをベースクラスから継承し、ベースクラスの型を持つ配列を作成するのです。また、継承されたオブジェクトはすべて配列に入れることができます。

また、最も単純で原始的な例として、2つのクラスがある場合、継承と2つの要素(0ファーストクラス1セカンド)の配列に各クラスへの参照をどのように置くかを示して下さい。

 
Andrey Sokolov:

Makarさん、なぜ明らかに事実と異なることを書くのですか? チャートをスクロールするときに、水平方向のグリッド線の オフセットを変更することができmt4とmt5では若干異なるシフトを します。

そんなことはない!

インジケーターウィンドウがある場合のみシフトし、それ以外の場合はシフトしない。

 
Seric29:

また、最も単純で原始的な例として、2つのクラスをさらに継承し、各クラスへの参照を2つの要素(0番目のクラス1番目のクラス)の配列に置く方法を教えてください。

class CBase{
protected:
   int v;
   public:
                  CBase(): v(0)  {            }
           int    getV()         { return(v); }
   virtual int    calc() = 0;
};

class A:public CBase
{
   public:
   virtual int calc() {return(--v);} //декремент 
};

class B:public CBase
{
   public:
   virtual int calc() {return(++v);} //инкремент
};

//+------------------------------------------------------------------+
void OnStart()
{
// 2 указателя которые инициализируем экземплярами обьектов  A и B
   CBase *arr_base[2];
   arr_base[0] = new A;
   arr_base[1] = new B;
// вызовем 10 раз метод calc() для каждого обьекта   
   for(int j=ArraySize(arr_base)-1; j>=0; j--)
   {
      for(int i=0; i<10; i++)
         {
            arr_base[j].calc();
         }
   }
   
   Print("A.v = ",arr_base[0].getV());
   Print("B.v = ",arr_base[1].getV());
//удалим обьекты   
   for(int j=ArraySize(arr_base)-1; j>=0; j--)
   {
      delete arr_base[j];
   }   
}
//+------------------------------------------------------------------+

2020.03.22 21:21:38.544 tst (EURUSD,H1) A.v = -10

2020.03.22 21:21:38.544 tst (EURUSD,H1) B.v = 10

 
Igor Makanu:

2020.03.22 21:21:38.544 tst (EURUSD,H1) A.v = -10

2020.03.22 21:21:38.544 tst (EURUSD,H1) B.v = 10

ありがとうございます。そして、機能は、仮想の単純なことができない、私はすでに自分自身を実験することになります。