错误、漏洞、问题 - 页 742

 
TheXpert:
所以要做一个工厂。这将解决这个问题。

在那里工作很容易,因为它是。该物体的结构相当僵硬。它调用其每个成员的虚拟Load方法,它们反过来做同样的事情。在每个数据块(对象)的开头,都写有类型的ID(用于加载时的控制)。这就是它的全部内容。它是一种自制的工厂。

如果以前的未知类型可以在文件中出现,那么做一个工厂是有意义的。 那么就需要工厂和类型注册表了。虽然问题没有这么解决,但我已经用回形针和胶布解决了。:)

 

冈恩的粉丝。

如果第二个锚点 在未来,角度就会改变。

另外,这个对象在复制时有一些问题(按住Ctrl键)。很多时候,它并没有复制,而是拖着原件,而且需要第三次或第五次尝试才能复制。

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов - Документация по MQL5
 
MetaDriver:

好的,太好了。

Slava,我可以问一下(对于一般的开发),为什么你不能在构造函数的开头(在祖先初始化之后)初始化虚拟方法表?

我已经告诉你了。构造函数在一个层次结构中工作。在构建祖先的同时,没有关于后代的信息。
 
stringo:
我以前告诉过你。构造者制定了层次结构。在建立祖先的同时,没有关于后代的信息。

我已经读过了。而且我非常理解它。而我是根据我对所读内容的理解来提问的。 我会努力让它更清楚,用图片来说明。

class MySecond: MyFirst
{
  void  MySecond(MyArg arg): 
    MyFirst(arg)
   { // Можно код инициализации VMT добавлять здесь. Тогда не будет проблем с виртуальными вызовами.
     ...............
     MyVirtualFunc();
      ...........
     return;
   } // Сейчас код инициализации VMT добавляется здесь.

};

我什么都明白,比较难,有各种微妙的东西。把所有的隐式初始化写在最后,要容易得多(对你来说)。而且我甚至事先相信 "没有人这样做","这在C++中是不习惯的 "等等。

但是对于我们(用户)来说,把MySecond()构造函数看作是MySecond类而不是MyFirst类的一个领地,是更简单、更普遍、更合理和更符合逻辑的。想一想什么更容易:是让虚拟函数 在构造函数中工作,还是在文档中多处表达对构造函数代码的重要而严重的限制,尽管如此,还经常收到新手们给服务台和论坛发来的 "关于构造函数中的虚拟错误 "的重要而严重的信息。 这也是一个严重的因素--新手们很快就会有很多期待...

 
struct SDaylyRange {double min, max, open, close;};
void OnStart()
  {
//---
   SDaylyRange tmp, tmp2;
   tmp = 2+3 ? tmp : tmp2;
   if (2+3) tmp = tmp; else tmp = tmp2;
  }

带结构的张量运算符会导致代码生成错误(尽管如果你用if代替它,它就会工作)。

 

我经常收到错误4401

误导性的历史记录。

以下是指标代码

datetime prevTime[22];
MqlRates _Rates[];

bool IsNewBar(ENUM_TIMEFRAMES period) {
   datetime currentTime[1];
   CopyTime(Symbol(), period, 0, 1, currentTime);
   int _;
   switch (period) {
      case PERIOD_M1  : _= 1;
         break;
      case PERIOD_M2  : _= 2;
         break;
      case PERIOD_M3  : _= 3;
         break;
      case PERIOD_M4  : _= 4;
         break;
      case PERIOD_M5  : _= 5;
         break;
      case PERIOD_M6  : _= 6;
         break;
      case PERIOD_M10 : _= 7;
         break;
      case PERIOD_M12 : _= 8;
         break;
      case PERIOD_M15 : _= 9;
         break;
      case PERIOD_M20 : _= 10;
         break;
      case PERIOD_M30 : _= 11;
         break;
      case PERIOD_H1  : _= 12;
         break;
      case PERIOD_H2  : _= 13;
         break;
      case PERIOD_H3  : _= 14;
         break;
      case PERIOD_H4  : _= 15;
         break;
      case PERIOD_H6  : _= 16;
         break;
      case PERIOD_H8  : _= 17;
         break;
      case PERIOD_H12 : _= 18;
         break;
      case PERIOD_D1  : _= 19;
         break;
      case PERIOD_W1  : _= 20;
         break;
      case PERIOD_MN1 : _= 21;
         break;  
      default         : _= 0;    
   } 
   if(currentTime[0]== prevTime[_]) return(false);
   else {
      prevTime[_] = currentTime[0];
      return(true);
   }
}

int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) 
if (IsNewBar(_Period)) {
    int err = CopyRates(Symbol(), PERIOD_D1, 0, 2, _Rates);
   Print("Count:", err);
   if (err < 1) {
       Print("ERROR:", GetLastError());
       Print("__Symbol:", Symbol());
       return(rates_total);
   }

}
return(rates_total); 
}

将在启动时立即产生一个错误(如果不是在D1)。或者说,一旦启动终端 并打开图表后--把指标放上去,我们会得到一个错误。如果终端没有关闭,启动时就不会有这样的错误。

但经过一段时间后(几个小时--对我来说2个小时就够了),我们会看到,在已经打开的图表上会出现错误。(我在M30上运行)

 

各位开发者,你们好!

我们能否在MQL5编译器中进行修改,至少给我们一个警告?

对于代码中的这种错误。

if(Flag_Exitl=true) {break;}


这里的比较条件不正确(应该是==),这就是为什么它总是被打破。

如何在编译器中解决这种情况(如果有可能的话),以便我在写代码时可以不那么颠簸?

(我以为不会成功,似乎在if中把赋值和比较分开,那么问题就被删除了)。

 
Fia:

大师们,你们好!

是否有可能改变MQL5的编译器,至少给出一个警告?

对于代码中的这种错误。

if(Flag_Exitl=true) {break;}


比较条件不正确(应该是==),这就是为什么它总是会被打破。

如何在编译器中解决这种情况(如果有可能的话),使我在写代码时能少些颠簸?

(我想过这是行不通的,我可能会把赋值和比较分在如果,所以问题被删除)。

该条件可能写得不正确,但在MQL5中是允许的。

我将翻译你的编码:Flag_Exitl变量必须被设置为真,然后检查Flag_Exitl是否为真,然后中断。

行动的顺序完全是这样的。

 

我不太明白如何处理那些不需要在屏幕上显示的缓冲区。

根据下面的代码,出于某种原因

1)不画 任何东西

2) 两个缓冲区都被称为Label1

尽管它们包含正确的数据

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   2

//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_color1  clrRed, clrWhite
#property indicator_type1   DRAW_COLOR_LINE

//--- plot Label2
#property indicator_label2  "Label2"
#property indicator_color2  clrRed, clrGreen
#property indicator_type2   DRAW_COLOR_LINE

//--- indicator buffers
double         L1_1[];
double         L2_1[];
double         Colors_1[];

//--- indicator buffers
double         L1_2[];
double         L2_2[];
double         Colors_2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0,L1_1,INDICATOR_DATA);
   SetIndexBuffer(1,L1_2,INDICATOR_DATA);
   SetIndexBuffer(2, Colors_1,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3, Colors_2,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4, L2_1, INDICATOR_CALCULATIONS);
   SetIndexBuffer(5, L2_2, INDICATOR_CALCULATIONS);
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
{
   for (int i = 0; i < rates_total; i++)
   {
      L1_1[i] = i;
      L1_2[i] = i + 1;
   }
   return(rates_total);
}
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 

你好。我可能写错了方向,但我希望你能为我指出正确的方向。关于mt5的网络应用程序接口的问题,该去哪里?)

为了以防万一,我将尝试解释一下情况。我有 МТ 经理和WEB API 与 php...俄文发票已创建,数据已发送,甚至显示在МТ管理器中,但有一个问题--МТ管理器中的数据显示为unicode("044404300c0438043b0438044f"--这就是用户名的模样)。当发送数据时,没有任何东西被编码或解码,从MT客户端,一切都正常创建...至少要看哪个方向?(