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

 

EAがティック単位でイベントを処理するので、その方向で落ち着きました。

一方を書き、もう一方をティックから読み取るという違いは、理論的には次のティックで......。

 

ふと思いついたのですが、レジストリでデータをやり取り するのはどうでしょう?キーの作成、キーの削除、そのためのAPIはすべて揃っているようです。どの程度遅いのかはわかりませんが、アプリケーションからアクセスされる部分は常にRAMに置くことができるようです。

誰かの頭に浮かんだことはないだろうか。同一マシン上の端末にのみ有効です。

この方向で掘っていきます :-)。

 
Andres писал(а)>>

ふと思いついたのですが、レジストリでデータをやり取りするのはどうでしょう?キーの作成、キーの削除、そのためのAPIはすべて揃っているようです。どの程度遅いのかはわかりませんが、アプリケーションからアクセスされる部分は常にRAMに置くことができるようです。

誰かの頭に浮かんだことはないだろうか。同一マシン上の端末にのみ有効です。

この方向で掘っていきます :-)。

レジストリと連携するためのAPIのリンクを教えてください。

今のところ、ディスク上のファイルを介した情報交換を基本としたバリエーションを考えています。もちろん、どちらの端末も同じパソコンで動作します。

いくつかテストしてみましたが、端末間で1秒以内にデータをやり取りできるスピードは十分すぎるほどで、両口座(BUY口座とSELL口座)を管理するには十分な速度だと思われます。

とはいえ、最近は仕事が忙しく、2週間ほどこの問題を扱っていませんでしたが。

以前、プログラマー仲間に聞いたことがありますが、レジストリをいじって解決するのはダメだと忠告されましたが。ハードディスクでのファイル共有を利用するよう強く勧められた。

今はそこで止まっています。暇が出来たら、このバリアントをファイルで実現しようと思っています。

 

http://yandex.ru/yandsearch?text=CreateFileMapping&stpar2=%2Fh0%2Ftm123%2Fs1&stpar4=%2Fs1

便利なのは、DLLの中に共有メモリへの参照があることです。

このアドレスは、構造体のアドレスとして使用することができます。)

 
solandr >> :

レジストリと連携するAPIのリンクを教えてください。

レジストリからの読み込みの 例。

 

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

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

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

#include "RegLib.mqh"

int hKey;

int init()
{
   // инициализируем дефайны
   InitRegDefines();

   // создаём тестовый ключ
   hKey = CreateKey( HKEY_CURRENT_USER, "!MT4TestKey" );

   // создаём поля по умолчанию
   SetStringValue( hKey, "Bid", "0.0" );
   SetStringValue( hKey, "Ask", "0.0" );

   return( 0 );
}

int start()
{
   // записываем цены в реестр
   SetStringValue( hKey, "Bid", DoubleToStr( Bid, Digits ) );
   SetStringValue( hKey, "Ask", DoubleToStr( Ask, Digits ) );

   // получаем цены в виде строк из реестра
   string BidStr = GetStringValue( hKey, "Bid" );
   string AskStr = GetStringValue( hKey, "Ask" );

   // выводим цены из реестра
   Print( "Bid = ", BidStr, " ", "Ask = ", AskStr );
}

int deinit()
{
   // закрываем ключ
   CloseKey( hKey );
   
   return( 0 );
}
ファイル:
reglib.zip  4 kb
 
Andres писал(а)>>

ふと思いついたのですが、レジストリでデータをやり取りするのはどうでしょう?キーの作成、キーの削除、そのためのAPIはすべて揃っているようです。どの程度遅いのかはわかりませんが、アプリケーションからアクセスされる部分は常にRAMに置くことができるようです。

誰かの頭に浮かんだことはないだろうか。同一マシン上の端末にのみ有効です。

この方向で掘っていきます :-)。

また、電球で釘を打ってみるのもよいでしょう。人によっては効果があります。

 
Integer >> :

また、電球で釘を打ってみるのもよいでしょう。できる人もいる。

でも、美しいと思いませんか?また、OSの変数を利用してみるのもよいでしょう。

 
granit77 писал(а)>>

でも、美しいと思いませんか?また、OSの変数を利用してみるのもよいでしょう。

また、システム時刻の設定も試してみてください。

 
:))))))))))))))