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

 
私のクラスには、パラメータとしてインジケータパラメータなど、いろいろと無意味なものがあります。一般的には、静的で同じになるもの。では、なぜオブジェクトを作成 するたびにこれらの値を渡さなければならないのでしょうか?
 
STARIJ:

の方が短いのでは? bool barup=... WindowRedraw(); でも実行されます - if から引用しました。

もっと短くすることもできます...私のファイルを参照してください。

ありがとうございます。フィボレベルを描画する間隔を正しく設定するには?もし(時刻が)9時なら、М1の8時から8時59分までのレベルを描くはずだ。
 
Juer:

キンタローは、質問の文がはっきりしていますね。ポイントは、同じものを初期化することです。

まだ存在しないものをどうやって初期化するんだ?オブジェクトが作成された 後、そのオブジェクトは存在し始め、その時に初期化することができます。

オブジェクトにパラメトリックなコンストラクタを作り、必要なパラメータを渡して、新しく作られたオブジェクトを初期化するのに使うのです。

プログラムのOnInit()で必要なデータ(このようなオブジェクトではすべて一定)を入れた構造体を介して、パラメータを渡すことができます。そして、例えばOnTick()などの標準的なハンドラでは、オブジェクトを作成しますが、作成時に次のように記述します。
CMyObject object = new CMyObject(a_here_structure_with_set_parameters).CMyObject object = new CMyObject(a_here_structure_with_set_parameters);

あるいは、オブジェクトのデータがプログラムごとに変化せず、常に同じ値を持つのであれば、上記のIgorの言うように、初期化リストを通してコンストラクタで必要なパラメータを明示的に初期化します。

トレーディング、自動売買システム、ストラテジーテスティングに関するフォーラム

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

イホール・ヘラスコ さん 2018.03.28 17:31

これは、クラスのコンストラクタに ある初期化リストで行われます。

class CCandle
{
   int      m_nA;
   double   m_fB;
   datetime m_dtC;


   void CCandle::CCandle(void);
};

CCandle::CCandle(void)
            : m_nA(0)
            , m_fB(0.0)
            , m_dtC(0)
{
}

 
Artyom Trishkin:

まだ存在しないものをどうやって初期化するんだ?オブジェクトが作成された 後、そのオブジェクトは存在し始め、その時に初期化することができます。

私はすぐにあなたに言いました - オブジェクトをパラメトリックコンストラクタにして、必要なパラメータを渡し、新しく作られたオブジェクトを初期化するために使用するのです。

この構造体には、プログラムの OnInit() で必要なデータ (このようなオブジェクトではすべて一定値) を入れます。そして、例えばOnTick()などの標準的なハンドラで、オブジェクトを作成しますが、作成時に以下のように記述します。
CMyObject object = new CMyObject(a_here_structure_with_set_parameters).CMyObject object = new CMyObject(a_here_structure_with_set_parameters);

はい、そうですか。ありがとうございます。オブジェクトを作成するときに、コンストラクタなどにパラメータを渡すことなく、あらかじめ設定されたパラメータをすぐに使えるようなソリューションがないかと考えていたのです。親学か何かで。

 
Juer:
私のクラスでは、パラメータとしてインジケータ・パラメータなどいろいろなものを用意しています。一般的には、静的で同じになるもの。では、なぜオブジェクトを作成 するたびにこれらの値を渡さなければならないのでしょうか?

だから、受け流さないでください。示したように、初期化リストで初期化する。クラスのインスタンスを生成した時点で、クラスのコンストラクタが自動的に呼び出され、初期化リストで指定されたクラスの全メンバーが初期化されます。Print関数をCCandleメソッドに入れれば、コンストラクタが参照されずに呼び出される様子がわかるでしょう。

 
Juer:

はい、そうですか。ありがとうございます。オブジェクトが作成されるときに、コンストラクタなどにパラメータを渡すことなく、あらかじめ設定されたパラメータをすぐに使えるようにすることです。親クラスか何かを経由して。

もう一度。コンストラクタにデータを転送することなく、実行することができます。

 
Ihor Herasko:

だから、受け流さないでください。示したように、初期化リストで初期化する。クラスのインスタンスを生成した時点で、クラスのコンストラクタが自動的に呼び出され、初期化リストで指定されたクラスの全メンバーが初期化されます。Print関数をCCandleメソッドに入れれば、コンストラクタが参照されずに呼び出されるのがわかるでしょう。

よくわからないのですが、コンストラクタで渡すか、初期化関数で渡すか、どんな違いがあるのでしょうか?

 
Ihor Herasko:

だから、受け流さないでください。示したように、初期化リストで初期化する。クラスのインスタンスを生成した時点で、クラスのコンストラクタが自動的に呼び出され、初期化リストで指定されたクラスの全メンバーが初期化されます。Print関数をCCandleメソッドに入れ、参照なしでコンストラクタが呼び出される様子をご覧ください。

何を使って初期化されるのでしょうか?どんな価値観で?I don't understand .

Expert Advisorの入力パラメータに 初期値があるとします。だから、クラスの各オブジェクトに渡す必要がある。しかし、新しく作られたオブジェクトにそれぞれ渡すのはNGです。

 

このサイクルでは、指値注文は、次のバーで指値注文を出した後、別の指値注文が出されていない場合にのみ削除されます。つまり、指値注文を出した後、指値注文のないバーが2本続く場合にのみ削除されるのです。

 int i;
   for(i=0;i<=OrderTicket();i++)
     {
      takelimit=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

      if(iBarShift(Symbol(),0,OrderOpenTime())==2)//здесь нужно что бы на 2-ом баре если есть ордер его удалить, но удаляется он только если после его установки небыло на след баре еще лимитника
        {
         deletelimit=OrderDelete(ticket);
         if(!deletelimit)
           {
            Comment(GetLastError());
           }
        }
     }
if(условие для байлимита)
{ордерсенд}
else if(условие для селлимита)
{ордерсенд}
 
Juer:

何を使って初期化されるのでしょうか?どんな価値観で?不明

初期化リストに書いてあるもの。

Expert Advisorの入力パラメータ に初期化された値があるとします。だから、このクラスの各オブジェクトに渡す必要がある。しかし、新しく作られたオブジェクトにそれぞれ渡すのはNGです。

これです。

input int      i_nA     = 10;
input double   i_fB     = 20.0;
input datetime i_dtC    = D'2018.03.08 10:12:14';

class CCandle
{
   int         m_nA;
   double      m_fB;
   datetime    m_dtC;
   
public:
                     CCandle(void);
};

CCandle::CCandle(void)
         : m_nA(i_nA)
         , m_fB(i_fB)
         , m_dtC(i_dtC)
{
   Print("Создан объект со значениями: A = ", m_nA, ", B = ", m_fB, ", C = ", m_dtC);
}

int OnInit()
{
   CCandle arrclass[10];
     
   return(INIT_SUCCEEDED);
}

走らせれば、手に入る。

0       22:09:36.706    Test EURUSD,M1 inputs: i_nA=10; i_fB=20.0; i_dtC=1520503934; 
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: initialized
0       22:09:36.995    Test EURUSD,M1: uninit reason 0
0       22:09:37.062    Script Test EURUSD,M1: removed