ライブラリ: Init_Sync

 

Init_Sync:

このライブラリは指標のInit/Deinitを同期させます。

作者: fxsaber

 
MQL5で 作成されたリソースの ライフコンテキストは何ですか?ターミナル全体、"シンボル・タイムフレーム "ストリームやチャートなどの内部コンテナ?ヘルプには書かれていません。
 
Stanislav Korotky:
MQL5で作成されたリソースのライフコンテキストは何ですか?ターミナル全体、"シンボル・タイムフレーム "ストリームやチャートなどの内部コンテナ?ヘルプには書かれていません。
確認していません。

取引、自動取引システム、取引戦略のテストに関するフォーラム

Init()とDeInit()の実行シーケンス

ニコライ・セムコ, 2017.04.16 09:42 AM

もちろん、リソースは最適なソリューションだと思います。なぜなら、それらはglob.ターミナル変数やファイルと違って目に見えないし、高速だからです。また、ファイルだけでなく、配列もリソースを通して転送することができます。また、グローバル変数のようにターミナルに属するのではなく、ウィンドウに属します。さらに、ウィンドウ内のすべての同じインジケーターに対して1つのリソースを作成することができる。

私はそう信じていた。当初は グローバルなものを使っていました。

 
fxsaber:
テストしなかった

ただ信じていたので、リソースを通してやった。もともとは グローバルを通じてだった。

何か正式な情報源があれば興味深い。
 
エキスパートアドバイザーからインジケータを作成した場合はどうなるのでしょうか?
 
Stanislav Korotky:
エキスパート・アドバイザーからインジケーターを作成した場合はどうなるのでしょうか?
これを試してみてください。
 

うーん...。

興味深い関数のオーバーライド...

どのように機能するのですか?初期化関数を例にしてみましょうか?

つまり...

ライブラリが最初に挿入されるので、コンパイル時にライブラリのOnInit()が初期化関数として登録される。

そして、同期をチェックし、OldOnInit()関数を呼び出します。この関数は何ですか?まだ定義されていません!


嗚呼...。その後、"古い "OnInit()関数が 定義されると、ライブラリのOnInit()によって呼び出されるのと同じOldOnInit()に置き換えられます。


うーん、defineの本来の使い方。私見では、さらなるサポートや識別子の宣言順序を変更する可能性という点で、かなり危険だと思う。(宣言されていない識別子は使えないという印象を持っていた)。しかし、使い方の観点からは、すべてがクリーンで正しい。

 
George Merts:

私見では、さらなるサポートや識別子の宣言順序を変更する可能性という点で、かなり危険だと思う。

危険な例はまだ見つかっていない。


私の記憶では、#includeが存在し、コードのどこにもユーザーによって呼び出されるものがないようなライブラリーはこれだけだ。

 
fxsaber:
テストしなかった

ただ信じていたので、リソースを通してやった。もともとは グローバルだった。


謝罪する。誤解していました。

このようなOnInitで(リソースを削除せずに)空のインジケータを使用した場合:

int OnInit()
  {
   uint set[1];
   set[0]=3;
   uint w=1,h=1;
   if(ResourceReadImage("::Res_name",set,w,h))
      Print(「リソースはすでに存在する set[0] = "+DoubleToString(set[0],0));
   else
     {
      if(ResourceCreate("::Res_name",set,1,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA))
         Print("新しいリソースが作成されました");
      else Print(「リソースを作成できませんでした。);
     }

   return(INIT_SUCCEEDED);
  }

リソースについて以下の結論が得られます:

1.1.リソースはウィンドウではなくターミナルに属する。したがって、リソース名に例えばウィンドウハンドルを追加するのは合理的である。

2.リソースの寿命は端末が生きている限りであり、端末が再起動されるとリソースは削除される。従って、端末を閉じたとき(理由コードはREASON_CLOSE)に、必要なデータを端末のグローバル変数(またはResourceSaveで ファイル)に保存し、端末を再度ロードしたときに、グローバルPT(またはファイル)の削除に伴い、グローバルPT(またはファイル)からデータを転送して新しいリソースを作成するのが合理的である(そうすれば、端末のグローバル変数は端末を閉じるときと開くときだけ存在することになる)。

一方では、ウィンドウ間のデータ転送や同期など、ターミナル内のあらゆることに興味深い可能性があるため、これは良いことですが、他方では、コードが追加され、やや複雑になります。
検証されていない情報を提供してしまい、再び申し訳ありません。

しかし、これで文書化されていないリソースが明確になりました。ついでに、とても貴重なツールも。

 
Nikolai Semko:

リソースはウィンドウではなく端末に属する。従って、リソース名に例えばウィンドウハンドルを追加するのが合理的である。

次に、コードにこう加える。
return("::" + (string)::ChartID() + (string)INIT_SYNC::crc64(Bytes) + ::MQLInfoString(MQL_PROGRAM_NAME));

これ以外には何も必要ないようだ。


ちなみに、ウインドウハンドルがない方が便利な場合もあります。


ZY 更新版にはこの修正が含まれています。

 
fxsaber:

ちなみに、ウインドウ・ハンドルがない方が便利な場面もあるかもしれない。


ええ、私も考えました。