错误、漏洞、问题 - 页 436

 
Interesting:

1.这是为什么呢?有害的症状需要得到治疗,而且要果断地治疗。

2.变量、数组和其他东西的命名不应一致,也不应使用语言关键词(但数组 "Symbol "非常醒目,在代码中你无法分辨它是一个数组还是其他东西)。

1.那么,首先你需要真正确定症状学是属于积极还是消极表现。根据我的经验,我曾经遇到过这样的情况:我试图在一个不应该这样做的函数中改变一个全局变量的值(该死的复制粘贴)。我花了几天时间才发现这个错误。从那时起,我就开始在原则上不能没有全局变量的情况下使用全局变量。

2.我同意。但如果它们是在一个函数内使用,我就不会感到困扰。但是,具有这样名字的全局变量确实是未来混乱的根源。

Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
  • www.mql5.com
Глобальные переменные терминала / GlobalVariableGet - Документация по MQL5
 

不过我还是要重复我的问题。

有没有可能在OnTick里面确定OnInit的触发?
例如,我可以在OnTick里面声明一个静态变量,存储EA被初始化的次数(如果MQL5有这样的属性或类似的属性)?

 
voix_kas:

我一定是个偏执狂。我不喜欢公共(全局)变量。我认为这是一个穆维顿。

全局变量 至少可以从远处看到。但在静力学中把严重的累积变量隐藏在函数里面,是一种为自己小心翼翼地摊开耙子的方式。这是我第一次看到以这样的方式将一个累积的静态数组隐藏在一个函数里面。这是一个火热的耙子。

使用类--它们会使全局水平干净,隐藏所有的内脏,摆脱拐杖。

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
voix_kas:

不过我还是要重复我的问题。

是否可以在OnTick里面确定OnInit的触发?
例如,我们能否在OnTick里面声明一个静态变量,存储EA的初始化数量(如果在MQL5中有这样或类似的变量)?

不仅可以计算OnInit触发器的数量,还可以确定初始化发生的原因(实现是另一个问题)。

例如,你熟悉_UninitReason吗?

 
你可以在OnInit中读取它,但我需要在另一个事件中读取这个数据(不使用全局变量)。无论你怎么看,这都是一个实施的问题。这与OnDenit的情况相同。
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
我从来没有写过的课。如果有人能帮助我,我将不胜感激。
需要写一个WorkSymbols类。
方法。
string GetSymbol[];
bool UpdateSymbols(inWorkSymbols)。
bool UpdateSymbolsStatus()。
int GetSymbolCount()。

如果这个要求是厚颜无耻的,请原谅......我也会自己想办法解决的。
 
Renat:

是的,把符号变化和时间框架条件结合起来似乎是个错误。

我也赞成把它们分成两个条件。这张票已经放在服务台了。

谢谢你!
 

算是熟能生巧吧。欢迎提出批评。

input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты

class CSymbolList {
  private:
    string Symbols[];

  public:
    void   CSymbolList() { SetSymbols(""); }
    void  ~CSymbolList() { ArrayFree(Symbols); }
    int    GetSymbolCount() { return ArraySize(Symbols); }
    void   SetSymbols(string);
    string GetSymbolName(int);
};

void CSymbolList::SetSymbols(string Source) {
  ArrayFree(Symbols);
  for (int count = 1, i = 0; i < SymbolsTotal(false); i++)
    if (StringFind(Source, SymbolName(i, false)) != -1) {
      if (ArrayResize(Symbols, count) != count) {
        ArrayFree(Symbols);
        return;
      }
      Symbols[count-1] = SymbolName(i, false);
      count++;
    }
}

string CSymbolList::GetSymbolName(int Item) {
  if (Item < 0 || !ArraySize(Symbols) || Item >= ArraySize(Symbols)) return "";
  return Symbols[Item];
}

void OnStart() {
  CSymbolList slMain;
  slMain.SetSymbols(inWorkSymbols);
  for (int i = 0; i < slMain.GetSymbolCount(); i++)
    Print(slMain.GetSymbolName(i));
}
 

我唯一不喜欢的是对包含工作数据的数组进行 "实时 "调整大小。
问一下开发人员,在以下条件下,是否能保证被修改 动态数组 中先前输入的用户数据会被保留下来?

if (ArrayResize(Symbols, count) == count)
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
voix_kas:

我唯一不喜欢的是对包含工作数据的数组进行 "实时 "调整大小。
问一下开发人员,在以下条件下,是否能保证被修改 动态数组 中先前输入的用户数据会被保留下来?

我敢打赌,这是有保证的。至少我一直指望着它,而且问题从未出现过。