我的方法。核心是引擎。 - 页 92

 
Maxim Kuznetsov:

用于EA、指标和脚本之间的数据交换的唯一的GlobalVariables和文件是

以上4点都是当地的 "黑科技",因为缺鱼。以上4点使用的机制都不是为交换任意数据而设计的,更不用说数据阵列了。

你会认为GlobalVariables是专门为信息传递设计的。这样说太傻了。事实上,它和其他物品的黑客是一样的。

 
fxsaber:


...粗略地说,一个完整的写/读嘀嗒循环在资源中的运行速度为每秒400万次

对资源的读/写是非常快的。但这在多大程度上适合这样的传输。

1.A线。计时器事件。收集所有在事件中被改变的参数值,并将它们翻译成一个字符串。将字符串翻译成Char,写到资源中。向B方发送消息。

2.B方。OnChartEvent()事件,收到一个消息信号,打开资源,读取它,用新的值填充参数内核,重新绘制所需的元素。

如果这个事件以定时器的频率连续执行呢?

问题是,如果有其他选择,如何最好地利用资源来做这件事。

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

  • EventChartCustom()选项有两个缺点。

  1. 包裹变得在事件队列中。
  2. 包裹的长度不能超过127个字符。因此,一个1000个字符的信息必须被分割,然后再重新组合起来。而消息的每一部分都会在事件队列中。
  • 通过图对象的变体,需要将消息分割成64个字符的包,写成对象描述,然后再重新组合。有趣的是,这种变体是最快的,但随着字符串长度的增加,其速度也会下降。也就是说,每次调用ObjectSetString() 需要3微秒的时间。但如果一个字符串有1000个字符,我们需要把它分成64个字符,这意味着我们需要调用ObjectSetString()大约8次。8*3=24ms。然后用同样的时间来组装绳子。这就是为什么如果字符串有10 000个字符长,这个方法肯定会接近通过资源工作的方法的速度。(我说的是保存和读取资源的时间+将字符串转为uint再转回的时间)。
资源变体到最后仍然没有得到检验。我今天会在测试器中进行测试,最后会清楚它是否可以普及。
 
Реter Konow:

如果这个事件以定时器的频率连续执行呢?

问题是,如果有其他选择,如何最好地利用资源来做这件事。

关于交易、自动交易系统和策略测试的论坛

程序之间的数据交换

fxsaber, 2018.11.21 13:12

可能有很多时间可以如此详细地描述各种互动的选择。不幸的是,我并不拥有这样的资源。

这里有一篇关于这个问题的文章,其中有一个完整的互动。每座建筑都是由砖块建成的,并用于特定的任务。所有可能的砖块都显示在该主题的开头。其余的就由建造者决定了。

 
fxsaber:

这篇文章没有测试两个程序通过资源的通信,其中一个在测试器中。

 

工会有什么问题?请举一个例子。

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:

这篇文章没有测试两个程序通过资源的通信,其中一个在测试器中。

阅读关于砖头的句子。

 
fxsaber:

...

这篇文章是在向麻雀开炮。像许多文章一样。我宁愿自己解决这个问题,也不愿理解这篇文章。

一切都可以做得更容易和更清楚。但是,这篇文章是一个非常容易的地狱...


而且,如果你说你没有检查过测试器中的资源操作,那么这篇文章有什么用呢?

 
Ре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!");
   //-----------------------------
   
  }
//+------------------------------------------------------------------+