MQL5におけるOOPに関する質問 - ページ 39

 

今、なぜここに十分なボルチャンスキーがいないのか、タフガイのインサイダーのプレビューか、彼が使うものは何でもいいのだが、不思議でならない))


3ヶ月前にオフサイトからwin10homeをダウンロードしましたが、基本的な設定をする時間もなく、起動時のオプションアイコンが開きません、はい********です。

 
Koldun Zloy:

以下はその一例です。

あなたの例を私のタスクに完全に適用しようとしましたが、再び同じrake - 私は基本クラスから新しい子孫を作成するときに "レコードが必要 "フラグを終了したいです。

//+------------------------------------------------------------------+
class CStrategy
{
private:
   int f_save_required;
protected:
   int set;
   void              SaveRequiredFlags (const bool flag)                      { f_save_required++;  }
   int               SaveRequiredFlags (void) const                           { return(f_save_required); }
public:
                     CStrategy():f_save_required(0)                           {  Print(__FUNCSIG__,"save = ",f_save_required);  }
                     CStrategy(int setting):set(setting),f_save_required(0)   {  Print(__FUNCSIG__,"save = ",f_save_required);  }
                    ~CStrategy(){}

};
//+------------------------------------------------------------------+
class A: public CStrategy
{
public:
   void              SaveRequired (void)                                      { SaveRequiredFlags(true);                         }
   int               getSaveRequired (void) const                             { return(SaveRequiredFlags());                     }
                     A(int st_setting) : CStrategy(st_setting){}
                    ~A(){}
};
//+------------------------------------------------------------------+
class B: public CStrategy
{
public:
   void              SaveRequired(void)                                       { SaveRequiredFlags(true);                         }
   int               getSaveRequired (void) const                             { return(SaveRequiredFlags());                     }
                     B(int st_setting) : CStrategy(st_setting){}
                    ~B(){}
};
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   A *a = new A(1);
   B *b = new B(2);
   a.SaveRequired();
   a.SaveRequired();
   a.SaveRequired();
   a.SaveRequired();
   b.SaveRequired();
   Print(a.getSaveRequired());
   Print(b.getSaveRequired());
//---
   return(INIT_SUCCEEDED);
  }

2019.09.14 16:07:26.856 Builder_v1.00 (EURUSD,H1) CStrategy::CStrategy(int)save = 0

2019.09.14 16:07:26.856 Builder_v1.00 (EURUSD,H1) CStrategy::CStrategy(int)save = 0

2019.09.14 16:07:26.856 Builder_v1.00 (EURUSD,H1) 4

2019.09.14 16:07:26.856 Builder_v1.00 (EURUSD,H1) 1

今のところ、すべてうまくいっています。

1.インターフェースを宣言していないことは全く問題ない

2.セッターとゲッターを大量に生成したが、静的変数から脱却できなかった。


もう一度コードを書き換えてみました。

//+------------------------------------------------------------------+
class CStrategy
{
private:
   int f_save_required;
protected:
   int set;
   void              SaveRequiredFlags (const bool flag)                      { f_save_required++;  }
   int               SaveRequiredFlags (void) const                           { return(f_save_required); }
public:
virtual  void        SaveRequired (void)                                      { SaveRequiredFlags(true);                         }
virtual  int         getSaveRequired (void) const                             { return(SaveRequiredFlags());                     }
                     CStrategy():f_save_required(0)                           {  Print(__FUNCSIG__,"save = ",f_save_required);  }
                     CStrategy(int setting):set(setting),f_save_required(0)   {  Print(__FUNCSIG__,"save = ",f_save_required);  }
                    ~CStrategy(){}

};
//+------------------------------------------------------------------+
class A: public CStrategy
{
public:
                     A(int st_setting) : CStrategy(st_setting){}
                    ~A(){}
};
//+------------------------------------------------------------------+
class B: public CStrategy
{
public:
                     B(int st_setting) : CStrategy(st_setting){}
                    ~B(){}
};
//+------------------------------------------------------------------+



//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   CStrategy *a = new A(1);
   CStrategy *b = new B(2);
   
   a.SaveRequired();
   a.SaveRequired();
   a.SaveRequired();
   a.SaveRequired();
   b.SaveRequired();
   Print(a.getSaveRequired());
   Print(b.getSaveRequired());
//---
   return(INIT_SUCCEEDED);
  }

結果は最初のバージョンと同じですが、唯一、インターフェイスから離れたのは

 
何が目的なのか、何を得るためなのか。
 
Dmitry Fedoseev:
何が目的なのか、何を手に入れたいのか。

を、全て機能させ、知識を得ることが目的です ))))

How I did it:

- すべての計算を行う基本クラスがあり、TCの設定を保存し、そこからTCによって動作する子孫を継承する。

- 開いている ファイルのハンドルをすべての子孫に渡して、1つのファイルに保存するのが合理的だと思います。この場合、save()メソッドは再びベースクラスに登場します

- 保存はイベント/フラグが発生したときに行うべきである。どの子孫がいつそれを開始したかはわからないが、それを理解するよりも何十もの構造体を新しいファイルに保存する方が速い。

- 1つのクラスと設定の配列を作るのはどうでしょうか?- 1つか2つのメソッドをvirtualとして宣言し、各TSに追加する必要があるんだ。

- 問題:静的変数から脱却するために、私の知らないジェダイのOOPトリックがあることを期待しています。





HH: const modifiersは良いものです、私は費やした時間を後悔していません - 役に立ちます、議論に再び感謝します!

 

もし、このクラスのすべてのオブジェクトのデータを1つのファイルに書き込んで、それを一度だけ開かなければならないのなら、スタティック変数が なければできません。そして、それが課題に最も適しているのであれば、なぜそれを取り除くのでしょうか?もちろん、グローバル変数の宣言も可能です。

もし、すべてのオブジェクトがファイルを開いたり、書いたり、閉じたりするとしたらどうでしょう?それなら、すべてのオブジェクトにファイル名があれば十分なのでは...。しかし、この場合も、変数の値は常にどこでも同じなので、静的変数を使うのがよいでしょう。

または何も理解していない)

 
Dmitry Fedoseev:

もし、このクラスのすべてのオブジェクトのデータを1つのファイルに書き込んで、それを一度だけ開かなければならないのなら、スタティック変数が なければできません。そして、それが課題に最も適しているのであれば、なぜそれを取り除くのでしょうか?もちろん、グローバル変数の宣言も可能です。

もし、すべてのオブジェクトがファイルを開いたり、書いたり、閉じたりするとしたらどうでしょう?それなら、すべてのオブジェクトにファイル名があれば十分なのでは...。しかし、この場合も、変数の値は常にどこでも同じなので、静的変数を使うのがよいでしょう。

それとも私が勘違いしているのだろうか)

一度開いたファイルには、データを書き込んですぐに閉じます。端末がハングアップしてもデータが失われないように、1分に1回から1時間に1回まで記録します。

コードでやろうよ、それが今のやり方なんだから。

// это один файл, его не трогаю, тут только конструктор и 3 метода из интерфейсов, чтобы дать стратегиям тик, чтобы закрыть их и вот чтобы записать все ТС в файл

//____________________________________________________________________
void EA::OnTick(double &profit[])
{
      for(int i = 0; i < StrategyCount; i++) profit[i] = Strategy[i].Strategy();  // запустили зоопарк стратегий и тут нам интересно дать им волю и узнать их профит, если ТС завершилась       
                                                                                  // она самостоятельно запустит "пустую стратегию", но профит будет возвращать первоначальный
      if(CStrategy::GetSaveRequired()) Save();                                    // вот тут узнаем состояние флага требуется ли запись состояния любой из ТС
}
//____________________________________________________________________
//это структура которая умеет открыть и записать файл, пример от fxsaber
struct FILE
{  const int handle;

  FILE( const string FileName, const int Flags ) : handle(::FileOpen(FileName, Flags)) {}
 ~FILE( void ) { if (this.handle != INVALID_HANDLE) ::FileClose(this.handle);  Print(__FUNCTION__);} 
};

//____________________________________________________________________
// метод для записи в файл состояния всех ТС, но проще записать все ТС один раз в файл, чем искать одну ТС..... в общем считаем, что скорость доступа к диску намного меньше чем работа с памятью
// используем структуру FILE - ну это просто удобно, объявили и забыли, она сама закроет файл когда уйдет из области видимости
void  EA::Save(void)
{  FILE f(DEF_PREFIX_FILE_NAME + IntegerToString(m_magic)+".bin",FILE_WRITE|FILE_BIN);
   for(int i = 0; i < StrategyCount; i++)
      Strategy[i].SaveSelfStatus(f.handle); 

}





// это основной файл (инклудник) в котором работаю, тут ТС 

//____________________________________________________________________
здесь опять все кратко и лаконично, но сделаю вывод в лог ошибки если возникнут при записи, сделаю именно здесь, т.к. только тут все модификации 
void CStrategy::SaveSelfStatus(const int handle)
{  FileWriteStruct(handle,m_setting);
   FileWriteStruct(handle,m_order_info);

}

 
Dmitry Fedoseev:

あるいは、何もわかっていなかったのかもしれません。

先月斜め読みして、今月また戻ってきたけど、実感がわかない。

Hubr:シングルトンかスタティッククラスか?

Singleton (Одиночка) или статический класс?
Singleton (Одиночка) или статический класс?
  • habr.com
Статья будет полезна в первую очередь разработчикам, которые теряются на собеседованиях когда слышат вопрос «Назовите основные отличия синглтона от статического класса, и когда следует использовать один, а когда другой?». И безусловно будет полезна для тех разработчиков, которые при слове «паттерн» впадают в уныние или просят прекратить...
 
Igor Makanu:

- 問題:静的変数から脱却するために、私の知らないジェダイのOOPトリックがあることを期待しています

なぜこれが問題なのか?必要であれば静的変数 から離れる必要はない。

書き込み必要フラグが何に依存するのか、まだ理解できていません。

私の例では、変更があった場合に設定されます。

どのように設定するのですか?

 
Koldun Zloy:

なぜこれが問題なのか?静的変数が 必要な場合は、静的変数 から離れる必要はありません。

であれば、問題は解決します- 元々そういうものなんです。

ZS: すでに静的構造の実験が始まっていますね...。初期化の問題だけでなく、コードの可読性にも問題があり、variants flag.saveRequired や flagsave.Required を試したり、オーバーロード演算子 = に手を出したり、とにかく、ナンセンスなことばかりです。 プライベートなスタティック変数を使って、そこにセッターやゲッターを追加すれば、最終的にはもっと簡単で読みやすいコードになるのですが、よく言われるように、簡単な方法を探しているわけではないのです......。無名のビデオの作者たちに幸あれ...。

 
Fast235:

今、なぜここに十分なヴォルチャンスキーがいないのか、タフガイのインサイダーのプレビューか、彼が使うものは何でもいいのだが、不思議でならない))。

3ヶ月前にオフサイトからwin10homeをダウンロードしましたが、基本的な設定をする時間もなく、起動時のオプションアイコンが開きません、はい*******です。

ただ、忙しいのと、フォーラムは時間がかかるので、Insider previewのインストールはお勧めしません、今のWindowsは週に一回新しいビルドをインストール します。 MSのサイトから安定版ビルドをダウンロードするのがベターです。 それは、私の子供じみた好奇心がまだ一人歩きしているのです :)