文章 "MQL5 简介:如何编写简单的EA 交易和自定义指标" - 页 2 12345 新评论 Yedelkin 2010.05.14 08:16 #11 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 代表 "系列"。 Rashid Umarov 2010.05.14 08:29 #12 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; } //+------------------------------------------------------------------+ 结果 Yedelkin 2010.05.14 09:18 #13 Rosh писал(а) #:为什么不起作用?如果有疑问,请使用ArrayGetAsSeries 函数设置明确的序列性检查: 让我提醒你我在说什么。我问的是数组是否应该总是在复制后才进行索引。你提到了SetIndexBuffer 函数注释,并说EA 也应如此。SetIndexBuffer 函数注释暗示"在链接后,动态数组 缓冲区[] 将像普通数组一样被编入索引,即使链接的数组预先设置为像时序 数组一样编入索引"。 因此,我认为可以类比 EA,即在使用 CopyTime、CopyHigh 和 CopyLow 函数后,接收数组也必须像普通数组一样进行索引。为了测试这种类比,我将 ArraySetAsSeries 函数放在了 CopyHigh 函数之前,放在了 OnInit() 函数中。但我的示例和你建议的ArrayGetAsSeries 函数对序列化的明确检查显示,使用 CopyHigh 函数后,接收数组 high[] 的预设索引(如时间序列)没有改变。这反过来又表明,你提到的与SetIndexBuffer 函数的类比还没有被观察到,因为否则显式序列性检查就应该显示 IsSeries=false 了。 MQL5 简介:如何编写简单的EA 交易和自定义指标 掌握 MQL5:从入门到精通(第四部分):关于数组、函数和全局终端变量 Rashid Umarov 2010.05.14 09:31 #14 Yedelkin:为了测试这个类比,我在 OnInit() 函数中将 ArraySetAsSeries 函数放在了 CopyHigh 函数之前。但我的例子和你建议的ArrayGetAsSeries 函数对序列化的明确检查表明,使用 CopyHigh 函数后,接收数组 high[] 的预设索引(如时间序列)并没有改变。 实际上,我的意思是,在 OnInit() 或其他函数中为全局数组设置序列化后,该序列化在其他任何地方都不会改变。唯一的例外与SetIndexBuffer() 函数有关。我相信我们已经就这个问题达成了一致,可以认为这个问题已经解决。 Yedelkin 2010.05.14 09:40 #15 是的,问题已经回答。感谢您的澄清! Prival 2010.05.15 14:01 #16 有几个问题。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" written2010.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 结果 02010.05.15 12:52:13 核心 1 EURUSD,Daily: 历史始于 2009.01.02 00:002010.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.1000002010.05.15 12:52:10 核心 1 MAper=2402010.05.15 12:52:10 Core 1 EndHour=192010.05.15 12:52:10 核心 1 StartHour=72010.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.如果有人研究过复制 功能......请分享一下如果缺少条形图,它是如何工作的。不过最好还是写一篇文章。 错误、漏洞、问题 关于MQL5向导和标准交易类库的问题 Errors, bugs, questions Yedelkin 2010.05.15 14:59 #17 Prival:有几个问题。1. 据说 "在if...操作符中,返回 操作符用于终止OnTick 函数的执行"。是OnTick 函数吗?而不是if (....) {...}? 从返回操作符 return 的说明中可以看出:Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе. Результат вычисления выражения возвращается вызываемой функции. Выражение может содержать оператор присваивания. 本例中返回 语句的当前函数是OnTick() 函数。 私信: 4.尝试了调试模式,没有成功。可能是因为周六。没有引号。我按照文章中的方法设置了停止点。如果我是对的,那就太遗憾了,原来只能在工作日调试。如果能上传包含必要数据和(或)一些典型数据(让它成为一天的历史片段)的自己的文件,那将会非常有利于调试,这对调试来说就足够了。 本网站已经讨论过类似的调试问题。如果您感兴趣,请使用搜索,搜索 "调试"。 Yedelkin 2010.05.21 07:53 #18 加载自动更新(构建 275)后,编译器开始在检查以下类型条件的行中生成警告if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) 警告类型相同: implicit enum conversion Perito02-04 temp3.mq5 1233 45 问题:编译器的正确运行是否意味着在指定情况下会出现这些警告?我们所说的 "转换 "是什么意思? Ilyas 2010.05.21 09:16 #19 Yedelkin :加载自动更新(构建 275)后,编译器开始在检查类型条件的行中产生警告。 警告类型相同:问题:编译器的正确工作是否意味着在指定情况下会出现这些警告? 引入警告是为了让程序员注意并仔细检查他们的代码。您可以通过明确地将函数结果转换为枚举器或将枚举器转换为 int 来消除警告。 Denis Zyatkevich 2010.06.07 17:20 #20 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)。 12345 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
对于指示器缓冲区,上面写着SetIndexBuffer:
对于智能交易系统应该类似,请查看
尚无类比。检查这段代码时
我在返回 操作符对面设置了一个断点。调试器产生了以下结果:high "dynamic array[8563], S"。我知道 S 代表 "系列"。
这个比喻还不起作用。在检查这段代码时
我在返回 操作符对面设置了一个断点。调试器产生了如下结果:high "dynamic array[8563], S"。我知道 S 代表 "系列"。
那为什么不工作呢?如果有疑问,请使用ArrayGetAsSeries 函数对系列进行显式检查:
结果
为什么不起作用?如果有疑问,请使用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...操作符中,返回 操作符用于终止OnTick 函数的执行"。
难道OnTick 是来自if (....) {...}?
2.
在MQL4 中,建议使用反向搜索。
哪种方法更好?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.如果有人研究过复制 功能......请分享一下如果缺少条形图,它是如何工作的。不过最好还是写一篇文章。
有几个问题。
1. 据说 "在if...操作符中,返回 操作符用于终止OnTick 函数的执行"。
是OnTick 函数吗?而不是if (....) {...}?
从返回操作符 return 的说明中可以看出:
Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе. Результат вычисления выражения возвращается вызываемой функции. Выражение может содержать оператор присваивания.
本例中返回 语句的当前函数是OnTick() 函数。
4.尝试了调试模式,没有成功。可能是因为周六。没有引号。我按照文章中的方法设置了停止点。如果我是对的,那就太遗憾了,原来只能在工作日调试。如果能上传包含必要数据和(或)一些典型数据(让它成为一天的历史片段)的自己的文件,那将会非常有利于调试,这对调试来说就足够了。
本网站已经讨论过类似的调试问题。如果您感兴趣,请使用搜索,搜索 "调试"。
加载自动更新(构建 275)后,编译器开始在检查以下类型条件的行中生成警告
警告类型相同: 问题:编译器的正确运行是否意味着在指定情况下会出现这些警告?我们所说的 "转换 "是什么意思?加载自动更新(构建 275)后,编译器开始在检查类型条件的行中产生警告。
警告类型相同:问题:编译器的正确工作是否意味着在指定情况下会出现这些警告?引入警告是为了让程序员注意并仔细检查他们的代码。
您可以通过明确地将函数结果转换为枚举器或将枚举器转换为 int 来消除警告。
有几个问题。
1. 据说 "在if...操作符中,返回 操作符用于终止OnTick 函数的执行"。
OnTick 是......,而不是if (....) {......}?
如果运算符中至少有一个条件
至少有一个条件满足,即至少有一个数组无法完全复制(没有足够的历史数据或发生错误) -OnTick 函数 将被终止,因为没有这些数据就无法进行进一步计算。
2. 在 MQL4 中 ,建议使用反向枚举。
什么更好?变量
и
是等价的,但第一个变量的文本形式更短,所以使用了它。
3.下载 "智能交易系统 "和指标(版主Opera 10.54 下载附件有问题)。全部编译完成。我在M5 上的测试器中运行了它,选择了上个月的情况。
执行时间很长,而且没有开仓。允许自动交易。日志中没有任何信息 ((( (我可能还不知道如何找到它们)。指标和智能交易系统位于它们应该在的位置。Windows XP,MT (build 274)。
4.尝试了调试模式,没有成功。可能是因为周六。没有引号。我按照文章中的方法设置了停止点。如果我是对的,那就太遗憾了,原来只能在工作日调试。如果能上传包含必要数据和(或)一些典型数据(让它成为一天的历史片段)的自己的文件,那对调试来说就更好了,这样就足够调试了。
5.如果有人研究过复制 功能......请分享一下如果缺少条形图,它是如何工作的。不过最好还是写一篇文章。
老实说,我的测试器工作得也不是很好:测试时间比在 MQL4 中测试类似 EA 的时间要长得多;交易只在测试间隔的前一两天打开(在测试不同的智能交易系统时观察到这种情况)。
OnTick 和 OnCalculate 函数在收到新报价时启动,因此调试时必须收到报价(周末无法工作)。否则,调试器将正常工作(请试用,如有需要请联系我)。
关于数组-时间序列: - 数组的方向可以随时双向改变,数组在内存中的位置不会改变,只是索引发生了变化(从0,1,2,......,最后 到最后,......,2,1,0)。