ライブラリ: TradeTransactions - ページ 8

 
ifffrt #:
この変更を行ってもまだ同じエラーが出ます。

ロシア語版のコードベースとは 別に各ファイルをダウンロードしてください。

TradeTransactions
TradeTransactions
  • www.mql5.com
Доступ к данным OnTradeTransaction в любом месте программы
 

こんにちは、

ある点で行き詰まっています。私は2つのEAを作成し、1つはデータを保存し、もう1つは読み込みます。リソース・ディスカバリーに問題があります。

このコードはデータを保存し、そこからアクセスして読むことができます:

#include "ResourceData.mqh" // https://www.mql5.com/ja/code/22166

#define PRINT(A) Print(#A + " = " + (string)(A));

  struct ExampleStruct

    {

     string ea_name;

     string symbol;

     string direction;

     string time_for_command;

    };

 ExampleStruct qexamplestruct[2];

int OnInit(void)

  {

      EventSetTimer(1);

   return(INIT_SUCCEEDED);

  } 

void OnTimer()

{    

  // Произвольные данные для примера

  string Str[] = {"123", "Hello World!"};  

  qexamplestruct[0].direction="buy";

  qexamplestruct[0].ea_name="TestEAname";

  qexamplestruct[0].symbol="EURUSD";  

  qexamplestruct[0].time_for_command="01.01.2021";

  string stringtosend = Serialize(qexamplestruct[0]);


  const RESOURCEDATA<uint> Resource("::ResoC"); // Ресурс для обмена данными

  CONTAINER<uint> Container;         // Создаем контейнер - все будет храниться в массиве простого типа (в примере выбран uint)

 Container[0] = Str;

 Container[1] = stringtosend;


  const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5) + "::ResoC";  

   Print(NameOut); // Вывели полное имя ресурса.

  Resource = Container.Data;  // Отправили данные на обмен

//---

   }

   string Serialize(const ExampleStruct &s)

{

   return s.ea_name + "\n" + s.symbol + "\n" + s.direction + "\n" + s.time_for_command;

}


ExampleStruct Deserialize(const string &line)

{

   string parts[];

   StringSplit(line, '\n', parts);


   ExampleStruct s;

   if(ArraySize(parts) > 0) s.ea_name = parts[0];

   if(ArraySize(parts) > 1) s.symbol = parts[1];

   if(ArraySize(parts) > 2) s.direction = parts[2];

   if(ArraySize(parts) > 3) s.time_for_command = parts[3];

   return s;

}

このコードはデータを読み込み、毎回何もないと書き込む:

#include "ResourceData.mqh" // https://www.mql5.com/ja/code/22166

#define PRINT(A) Print(#A + " = " + (string)(A));

int OnInit(void){return(INIT_SUCCEEDED);} 

void OnTick()

{    

  const RESOURCEDATA<uint> Resource("\Terminal\99A739E3DB06068691C851DE1765F329\MQL5\Experts\ZC\Conections\Draft4.ex5::ResoC"); // Ресурс для доступа к данным (только для чтения) из другой программы

  CONTAINER<uint> Container4; // Сюда будем получать данные

  Resource.Get(Container4.Data); // Считали данные из ресурса.  

    for (int i = 0; i < Container4.GetAmount(); i++)

       Print("i==",i);

         string Str4;

           Container4[0].Get(Str4);                // Получили массив

  Print("Test!!!"+Str4);   

  Print(Str4);

//---

   }

しかし、なぜか私が書いたものからは、文字列型の配列も、私が構造体から得た単一の文字列も、何の情報も得られないのです。

TradeTransactions
TradeTransactions
  • 2018.09.06
  • www.mql5.com
Доступ к данным OnTradeTransaction в любом месте программы
 
Alexander #:

しかし、なぜか私が書いたものからは、文字列型の配列も、構造体から取得した単一の文字列も、情報が表示されない。

実行したことはありませんが、この ようなケースだと思われます。

  string GetFullName( void ) const
  {
    //TERMINAL_DATA_PATH でなければならない。 вместо TERMINAL_PATH.
        return((this.GetName()[0] == ':') ? ::StringSubstr(::MQLInfoString(MQL_PROGRAM_PATH), ::StringLen(::TerminalInfoString(TERMINAL_PATH)) + 5) + this.GetName() : this.GetName());
  }

この方法で試してみてください。

const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_DATA_PATH)) + 5) + "::ResoC";
 
fxsaber #:

走ったことはないが、そうだと 思う。

自分で試してみてください。

こんにちは、書き込みありがとうございます。

以前にもこちらで書かれていたので、さっそく試してみました。ResourceData.mqh "も修正しました。残念ながら解決しませんでした。原因はまだわかっていません。

 
TERMINAL_PATHとTERMINAL_DATA_PATHの両方のパスを試しましたが、結果は同じでした。
 

もう少し進展がありました。

ResourceReadImage(FullNameCorrect,Arr,width,height))を直接使用すると、他のEAで作成されたリソースからデータを受け取ることができます。ライブラリ関数(上に添付したものと同様)を介して同じリソース名にアクセスすると、データは受け付けられません。

何が問題なのかわかりましたら、また報告します。

 

リソースを作っています:

a - ライブラリを通して

b - 手動で作成(ResourceCreate)

別のEAから同じリソース名でリソースデータにアクセスする:

a - ライブラリを通して

b - 手動(ResourceReadImage)

結果

ライブラリを通して作成されたリソースは、手動でもライブラリを通しても見つかりません。

手動で作成されたリソースは手動で検出され読み込まれますが、ライブラリを通しては検出されません。

 
Alexander #:

ライブラリで作成したリソースが、手動でもライブラリでも見つからない。

手動で作成されたリソースは手動で見つけられ、読み込まれるが、ライブラリ経由では見つからない。

ライブラリ経由では動作する。

#include <fxsaber\TradeTransactions\ResourceData.mqh> //https://www.mql5.com/ja/code/22166

#define  PRINT(A) Print(#A + " = " + (string)(A));

void OnStart()
{    
  // サンプル用の任意のデータ
  string Str[] = {"123", "Hello World!"};
  double Num = 5;
  MqlTick Tick = {0};
  Tick.bid = 1.23456;

  const RESOURCEDATA<uint> Resource("::ResoC"); // データ共有のためのリソース
  CONTAINER<uint> Container;         // コンテナを作成する - すべてを単純な型の配列に格納する(例ではuintを選択)。
  
  // 異なるデータでコンテナを満たす
  Container[0] = Str;
  Container[1] = Num;
  Container[2] = Tick;
    
  // コンテナに格納されているデータの種類を表示する。
  for (int i = 0; i < Container.GetAmount(); i++)
    PRINT(Container[i].GetType())

  Resource = Container.Data;  // 交換用のデータを送信
  
  CONTAINER<uint> Container2; // ここでデータを取得する

  const RESOURCEDATA<uint> Resource2(Resource.GetFullName()); // データ共有のためのリソース
  
  Resource2.Get(Container2.Data); // データを取得
      
  // 元の形式でデータを取得する
  string Str2[];
  Container2[0].Get(Str2);                // 配列を取得
  ArrayPrint(Str2);

  PRINT(Container2[1].Get<double>())      // 数字が出た
  PRINT(Container2[2].Get<MqlTick>().bid) // 構造体を手に入れた 
}


なぜあなたの元の例が まだ動作しないのかわかりません。

 
fxsaber #:

あなたの元の例が なぜ機能しないのか、私にはまだわからない。

他のすべてが正しく書かれていれば、それは助けになるでしょう。

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

ライブラリ: TradeTransactions

アレクサンダー, 2025.09.15 21:09

void OnTimer()
{    
  // ....
  static const RESOURCEDATA<uint> Resource("::ResoC"); // データ共有のためのリソース
  // ....
}

OnTimerへの各入力にオブジェクトを作成し、それに従って、出力でそれを終了させました。そのため、リソースはマイクロ秒の間生き続け、側にはありませんでした。

class RESOURCE
{
public:
  ~RESOURCE( void)
  {
    ::ResourceFree(this.Name);
  }
 
fxsaber #:
静的

なんて当たり前のことなんだろう、2日間も気づかずに見過ごしていた)

ありがとうございます!


すべて完璧に動作しています。ライブラリを使用してアルゴリズム間でカスタム構造を交換できる機能は、私の取引にとって大きな助けとなりました!