程序库: TradeTransactions - 页 8

 
ifffrt #:
即使我做了这样的改动,还是会出现同样的错误,抱歉。

俄语版本的代码库中 单独下载每个文件。

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

您好、

请帮帮我,我在一个问题上卡住了。我做了两个 EA,一个保存数据,另一个读取数据。我在资源发现方面遇到了问题。

这个代码保存数据,我可以从中访问并读取数据:

#include "ResourceData.mqh" // https://www.mql5.com/zh/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/zh/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"。遗憾的是,这些都无济于事。我还没有找到原因

 
我使用Print("Full Name: ",Resource.GetFullName()) 检查了资源名称;我得到了正确的名称,并尝试了 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/zh/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 #:
静态

多么明显的一点,我看了两天都没注意到)。

非常感谢!


一切都运行得很完美,使用你的库在算法之间交换自定义结构的能力对我的交易帮助很大,向你致敬!