初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1284

 
Youri Lazurenko:

再次感谢,现在的线就像一条线,很好看。只有ObjectDelete(0, name);;是需要的,否则一旦画出的线就不会重画。在mql4中也一样,我只是忘了。

我本可以这样做

bool CreateLine(string name, datetime time1, double price1, datetime time2, double price2, color clr)
 {
  if(ObjectFind(ChartID(), name) < 0)
    if(!ObjectCreate(ChartID(), name, OBJ_TREND, 0, 0, 0, 0, 0))
     {
      Print("Ошибка в создании линии");
      return (false);
     }
  ObjectSetInteger(ChartID(), name, OBJPROP_COLOR, clr);
  ObjectSetInteger(ChartID(), name, OBJPROP_STYLE, TrendStyle);
  ObjectSetInteger(ChartID(), name, OBJPROP_WIDTH, TrendWidth);
  ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 0, time1);
  ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 1, time2);
  ObjectSetDouble(ChartID(), name, OBJPROP_TIME, 0, price1);
  ObjectSetDouble(ChartID(), name, OBJPROP_TIME, 1, price2);

  ChartRedraw();
  return(true);
 }
 
Vladimir Karputov:

真是一派胡言。绘制的图形对象平稳地移动。每个对象的帮助中都有例子(对于水平线OBJ_HLINE)。

你也可以改变已经画好的对象的任何属性:颜色、风格、气味......。

它是手动完成的,我不争论。但专家顾问是按德马克点来画趋势线的。通过函数ObjectDelete(0, name);,当点发生变化时,旧的趋势线被删除,新的趋势线被绘制如果没有这个函数,第一次绘制的线条就不再重绘。这不是胡说八道,而是一个事实。

Документация по MQL5: Графические объекты / ObjectDelete
Документация по MQL5: Графические объекты / ObjectDelete
  • www.mql5.com
ObjectDelete - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

手动的,我不争论。而专家顾问则是通过德马克点绘制趋势线。通过函数ObjectDelete(0, name);,当点发生变化时,旧的趋势线被删除,新的趋势线被绘制如果没有这个函数,第一次绘制的线条就不再重绘。这不是胡说八道,而是一个事实。

你为什么不读一下帮助?并运行该例子。

 
Alexey Viktorov:

我会这样做的。

谢谢,但我要留下我的变体,它是有效的。尽管我会尝试用它来代替ObjectDelete(0, name);。

 ChartRedraw();
Документация по MQL5: Графические объекты / ObjectDelete
Документация по MQL5: Графические объекты / ObjectDelete
  • www.mql5.com
ObjectDelete - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov:

看在上帝的份上,读读帮助吧!并运行该例子。

我读过参考资料。只有你是愤慨的,而我是在实践中写的。另一件事是使用ChartRedraw() 而不是ObjectDelet(),我没有争论,会检查一下。这是你唯一需要参照例子来指出的事情。

 
Youri Lazurenko:

我已经阅读了该简报。只有你在用文字愤愤不平,而我是在实践中写的。另一件事是用ChartRedraw() 代替ObjectDelet(),我没有争论和检查。这是你唯一需要参照例子来指出的事情。

人们通常在这个主题中征求建议,当他们得到建议时,他们会听从。至少要阅读帮助和应用实例。拜托,如果你不想听别人的意见,就不要问什么。

 
Youri Lazurenko:


举个例子,你可以即时改变"水平线"图形对象的任何属性--你不需要删除该对象就可以做到这一点,你只需要改变该属性。

C:\Users\barab\OneDrive\Изображения\Screenpresso\2021-02-01_16h09_06.gif

代码。

//+------------------------------------------------------------------+
//|                       OBJ_HLINE change properties on the fly.mq5 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- input parameters
input string          InpName="HLine";     // Line name
//--- an array for storing colors contains 14 elements
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- the number of colors
   int size=ArraySize(colors);
//--- get a random value
   int number=MathRand();
//--- get an index in the col[] array as a remainder of the integer devision
   int i=number%size;
//--- set line color
   ObjectSetInteger(ChartID(),InpName,OBJPROP_COLOR,colors[i]);
   ChartRedraw();
  }
//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
附加的文件:
 
Youri Lazurenko:

谢谢,但我要留下我的变体,它是有效的。尽管我将尝试用它来代替ObjectDelete(0, name);。

完全错误的决定。删除一个图形对象和刷新一个图表决不是相互替代的。

我的例子首先检查是否有一个对象,特别是有一个名字为tfyu的趋势,在俄罗斯键盘布局中是名字))。然后,如果它不存在,就画出趋势。如果绘图尝试不成功,将显示该信息,并以返回false退出该函数。

之后的一切,无论趋势是已经存在还是刚刚被画出来,都会被分配到指定的参数、时间和坐标价格、类型、厚度和其他任何你可以添加的东西。之后,图表被更新,函数返回true。

就执行速度而言,检查趋势是否存在的成本将低于删除它并绘制新的趋势。

但是......最终的决定权在你手中,如果你喜欢用你的右手小指抓你的左耳,我无权阻止你。

 
Youri Lazurenko:

再回过头来画趋势线。如果你需要代码。

非常糟糕的代码。

 
Alexey Viktorov:

我想这样做。

如果是我就会这样做。

void CreateLine(string name, datetime time1, double price1, datetime time2, double price2, color clr)
 {
  if(ObjectFind(ChartID(), name) < 0)
   {
    ObjectCreate(ChartID(), name, OBJ_TREND, 0, 0, 0, 0, 0);
    ObjectSetInteger(ChartID(), name, OBJPROP_COLOR, clr);
    ObjectSetInteger(ChartID(), name, OBJPROP_STYLE, TrendStyle);
    ObjectSetInteger(ChartID(), name, OBJPROP_WIDTH, TrendWidth);
   }
   ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 0, time1);
   ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 1, time2);
   ObjectSetDouble(ChartID(), name, OBJPROP_PRICE, 0, price1);
   ObjectSetDouble(ChartID(), name, OBJPROP_PRICE, 1, price2);

  ChartRedraw();
 }