異なる端末で動作する2つのEA間のデータ交換 - ページ 3

 

Еще можно попробовать забить гвоздь лампочкой. У некоторых получается.

この方法の何が問題なのでしょうか?

また、システム時刻の設定も可能です。

そうすることで、システムの時刻が同期されるのです :-)。設定ではなく、読書を通して。これは一種のデータ交換 です。

 




皆さんこんにちは!

端末を確実にリンクさせる最も良い方法の一つは、ネットワーク1Cの使用と思われます。
2つの主な特徴:
1. メインアプリケーションは1C上で実行され、端末とそのMQL4プログラムは実行者です、
2. メインアプリケーションはいずれかの端末で実行し、1Cアプリケーションはリンクプロトコルとして使用します。

利点:
1. 異なるサーバーに同時に全引合履歴を保存し処理できる、
2.

 
Andres >> :

私はすでに小さなライブラリを書き、私のExpert Advisorはすでにレジストリを通じて情報を変更しています。実際、それらはレジスタを通じて変更され、ディスク上の読み書き操作は見当たりません。


ライブラリーの提供ありがとうございましたこの交換実装にも対応します。

さっそくですが、ひとつ明らかな疑問があります。リード/ライト・パラメータのチェックはどのように実装されていますか?つまり、あるキーのあるパラメータがすでに読み取れることを、他のEAがどうやって知ることができるのか、ということです。

他のEAで何か追加の読み取り/書き込み権限キーを作成しているのか、それとも何か他の機能をテストしているのでしょうか?つまり、言い換えれば、EAが同じキーパラメータを同時に操作して失敗しないように、パラメータへのユニタリーアクセスをどのように提供するかということです。

 

キーパラメータにユニタリーアクセスを提供する方法がなんとなくわかりました。文字列GetErrorString( int ErrorCode)関数でエラーをチェックするだけです。

また、エラーが発生した場合は、再度操作を行う必要があります。しかし、この繰り返し操作をライブラリのどこで行っているのかが理解できていない。もしかしたら、私自身が必要なものを追加しなければならないかもしれません。とにかく、素敵な解決策をありがとうございました

 

これはWin APIの上にあるシンプルなラッパーで、エラー出力により文字列のキーパラメーターだけを操作することができます。

GetErrorString( int ErrorCode ) は、むしろ、エラーが発生したときに、何が、どこで、なぜ、どのように修正すればよいかが分かるようにするための指標です。もちろん、エラーの処理をラッパーやライブラリ関数の枠を超えて、様々な専門家によるキー使用のロジックに基づいて、様々な方法で(エラーには多くの種類がある)反応させることは可能だし、そうするべきだと思っている。一方、失敗した場合の SetStringValue() は、試行が失敗したことを伝えるだけである。そして、GetStringValue()は、失敗した場合、それを伝えるだけでなく、空の文字列を返します。OSでチェックされるので、読み書き権限キーを追加する必要はないかと思います。エラー処理と 適切なエラー対応で十分である。私の "ホット "テスト用のEAは、単に時間的に非同期であるため、1つのフィールドを同時に読み書きしてもコンフリクトしなかったのだと思われます。しかし、これはもちろん解決策ではありません。前に進まなければならない。それでも一晩で書き上げたものなので、あまり厳しく評価しないでください。その手法を体感するための「ベタ」なバージョンです :-)。

 
Andres >> :

すでに小さなライブラリを書き、私のEAではレジストリを通じて情報を変更しています。実際には、彼らはRAMを介して変更され、ディスクへの読み書きを私は観察していない。MSDNには、レジストリに数百Kb以上のデータを突っ込まない方が良いと書かれています。

ライブラリは、すべてのキーとパラメータが一時的なレジストリ領域に作成され、永久的なレジストリに書き込まれないように設定されています。再起動後、これらのキーは消えています。

ひとつだけ、このライブラリは255文字以下の文字列パラメータでのみ動作します(MQLの制限)。でも、これで十分なんです。一般にレジストリのパラメータは文字列に限らず様々なタイプが考えられますが、今のところ他のタイプは必要ないと私は考えています。今はレジストリを介して2つのEAを交換していますが、もっと必要かもしれません:-)。また、Win APIでは、ネットワークレジストリへの接続が可能であることも良い点です。同じネットワーク内の異なるコンピュータで動作するEA間で情報を交換する必要がある場合、この方向に目を向けることができます。私見では、迅速かつシンプルで信頼性が高く、DLLやファイルも不要です。文字列を入力し、文字列を出力する。

アンドレイ、ありがとうございます

若干の編集とトリミングをしていただきました。

これ、貯金 箱に入れたらいいんじゃない?かなり、価値あるソリューションです

ファイル:
reglib.rar  11 kb
 

そのうち、Andreyさんのライブラリと私のライブラリを統合して、グラフィカルな変数を扱 えるようにしたいと思います。これでもう一段階、変数宣言ができるようになる。

1.GlobalSuperVariableが 存在することになる。このような変数は、OSレベルで見ることができるようになります。

2.現在、GlobalVariableが あります。

3.GlobalChartVariableも あります。1つのウィンドウにのみ表示されます。

一般的には、MQL4でその構造をOSレベルで操作するためのライブラリを作成する必要があります。

 
Zhunko >> :

1.GlobalSuperVariableが 存在することになる。このような変数は、OSレベルで見ることができます。

このような変数をコドベースにアップロードしていただけると、非常にありがたいです(おそらく私だけではないと思います)。

自作手法で作るのに疲れた。

 

アンドリューに質問です。このレジストリは引き継がれるのでしょうか?

string GetStringValue1 (int    hKey,      // Код ключа реестра.
                        int    lpSize,    // Длина считываемой строки.
                        string ValueName) // Имя параметра ключа.
 {
  int lpType[1];      // Возвращаемый тип параметра.
  int lpcbData[1];    // Размер буфера.
  int i;              // Переменная для подрезки последних пустых строк.
  int lres;           // Результат.
  string lpData = ""; // Буфер для возвращаемой строки.
  //----
  lpcbData[0] = lpSize; // Размер буфера.
  for ( i = 0; i < lpSize; i++) lpData = lpData + "#";
  lres = RegQueryValueExA ( hKey, ValueName, 0, lpType, lpData, lpcbData); // вызов API
  // Теперь в lpcbData[0] размер скопированных байт. Проверяем результат.
  if ( lres != ERROR_SUCCESS)
   {
    Print ("Error in RegQueryValueExA(): ", GetErrorString ( lres));
    return ("");
   }
  if ( lpType[0] == REG_SZ || lpType[0] == REG_EXPAND_SZ) return (StringSubstr ( lpData, 0, lpcbData[0] - 1));
  return ("");
 }
 
説明します。動的にインクリメントされる文字列をバッファとして使用すると、何らかのエラーが発生するということです。私自身も以前、偶然に出会ったことがあります。
InitRegDefines();
hKey = CreateKey( HKEY_CURRENT_USER, "!MT4TestKey" );

// заносим
SetStringValue( hKey, "Param", "Test" );

// вытаскиваем при помощи Вашей функции:
Print( GetStringValue1( hKey, 20, "Param" ) );

その後、判明したこと。

2009.05.19 01:22:16 2008.12.31 01:49 temp EURUSD,M1: ####.
2009.05.19 01:22:16 2008.12.31 01:49 temp EURUSD,M1: RegCreateKeyExA(): 存在しないパーティションが作成されました。
2009.05.19 01:22:16 テスト用テンプレ開始

つまり、呼び出されてもエラーにはならないが、バッファの中身は変化しない。そして、レジストリの「Test」行である。

フォーラムの 投稿で、MQL環境からDLL関数への奇妙な文字列の受け渡しが原因で発生することを知りました。MQL環境では、開発者は独自のマネージャ(文字列プール)を使って文字列を操作しますが、どうやらこの境界では間違ったバッファが埋められ、API関数が返す結果を見ることができないようなのです。しかし、最大長をすべて初期化した文字列を使えば、私が見る限り、問題はない。そのため、255文字の「#」という文字列があるのです。文字列を目に見えるようにするために、単純に「#」という文字が選ばれている。呼び出す前にバッファに何が入っているかは関係ないので、Win API自体には関係ない。これは、先ほどの文字列の長さの制限のことです。SetStringValue()に255文字以上の文字列を渡すことは可能ですが、読み取ることはできません。

もちろん制限がないに越したことはないのですが、大きな不便を感じることはありません。なぜ、あるサイズの文字列を読み取る必要があるのか、という疑問が湧いてきます。制約がある場合は、入力文字列を長さ255のN個のパラメータ+「余り」パラメータに分割する関数を書けば、制約を回避することができる。そして、読むときには、それを集め直す。それ以外の方法はない。もし、難しい場合は、私に連絡してください。ただ、みんなのニーズが異なっている、あなたはすべてを提供することはできませんが、それは私のためにこれだけで十分であり、誰かがグローバル変数を使用し、さらにいくつかのレベルで。