- 显示:
- 2079
- 等级:
- 已发布:
- 2014.02.13 07:13
- 已更新:
- 2014.12.16 14:14
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
描述
MetaTrader 4 允许 EA 在测试时使用对象。图表对象可以在测试结束时打开。箭头可便利地观察 EA 执行时的操作, 但是条件不允许。这里有许多用法例子。
与 MetaTrader 4 版本比较, 我们不能在 MetaTrader 5 的测试中使用对象。这个情况不适合我。!好吧, 让我们来解决它。
注释:
在 MetaTrader 5 中创建不使用对象的 EA。对象模拟器可以从对象得到数据, 但是我不建议那样做, 因为测试处理时会变得很慢并且与官方功能有所差异。
对象模拟器仅在测试之后才会在图表中显示对象。
设置
在 tester.tpl 测试员模板中加入 ObjectEmul_indicator 指标。
对于这些谁也不知道如何做:
- 在任何货币对中打开图表。
- 甩出 ObjectEmul_indicator 指标。
- 在图表中右键点击。
- 模板 => 指定 "测试员" 文件名保存模板。
使用
在 MetaTrader 5 策略测试员的设置中, "打开图表" 按钮被移除。如果 EA 在测试中不能执行交易操作, 图表不会自动出现。您不得不切换到 "向后测试", 右键点击并选择 "打开图表"。
在使用之前, 把 ObjectEmul_UnitTest_script 挂到空图表并在 "专家" 选卡中读取日志来了解它与官方对象函数工作的不同之处。
加入 EA 主文件:
#include <ObjectEmul.mqh>
CObjectEmul _objs;
并改变 Object to _objs.Objct 标准函数。
运行对象函数帮助, 在编辑器中您只需加入字母 "e" 到 "Object" 并按 F1。
例子
//+------------------------------------------------------------------+ //| 使用对象模拟器举例 | //+------------------------------------------------------------------+ #include <ObjectEmul.mqh> CObjectEmul _objs; int ZigZag; datetime lastbar=0; double trianglePrice[3]; datetime triangleTime[3]; int triangleIndex=0; int OnInit() { ZigZag=iCustom(_Symbol,_Period,"Examples\\ZigZag",5,5,3); MathSrand(GetTickCount()); return(0); } void OnTick() { datetime time[]; CopyTime(_Symbol,_Period,0,15,time); if(lastbar==time[0]) return; lastbar=time[0]; double zgbuffer[]; if(CopyBuffer(ZigZag,0,0,15,zgbuffer)==0) {Print("CopyBuffer(ZigZag) 错误"); return;} bool first=true; for(int x=0,count=ArraySize(zgbuffer);x<count && triangleIndex<3;x++) { // 此处有些错误, 但我喜欢这个结果 :) if(zgbuffer[x]>0 && first) {first=false; x+=3;} else if(zgbuffer[x]>0 && (triangleIndex==0 || trianglePrice[triangleIndex-1]!=zgbuffer[x])) { trianglePrice[triangleIndex]=zgbuffer[x]; triangleTime[triangleIndex]=time[x]; triangleIndex++; break; } else if(zgbuffer[x]>0) break; } if(triangleIndex<3) return; string objname="ObjectEmul_Demo_"+(string)(int)lastbar; ////////////////////////// // 对象模拟器 // 标准 Object*() 模拟 if(_objs.ObjctCreate(0,objname,OBJ_TRIANGLE,0, triangleTime[0],trianglePrice[0],triangleTime[1],trianglePrice[1])) { _objs.ObjctSetInteger(0,objname,OBJPROP_TIME,2,triangleTime[2]); _objs.ObjctSetDouble(0,objname,OBJPROP_PRICE,2,trianglePrice[2]); _objs.ObjctSetInteger(0,objname,OBJPROP_COLOR,(MathRand()%255)*(MathRand()%255)*(MathRand()%255)); // 使用索引举例 int index=_objs.ObjctFindIndex(0,objname); if(index>-1) _objs.ObjctSetIntegerIndex(index,OBJPROP_FILL,0,true); } else Print("对象创建错误"); // 对象模拟器 ////////////////////////// trianglePrice[0]=trianglePrice[1]; triangleTime[0]=triangleTime[1]; trianglePrice[1]=trianglePrice[2]; triangleTime[1]=triangleTime[2]; triangleIndex=2; }
变量
- string FileName - 文件名。它是省缺的, 但您可以修改它。
- bool SaveAuto = false - 当删除类对象时, 我们将保存对象到文件中?省缺 "true" 值仅用来简单测试。
函数
所有图形 Object*() 对象已被实现, 但有 Objct*() 名字。但是没有模拟 TextSetFont(), TextOut() 和 TextGetSize()。
- int Count() - 对象数量。
- void ReleaseAll() - 删除所有对象 (比 ObjctDeleteAll 更快)。
- bool LoadFile(string fname = "", bool print_error = false) - 从文件中下载对象。
- bool SaveFile(string fname = "", bool print_error = false) - 保存对象至文件。
- void DrawAll() - 在图表中绘制所有对象。
这里的 Objct*Index() 函数也是加速工作:
- int ObjctFindIndex(long chart_id, string name) - 与 ObjctFind() 比较并返回对象序列号。
为了避免重载的模糊性, 我决定选择另外的函数用来索引。这些函数不调用 ObjctFindIndex() 来搜寻, 并且 对象必须被控制对它们的使用!
ObjctSetInteger(0,"objname",OBJPROP_STYLE,STYLE_DASH) == ObjctSetIntegerIndex(ObjctFindIndex(0,"objname"),OBJPROP_STYLE,STYLE_DASH);
这个 LoadFile() 函数使用这些函数, 但是 Count() 函数显示所有对象的数量。
确定这些事情应该在实现中得到解决, 但我需要找到一些决定。当然, 我将尝试更新这个库, 并希望得到社区帮助。
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/1583
![Renko 线突破](https://c.mql5.com/i/code/indicator.png)
该 Renko 线突破指标检测它自己的合成 renko 图表以及三线突破
![PairsTrade_Light](https://c.mql5.com/i/code/indicator.png)
该指标用于货币对之间交易。它是 "ind_2_linep1.mq5" 指标的简化变种