私のアプローチコアはエンジンです。 - ページ 92

 
Maxim Kuznetsov:

EA、インジケーター、スクリプト間のデータ交換のための唯一のGlobalVariablesとファイルです。

上記4点は、いずれも魚が欲しいというローカルな "ハコ "です。上記4点は、いずれも任意のデータ、ましてやデータの配列のやり取りを想定していない機構を使用しています。

GlobalVariablesはメッセージングに特化して設計されていると思うでしょう。バカなことを言うものだ。実際には他のアイテムと同じようにハックすることができます。

 
fxsaber:


...大雑把に言うとリソースへの書き込み/読み出しのティックサイクルは、1秒間に400万ティックの 割合で実行されます。

リソースへの読み書きが非常に高速に行えます。しかし、どこまでがそのような発信に適しているのでしょうか。

1.Aラインタイマーイベント。イベントで変更されたすべてのパラメータ値を収集し、文字列に変換します。文字列をCharに変換し、リソースに書き込む。B面にメッセージを送信します。

2.パーティーBOnChartEvent()イベント、メッセージシグナルを受信、リソースをオープン、読み込み、パラメータカーネルに新しい値を入力、必要な要素を再描画する。

このイベントがタイマーの頻度で連続的に実行される場合はどうでしょうか?

そのためのリソースをどう使うのがベストなのか、他に選択肢があるのかが問題です。

//---------------------------------------------------------------------------------------------------------------------

  • EventChartCustom()オプションには2つの欠点があります。

  1. 小包はイベントキューに入ります。
  2. 小包の長さは127文字までです。その結果、1000文字のメッセージを分割し、再度組み立てる必要がある。そして、メッセージの各部分はイベントキューに入ることになります。
  • グラフオブジェクトを通過するタイプでは、メッセージを64文字の束に分割し、オブジェクト記述にした後、再び組み立てる必要がある。この変種が一番速いのですが、文字列の長さが長くなると速度が低下するのが面白いですね。つまり、ObjectSetString()を1回呼び出す ごとに3マイクロ秒かかります。しかし、1000文字の文字列の場合、64文字に分割する必要があるため、ObjectSetString()を約8回呼び出す必要があるのです。8*3 = 24 msです。そうすると、紐を組み立てる時間も同じになります。だからこそ、もし文字列が1万文字もあれば、この方法はリソースを介して作業する方法の速度に確実に近づけることができるのだ。(リソースの保存と読み込みの時間+文字列をuintに転送して戻る時間のことです)。
リソースバリアントは最後まで未検証のままです。今日、テスターでテストして、ユニバーサルにできるかどうかがやっとはっきりするんです。
 
Реter Konow:

このイベントがタイマーの頻度で連続的に実行される場合はどうでしょうか?

そのためのリソースをどう使うのがベストなのか、他に選択肢があるのかが問題です。

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

プログラム間のデータ交換

fxsaber さん 2018.11.21 13:12

おそらく、交流のためのさまざまな選択肢をこれほど詳細に説明する時間はないでしょう。残念ながら、私はそのようなリソースを持っていません。

充実した交流が行われている記事を ご紹介します。それぞれの建物は、レンガを使い、特定の作業のために作られます。可能なレンガはすべてスレッドの最初に表示されます。あとは、ビルダー次第です。

 
fxsaber:

この記事では、リソースを介した2つのプログラムの通信をテストしておらず、そのうちの1つはテスター内にある。

 

組合に何か問題があるのでしょうか?一例をお願いします。

union UZ{
   double d;
   int i[2];
};

void OnStart(){

   UZ u1;
   UZ u2;
   
   u1.d=12345.678;
   
   ArrayCopy(u2.i,u1.i);
   
   Alert(u2.d);

}
 
Реter Konow:

この記事では、リソースを介した2つのプログラムの通信をテストしておらず、そのうちの1つはテスター内にある。

レンガに関する文章を読んでみましょう。

 
fxsaber:

...

この記事は、スズメに大砲を撃っているようなものです。多くの記事のように。記事を理解するよりも、自分で問題を解決したほうが早い。

すべてが10倍簡単に、クリアにできる。でも、記事はとんでもないことに...。


また、テスターでリソースの動作確認をしていないと言うのでは、記事の意味がないのでは?

 
Реter Konow:

また、テスターでリソースの動作確認をしていないと言うのでは、この記事の意味がないのでは?

議論から外れた。

 

この解答は何かおかしい。私のやり方が悪いのかもしれません。

短くまとめると

StringToCharArray() 関数は、char の配列のみを受け取ります。

ResourceCreate() 関数には、uint 型の配列のみを指定することができます。

したがって,変換後の文字列が 格納されたchar配列の内容を,uint配列に書き換える中間処理が必要になります.

 
//+------------------------------------------------------------------+
//|                                                    Tester EA.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   //----------------------------------------------
   ObjectCreate(0,"Resource",OBJ_BITMAP_LABEL,0,0,0);
   ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"::Resource");
   //----------------------------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   uchar Arr[];
   uint  Data[];
   //---------------------------
   string price = (string)Bid;
   //---------------------------
   int width = StringToCharArray(price,Arr);
   //---------------------------
   ArrayResize(Data,width);
   //---------------------------
   ArrayCopy(Arr,Data);
   //---------------------------
   if(!ResourceCreate("::Resource",Data,width,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA))Print("Resource is not created!");
   //---------------------------
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   
  }
//+------------------------------------------------------------------+

通常のチャートに表示されるインジケーターです。

//+------------------------------------------------------------------+
//|                                              Resource reader.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(25); 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   uint Data[50],width,height;
   //-----------------------------
   if(!ResourceReadImage("::Resource",Data,width,height))Print("Failed to read resource!");
   else Print("Resource is readable!");
   //-----------------------------
   
  }
//+------------------------------------------------------------------+
理由: