指标: Setka (网格) - 页 2

 
Prival:
在 Code Base 上发布了新版本 3.09,您可以下载。

你可以对它再进行一些改进。

if(ObjectFind(0,nm)<0) ObjectCreate(0,nm,OBJ_VLINE,0,t1,2);

在这种结构中,ObjectFind() 显然是不必要的。当使用ObjectCreate() 创建时,将类似于按名称在列表中搜索,然后创建一个新对象,或更改现有对象的锚点参数。

ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,false);

对于通过 MQL 程序创建的对象,该属性会强制为 false。

同样,更改 OBJPROP_WIDTH 的值也没有意义,因为它无论如何都等于 1。

根据我的测量,这些编辑可以减少大约 10%的创建时间。

 

谢谢,我会记住的我正在做一件事,出了点小问题。

我打开了 8 张图表,上面只有网格。

我模拟断网 5 分钟。这是上网后的图片。

我附上网格的新版本 4.01。

附加的文件:
setka__1.mq5  15 kb
 
Prival:

谢谢,我会记住的我正在做一件事,出了点小问题。

我打开了 8 张图表,上面只有网格。

我模拟断网 5 分钟。这是上网后的图片。

我附上了网格的新版本 4.01。

这是终端架构和指标算法造成的后果。该指标在符号流中执行,即在计算过程中不可能对历史记录进行许多操作:处理刻度线、计算其他指标、与服务器同步历史记录、按符号时间段建立或加载历史记录 等。

由于网格指标的计算时间较长,并使用其他符号时段的数据,因此最好在出现任何错误时中断其计算。如果不想重写代码,可以这样做:

bool isNewBar_i(datetime date,ENUM_TIMEFRAMES timeFrame,bool& error)

  {

...

   else
     {
      Print("Timeframe ",fTimeFrameName(timeFrame)," is not ready");
      error=true;

     }

等等:

      //--- определимся с цветом линии
      if(_Period<PERIOD_H1) if(isNewBar_i(time[i],PERIOD_H1,error) && _Period<PERIOD_M30) line_color=new_hour;
      if(_Period<PERIOD_D1) if(isNewBar_i(time[i],PERIOD_D1,error) && _Period<PERIOD_H4 ) line_color=new_day;
      if(_Period<PERIOD_W1) if(isNewBar_i(time[i],PERIOD_W1,error) && _Period<PERIOD_D1 ) line_color=new_week;
      if(_Period<PERIOD_MN1)if(isNewBar_i(time[i],PERIOD_MN1,error)&& _Period<PERIOD_MN1) line_color=new_mon;
      //---
      if(error) return(0);

附加的文件:
setka.mq5  15 kb
 
antt:

这是终端结构和指标算法的结果。指标是在符号流中执行的,也就是说,在指标的计算过程中不可能对历史数据进行许多操作:处理刻度线、计算其他指标、与服务器同步历史数据、按符号时间段建立或加载历史数据等。

我无法理解 "流 "的概念,我已经阅读了 50 次关于数据访问的帮助(脚本作为示例给出)。执行时间大约需要一分钟(很长),但我似乎开始明白了。我的理解是否正确,当指标正在计算时,即函数开始执行时

int OnCalculate () {
计算机(终端)的所有资源 都给了这项任务,直到执行完毕(完成)为止

return(rates_total); }

不得执行以下任何操作:

- 如果缺少历史记录,则尝试读取该符号的历史记录

- 请求不同的时间段

- 请求另一个符号

我想我明白如何重做程序了,你需要在第一次调用时设置所有行,然后忘记它,直到 if(prev_calculated==0)。

对吗

S.Y.

  1. 交易员- 踩耙子的人。
  2. 傻瓜- 从未踩过耙子,因此确信没有耙子的初学者。
  3. 笨蛋- 经常踩在耙子上,但仍确信耙子不存在的交易者。
  4. 狭窄专家 - 精通踩耙技术的交易者。
  5. 是指同时踩两个以上耙子的交易员。
  6. 机械系统专家- 能够自动执行耙击的交易员。

根据 Renat 的评估,我达到了 5 级 :-)),https://www.mql5.com/ru/forum/1165/page3 更进一步 )))

 

完全重写了代码,不要求其他时间段。

如果您不介意的话。请在 "Unlimit "窗口中设置 mac.bars,然后查看 M15、M5 和 M1。 在日志中公布结果。 我在 M1 上发现了问题 - 我已写信给服务部门。我只想知道是我的问题还是大家的问题。

这是我的日志。

2010.06.17 11:39:55 Grid (EURUSD,M1) Failure or first run Time= 1.2 sec for 1293476 barsObjectsTotal= 48010_time= 2002.10.25 06:41:00
2010.06.17 11:39:52 Grid (EURUSD,M5) Failure or first run Time= 0.0 sec for 847192 bars ObjectsTotal= 423 _time= 2010.06.02 21:35:00
2010.06.17 11:39:48 Grid (EURUSD,M15) Failure or first run Time= 0.0 sec for 285186 bars ObjectsTotal= 962 _time= 2010.05.04 22:00:00

网格版本 4.11

 
Prival:

我无法理解线程的概念,我已经把关于数据访问的帮助阅读了 50 遍(脚本是作为例子给出的)。执行时间大约需要一分钟(很长),但我想我开始明白了。我的理解是否正确,当指标的计算正在进行时,即函数已经开始执行时

http://ru.wikipedia.org/wiki/Thread


int OnCalculate () {
所有计算机(终端)资源 都给了 这个任务,直到它被执行(完成)。

return(rates_total); }

不是所有资源。但与此符号相关的大多数计算都将等待 OnCalculate() 完成。


请勿执行以下操作:

- 尝试读取该符号的历史记录(如果缺少)。

是的,如果当前符号没有足够的历史记录,OnCalculate() 的执行肯定不会更好。


- 请求另一个时间框架

可以请求,但如果数据缺失或不足,在 OnCalculate() 中等待是没有意义的。当前符号的其他指标数据也是如此。

- 请求另一个符号

您可以请求,理论上甚至可以在循环中等待所有必要的数据出现,因为另一个符号(历史、指标)的数据处理是在另一个线程中完成的。但最好不要这样做,OnCalculate() 中的等待循环将停止当前符号的数据处理。

我想我知道如何重做程序了,您需要在第一次调用时设置所有行,如果(prev_calculated==0)就忘掉它。

编写自定义指标时的一般建议是:如果检测到任何错误或缺少数据,立即停止执行 OnCalculate(),并返回(0)。如果(prev_calculated==0),则在下一个交易日重新尝试计算。
 
Prival:

如果不太麻烦的话。在 "Unlimit(限制)"窗口中设置 mac.条形图,然后查看 M15、M5 和 M1。 结果会出现在日志中,请在此发布。 我在 M1 上发现了问题 - 已写信给服务部门。我只是想看看是我的问题还是大家的问题。

2010.06.17 11:58:59 6op0k (EURUSD,M1) Failure or first run Time=0.1sec for 4009008 barsObjectsTotal=403_time=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) 失败或首次运行 Time=0.0sec for 847196 bars ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) Failure or first run Time=0.0sec for 285187 bars ObjectsTotal=1108_time=2010.05.04 22:15:00
 
antt:
2010.06.17 11:58:59 6op0k (EURUSD,M1) 失败或首次运行 时间=0.1秒,共 4009008 个条形 ObjectsTotal=403时间=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) 失败或首次运行 时间=0.0秒 for 847196 bars ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) 失败或首次运行 时间=0.0秒 for 285187 bars ObjectsTotal=1108_time=2010.05.04 22:15:00

谢谢。这意味着我终于写对了所有内容,"指标 "也真的按我的意图运行了。我遇到的故障是终端的问题(您的一切正常)。 _time=2010.06.15 07:45:00 )。 可惜开发人员在服务 dex 中保持沉默。

问题已解决......我们认为......谢谢

 
Prival:

谢谢。这说明我终于写对了所有内容,"指示器 "真的按我的意图运行了。我遇到的故障是终端的问题(您做得很好。 _time=2010.06.15 07:45:00 )。 可惜开发人员在服务 dex 中保持沉默。

问题已解决......我们认为......谢谢。

并能得到纠正:

如果在 H1 gravfik 上携带垂直或水平线,然后切换到另一个时间间隔,与指标无关的线将被删除。

这是一个非常方便的指标,可用于检查历史,直观地确定价格步幅,但由于在切换到较小的时间间隔时,在较早的时间间隔上所做的标记(垂直线和水平线)会消失,因此会让人感觉不舒服。

 

该指标完美解决了在终端窗口中显示价格刻度的问题。

在 3021(含 3021)之前的版本中编译时没有显示任何错误,一切都绘制正常(即使将之前编译的版本添加到终端的新版本中)。

后续版本的编译没有显示任何错误,但在终端中,加法器不绘制垂直标记,并在日志中写道:1 leaked strings left(剩余 1 个泄漏字符串)。

注释掉了这一行:

StringConcatenate(line_name,IntegerToString(str.hour,2,'0'),":":",IntegerToString(str.min,2,'0'),"_N",line_counter);

终端日志中的错误消失了(尽管没有绘制线条)。

如何挖掘?如何重新激活一个伟大的工具?