下载MetaTrader 5

请观看如何免费下载自动交易

有趣的脚本?
因此发布一个链接 -
让其他人评价

喜欢这个脚本? 在MetaTrader 5客户端尝试它

2014.02.13 07:13
程序库

对象模拟器 - MetaTrader 5程序库

| Chinese English Русский Español Deutsch 日本語 Português

显示:
583
等级:
投票: 34
\MQL5\Indicators\\MQL5\Scripts\\MQL5\Include\

描述

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。

例子

EURUSD, H1, MetaQuotes Software Corp., MetaTrader 5, 演示

//+------------------------------------------------------------------+
//|    使用对象模拟器举例                                               |
//+------------------------------------------------------------------+
#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 Software Corp. 撰写的俄文原文
官方代码: https://www.mql5.com/ru/code/1583

MinPriceChange MinPriceChange

价格变化最小合计指标, 在横盘走势之后, 潜在的双边突破之前形成信号。

假突破计数器 假突破计数器

该指标显示指定周期内假突破的数量

Renko 线突破 Renko 线突破

该 Renko 线突破指标检测它自己的合成 renko 图表以及三线突破

PairsTrade_Light PairsTrade_Light

该指标用于货币对之间交易。它是 "ind_2_linep1.mq5" 指标的简化变种