文章 "MQL5 简介:如何编写简单的EA 交易和自定义指标" - 页 2

 
Rosh:

对于指示器缓冲区,上面写着SetIndexBuffer

对于智能交易系统应该类似,请查看

尚无类比。检查这段代码时

//+------------------------------------------------------------------+
//|Test002.mq5 | |
//+------------------------------------------------------------------+
double high[];
int bars;
//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bars=Bars(Symbol(),PERIOD_CURRENT);
   ArraySetAsSeries(high,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 专家去初始化函数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| 专家勾选功能|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int copied=CopyHigh(Symbol(),0,0,bars,high);
   return;
  }
//+------------------------------------------------------------------+

我在返回 操作符对面设置了一个断点。调试器产生了以下结果:high "dynamic array[8563], S"。我知道 S 代表 "系列"。

 
Yedelkin:

这个比喻还不起作用。在检查这段代码时

我在返回 操作符对面设置了一个断点。调试器产生了如下结果:high "dynamic array[8563], S"。我知道 S 代表 "系列"。

那为什么不工作呢?如果有疑问,请使用ArrayGetAsSeries 函数对系列进行显式检查:

//+------------------------------------------------------------------+
//|Test_ArraySetAsSeries.mq5
//| Copyright 2010, MetaQuotes Software Corp.
//|http://www.mql5.com ||
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
double high[];
int bars;
//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bars=Bars(Symbol(),PERIOD_CURRENT);
   ArraySetAsSeries(high,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 专家勾选功能|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int copied=CopyHigh(Symbol(),0,0,bars,high);
   bool IsSeries=ArrayGetAsSeries(high);
   return;
  }
//+------------------------------------------------------------------+

结果


 
Rosh писал(а) :

为什么不起作用?如果有疑问,请使用ArrayGetAsSeries 函数设置明确的序列性检查:

让我提醒你我在说什么。我问的是数组是否应该总是在复制后才进行索引。你提到了SetIndexBuffer 函数注释,并说EA 也应如此SetIndexBuffer 函数注释暗示"在链接后,动态数组 缓冲区[] 将像普通数组一样被编入索引,即使链接的数组预先设置为像时序 数组一样编入索引"。

因此,我认为可以类比 EA,即在使用 CopyTime、CopyHigh 和 CopyLow 函数后,接收数组也必须像普通数组一样进行索引。为了测试这种类比,我将 ArraySetAsSeries 函数放在了 CopyHigh 函数之前,放在了 OnInit() 函数中。但我的示例和你建议的ArrayGetAsSeries 函数对序列化的明确检查显示,使用 CopyHigh 函数后,接收数组 high[] 的预设索引(如时间序列)没有改变。这反过来又表明,你提到的与SetIndexBuffer 函数的类比还没有被观察到,因为否则显式序列性检查就应该显示 IsSeries=false 了。

 

Yedelkin:

为了测试这个类比,我在 OnInit() 函数中将 ArraySetAsSeries 函数放在了 CopyHigh 函数之前。但我的例子和你建议的ArrayGetAsSeries 函数对序列化的明确检查表明,使用 CopyHigh 函数后,接收数组 high[] 的预设索引(如时间序列)并没有改变。

实际上,我的意思是,在 OnInit() 或其他函数中为全局数组设置序列化后,该序列化在其他任何地方都不会改变。唯一的例外与SetIndexBuffer() 函数有关。

我相信我们已经就这个问题达成了一致,可以认为这个问题已经解决。

 

是的,问题已经回答。感谢您的澄清!

 

有几个问题。

1.

   if(CopyTime(Symbol(),0,0,i,t)<i || CopyHigh(Symbol(),0,0,i,h)<i || CopyLow(Symbol(),0,0,i,l)<i)
     {
      Print("复制时间序列失败!");
      return;
     }

据说 "在if...操作符中,返回 操作符用于终止OnTick 函数的执行"。

难道OnTick 是来自if (....) {...}?

2.

   for(i=0;i<PositionsTotal();i++) {…}

MQL4 中,建议使用反向搜索。

for(i= PositionsTotal();i>0;i--) {…}
哪种方法更好?

3.下载智能交易系统和指标(Opera 10.54 版主,下载附件有问题)。全部编译完毕。上个月开始在M5 上选择测试器。

日志

2010.05.15 13:16:02 Core 1 断开连接

2010.05.15 13:16:01 Core 1 Log file "D:\MetaTrader 5\Tester\Agent-127.0.0.0.1-3000\logs\20100515.log" written

2010.05.15 13:16:01 Core 1 EURUSD,M5: 553908 ticks (2580 bars) generated within 1431016 ms (total bars in history 100352)

2010.05.15 13:16:01 核心 1 OnTester 结果 0

2010.05.15 12:52:13 核心 1 EURUSD,Daily: 历史始于 2009.01.02 00:00

2010.05.15 12:52:13 Core 1 EURUSD,Daily: 历史缓存为预计的 355 条保留

2010.05.15 12:52:13 Core 1 EURUSD: 包含从 2009.01.02 06:01 到 2010.05.03 00:00 的开始数据的 484483 M1 记录

2010.05.15 12:52:10 核心 1 Lots=0.100000

2010.05.15 12:52:10 核心 1 MAper=240

2010.05.15 12:52:10 Core 1 EndHour=19

2010.05.15 12:52:10 核心 1 StartHour=7

2010.05.15 12:52:10 Core 1 EURUSD,M5: 测试 Experts\expert.ex5 从 2010.05.01 00:00 到 2010.05.14 00:00 开始,有输入:

执行时间非常长,没有开立一笔交易。允许自动交易。日志中没有任何信息 ((( (编辑可能我还不知道如何找到它们)。指标和智能交易系统位于它们应该在的位置。Windows XP,MT (build 274)。

4.尝试了调试模式,但不起作用。可能是因为周六。没有引号。我按照文章中的方法设置了停止点。如果我是对的,那就太遗憾了,原来只能在工作日调试。如果能上传包含必要数据和(或)一些典型数据(让它成为一天的历史片段)的自己的文件,那将会是很好的调试方式,这样就足够调试了。

5.如果有人研究过复制 功能......请分享一下如果缺少条形图,它是如何工作的。不过最好还是写一篇文章。

 
Prival:

有几个问题。

1. 据说 "在if...操作符中,返回 操作符用于终止OnTick 函数的执行"。

OnTick 函数吗?而不是if (....) {...}?

返回操作符 return 的说明中可以看出

Оператор return прекращает выполнение текущей функции и возвращает управление 
вызвавшей программе. Результат вычисления выражения возвращается вызываемой 
функции. Выражение может содержать оператор присваивания.

本例中返回 语句的当前函数是OnTick() 函数。

私信

4.尝试了调试模式,没有成功。可能是因为周六。没有引号。我按照文章中的方法设置了停止点。如果我是对的,那就太遗憾了,原来只能在工作日调试。如果能上传包含必要数据和(或)一些典型数据(让它成为一天的历史片段)的自己的文件,那将会非常有利于调试,这对调试来说就足够了。

本网站已经讨论过类似的调试问题。如果您感兴趣,请使用搜索,搜索 "调试"。

 

加载自动更新(构建 275)后,编译器开始在检查以下类型条件的行中生成警告

if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
警告类型相同:
implicit enum conversion Perito02-04 temp3.mq5 1233 45
问题:编译器的正确运行是否意味着在指定情况下会出现这些警告?我们所说的 "转换 "是什么意思?
 
Yedelkin :

加载自动更新(构建 275)后,编译器开始在检查类型条件的行中产生警告。

警告类型相同:问题:编译器的正确工作是否意味着在指定情况下会出现这些警告?

引入警告是为了让程序员注意并仔细检查他们的代码。

您可以通过明确地将函数结果转换为枚举器或将枚举器转换为 int 来消除警告。

 
Prival:

有几个问题。

1. 据说 "在if...操作符中,返回 操作符用于终止OnTick 函数的执行"。

OnTick 是......,而不是if (....) {......}?

如果运算符中至少有一个条件

if(CopyTime(Symbol(),0,0,i,t)<i || CopyHigh(Symbol(),0,0,i,h)<i || CopyLow(Symbol(),0,0,i,l)<i)

至少有一个条件满足,即至少有一个数组无法完全复制(没有足够的历史数据或发生错误) -OnTick 函数 将被终止,因为没有这些数据就无法进行进一步计算。

2. MQL4,建议使用反向枚举。

什么更好?

变量

for(i=0;i<PositionsTotal();i++)

и

for(i=PositionsTotal()-1;i>=0;i--)

是等价的,但第一个变量的文本形式更短,所以使用了它。

3.下载 "智能交易系统 "和指标(版主Opera 10.54 下载附件有问题)。全部编译完成。我在M5 上的测试器中运行了它,选择了上个月的情况。

执行时间很长,而且没有开仓。允许自动交易。日志中没有任何信息 ((( (我可能还不知道如何找到它们)。指标和智能交易系统位于它们应该在的位置。Windows XP,MT (build 274)。

4.尝试了调试模式,没有成功。可能是因为周六。没有引号。我按照文章中的方法设置了停止点。如果我是对的,那就太遗憾了,原来只能在工作日调试。如果能上传包含必要数据和(或)一些典型数据(让它成为一天的历史片段)的自己的文件,那对调试来说就更好了,这样就足够调试了。

5.如果有人研究过复制 功能......请分享一下如果缺少条形图,它是如何工作的。不过最好还是写一篇文章。

老实说,我的测试器工作得也不是很好:测试时间比在 MQL4 中测试类似 EA 的时间要长得多;交易只在测试间隔的前一两天打开(在测试不同的智能交易系统时观察到这种情况)。

OnTick 和 OnCalculate 函数在收到新报价时启动,因此调试时必须收到报价(周末无法工作)。否则,调试器将正常工作(请试用,如有需要请联系我)。

关于数组-时间序列: - 数组的方向可以随时双向改变,数组在内存中的位置不会改变,只是索引发生了变化(从0,1,2,......,最后最后,......,2,1,0