来自一个 "傻瓜 "的问题 - 页 262

 
agvozdezkiy:

刚开始学习MQL,在这里我写了一个EA,它画了一个iMA,并在iMA中的鼠标指针在时间轴上的位置画了一条切线(非常接近)。

问题一。专家顾问的速度非常慢。这意味着切线被重绘了很长时间,而且它不跟随鼠标的移动...

看看我的版本。

//+------------------------------------------------------------------+
//|                                                Antonio_Mouse.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
int Handle_iMA;
double Buffer_iMA[];
string Name_iMA;
datetime TimeArray[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---Устанавливаем свойство графика посылать события при движении мышы     
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---Рисуем индикатор iMA
   Handle_iMA=iMA(NULL,0,10,0,MODE_SMA,PRICE_CLOSE);
   if(Handle_iMA!=INVALID_HANDLE)
     {
      ChartIndicatorAdd(0,0,Handle_iMA);
      Print("iMA скопировано в буффер.");
     }
//---
   string name="Line";
   ObjectCreate(0,name,OBJ_TREND,0,0,0);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clrRed);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,10);
   ObjectSetInteger(0,name,OBJPROP_BACK,true);
   ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,false);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(Handle_iMA);
  }
datetime CarrentBarTime[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
  }
double PriceCoord,Angle;
datetime TimeCoord;
int SubWindow,BarPos,X1,Y1,X2,Y2;
int prevX=-1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &XCoord,
                  const double &YCoord,
                  const string &SParam)
  {
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      int x=(int)XCoord;
      int y=(int)YCoord;
      if(x==prevX) return;
      CopyTime(NULL,0,0,1,CarrentBarTime);
      //---
      ChartXYToTimePrice(NULL,x,y,SubWindow,TimeCoord,PriceCoord);
      if(TimeCoord>CarrentBarTime[0]) return;
      CopyBuffer(Handle_iMA,0,TimeCoord+PeriodSeconds(),2,Buffer_iMA);
      //---
      string name="Line";
      ObjectSetDouble(0,name,OBJPROP_PRICE,0,Buffer_iMA[0]);
      ObjectSetInteger(0,name,OBJPROP_TIME,0,TimeCoord);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,Buffer_iMA[1]);
      ObjectSetInteger(0,name,OBJPROP_TIME,1,TimeCoord+PeriodSeconds());
      //---
      ChartRedraw();
      prevX=x;
     }
  }

在我的笔记本电脑上--一切都在飞翔!

 

我第一次调用对象创建 函数时得到错误5040(字符串类型的参数损坏)。

void  CreateTL(string name,datetime time1,double price1,datetime time2,double price2,bool ray_left,bool ray_right,color color_TL)
  {
//------------ nTL,nTLh,nTLl,nTLe
   nTL="nTL_"+IntegerToString(MathRand());
   nTLh="nTLh_"+IntegerToString(MathRand());
   nTLl="nTLl_"+IntegerToString(MathRand());
   nTLe="nTLe_"+IntegerToString(MathRand());
//------------
   ObjectCreate(0,name,OBJ_TREND,0,time1,price1,time2,price2);
   ObjectSetInteger(0,name,OBJPROP_COLOR,color_TL);
   ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray_left);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray_right);
   ObjectSetInteger(0,name,OBJPROP_BACK,true);
  };

如果在调用前设置

nTL="";

错误4002(内部调用客户终端函数时参数无效)。

如果在调用前设置

nTL="a";

第一个对象将被命名为a。

我这样称呼它

if(hlp_var==high_low)
     {
      //CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color);
      CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color);
      CreateTL(nTLe,dt[1],pr[0],dt[1],pr[1],false,false,nTL_color);
      CreateTL(nTLh,dt[0],pr[0],dt[1],pr[0],false,true,nTL_color);
      CreateTL(nTLl,dt[0],pr[1],dt[1],pr[1],false,true,nTL_color);
      CreateTL(nTL,dt[0],pr[0],dt[1],pr[1],false,true,nTL_color);
      CreateTL(nTL,dt[0],pr[1],dt[1],pr[0],false,true,nTL_color);
      Print("CreateTL GetLastError "+IntegerToString(GetLastError()));
     };

你能告诉我哪里有错误吗?

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 

在旧版本中。

ObjectCreate(0,nTL="nTL_"+IntegerToString(MathRand()),OBJ_TREND,0,time1,price1,time2,price2);

从未发生过任何故障。

是代码中的错误还是终端中的错误?

 
Silent:

你能告诉我错误在哪里吗?

我不知道错误在哪里,但至少可以说,对对象名称 的处理是非常值得怀疑的。
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
不清楚为什么你要在对象的名称中加入一个随机数,这也会导致错误。
 
Silent:

我第一次调用对象创建 函数时得到错误5040(字符串类型的参数被破坏)。

如果在调用前设置

错误4002(内部调用客户终端函数时参数无效)。

如果在调用前设置

第一个对象将被命名为a。

我是这样称呼的

你能告诉我错误在哪里吗?

你是否因为Get LastError打印的内容不是零而担心?如果是这样,你应该只在函数报告失败时才调用错误。而且,你不应该在情节的最后要求出错,你可能会得到一个垃圾值。在MT4中是这样的,也许在这里是不同的。

伪代码。

if( ! ObjectCreate(...) )
    Print( GetLastError() );
 
Silent:

我第一次调用对象创建 函数时得到错误5040(字符串类型的参数被破坏)。

如果在调用前设置

错误4002(内部调用客户终端函数时参数无效)。

如果在调用前设置

第一个对象将被命名为a。

我这样称呼它

你能告诉我错误在哪里吗?

尝试通过StringConcatenate()来 "粘合 "字符串

 
TheXpert:
我不知道错误出在哪里,但说句不好听的,对对象名称 的处理是非常有问题的。
我又要绞尽脑汁地想一个星期了。你能更详细地描述一下吗?(你可以很粗鲁 :))
zfs
不清楚为什么你需要在对象名称中加入一个随机数,这可能导致错误。

对于几百个具有独特名称的对象,是否有其他选择?

(一组对象的名称中应该有相同部分的字符串,以删除该组)。

 
220Volt:

你是否因为Get Last Errors的打印结果不是零而担心?如果是这样,你应该只在函数报告失败的情况下询问错误。而且,你不应该在情节的最后要求出错,你可能会得到一个垃圾值。在MT4中是这样的,也许这里不同。

不是,因为第一次调用由于错误而没有创建一个对象。我复制了(目前)第一次调用的线路,然后从第二次运行中创建。
 
220Volt:

你是否因为Get Last Errors的打印结果不是零而担心?

那么,从逻辑上讲,如果该函数根本就设置了最后一个错误,那么在成功完成该函数时,应该有一个零错误或文档中描述的值。没有其他办法。

也就是说,如果调用成功且错误非零,这种情况必须在文档中加以描述。

沉默不语

我将这样绞尽脑汁,再过一周。我可以给你一些更多的细节吗?(你可能是粗鲁的:))

通常同一类型的对象的名称是由共同部分组成的,以便于删除(在你的例子中是 "nTL_")和区别。我还使用了模块标识符,如果图表上可以同时有多个这样的非常模块。

差异可以是任何东西,甚至是一个计数器,你每次创建一个对象时都会增加它。但最好按逻辑进行区分--对象时间、对象坐标,目标是实现保证唯一性。其副作用是,通过重复构建一个名称,你可以改变你需要的对象 的属性。

随机并不提供这种 "保证的唯一性"。

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5