错误、漏洞、问题 - 页 435

 
voix_kas:

一般来说,结果很有趣。
凭直觉,我认为OnDenit函数是一种析构器,而OnInit则是EA的构造器。

事实上,事实证明,OnInit是一个多重事件(在Expert Advisor的生命周期内)。那么不清楚的是,如果我们知道EA不会终止其操作(例如,在改变图表周期的情况下),为什么我们需要明确地生成OnDenit事件?

当符号发生变化时,为了快速启动和保存其前世的信息基础,专家顾问会被热加载。

例如,专家顾问在图表上,它已经积累了它的统计数据和逻辑,然后它被改变了时间框架,不得不在冷启动时从零开始工作。

而且还有一个问题。
REASON_CHARTCHANGE去初始化的原因- 一个符号或一个图表周期被改变。
请解释如何在不删除图表上的EA的情况下改变图表符号?

在热重启模式下。
 

耶德尔金,有趣的,雷纳特
谢谢你的澄清。

我认为在文档中明确列出 "热 "和 "冷 "的重新启动也很有意义。

如果在每次OnInit时没有重新初始化,对于多播EA,我们将不得不使用一个拐杖,也就是一个全局标志。:(
我将在稍后发布代码。

 
Interesting:

专家顾问在任何情况下都不会在正常的初始化过程中被删除,它只是被允许在某些终端设置 下进行交易(但为此专家顾问必须理解符号已经被改变......)。

顺便说一下,这提醒了我。我一直想问一下开发人员关于这些设置。

雷纳特,请做两个不同的 复选框,在改变时间框架和符号时禁止交易。 这是两个根本不同的变化。

我不希望我的EA在改变时间框架时停止交易--这绝对是不必要的--无论如何,它们在处理每一个tick,没有任何问题。

但符号的变化从根本上来说是很重要的。我想保持这种锁定...但现在这两种调整由于某种原因被同步调节在一起了。

我正在用程序解决这个问题(将原始符号存储在一个静态变量中,并控制inite的变化)。但如果能在终端层面上阻止这种情况,那就更好了。

更好的是,在专家顾问运行时,可以切换时间段或符号。为什么要因为愚蠢-忘乎所以而停止交易?

也就是说,如果在设置中规定,当专家顾问出现在图表上时,禁止切换时间框架和/或符号(单独的!),这将是更好 做法。

//在试图这样做的时候给出相应的消息。

其实这也可以通过程序解决(强行将符号或时间框架放回原位),但我想你自己对终端层面的真正用户友好 设置感兴趣。

 

MetaDriver:

雷纳特,请做两个不同的 复选框来阻止时间框架变化和符号变化的交易。 这是两个根本不同的变化。

我不希望我的EA在改变时间框架时停止交易--这绝对是没有必要的--反正它们在处理每一个tick,这没有任何问题。


我支持这个想法,你应该在去初始化的原因 代码中做两个刻度和一个分隔(那样会很方便)。

但是阻止改变时间框架的可能性,我不知道如何改变(关于符号),对我来说太过分了。

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

这提醒了我。我很久以来一直想向开发者询问这些设置。

雷纳特,请做两个不同的 复选框来阻止改变时间框架和改变符号的交易。 这是两个根本不同的变化。

是的,看来改变符号和时间框架的条件是白白结合的。

我也赞成把它们分成两个条件。该票据已被放入服务台。

 

实际上,我附上的是定义多用工具的工作工具的代码。欢迎提出批评。:)

input uint   inTimeToRescan = 3600; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундах
input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты


bool Initialize;


int OnInit() {
  //...
  Initialize = true;
  //...
}


void OnTick() {
  static ulong  LastScan = 0;
  if ((ulong)TimeCurrent() - LastScan >= inTimeToRescan) Initialize = true;

  static string Symbol[];
//  static int    Forecast[];
//  static int    Volatile[];

  if (Initialize) {
    Comment("Опрос рабочих инструментов...");
    int SymbolCount_1 = 0;
    for (int i = 0; i < SymbolsTotal(false); i++)
      if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
        SymbolCount_1++;

    if (!SymbolCount_1) return;
    if (ArrayResize(Symbol, SymbolCount_1) != SymbolCount_1) return;

    int SymbolCount_2 = 0;
    for (int i = 0; i < SymbolsTotal(false); i++)
      if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
        Symbol[SymbolCount_2++] = SymbolName(i, false);

    if (SymbolCount_1 != SymbolCount_2) return;

    //if (ArrayResize(Forecast, SymbolCount_1) != SymbolCount_1) return;
    //if (ArrayResize(Volatile, SymbolCount_1) != SymbolCount_1) return;

    Initialize = false;
  }
  //...
}

专家顾问的每一个刻度都会试图获得一个工作工具的列表。
工作仪器列表的更新发生在两个条件下:1)OnInit被触发,2)在EA的输入参数 中给出的时间间隔之后。
正如我们所见,一个全局变量(bool Initialize)形式的拐杖被用来检测下一个初始化。如果有静态的初始化,就不需要了。

我认为全局变量是邪恶的,以及无条件的Goto操作符在其时。

 
voix_kas:

在没有在每次OnInit时重新初始化的情况下,对于多边机构必须使用全局标志形式的 "拐杖"。:(

最好从一开始就仔细编写代码,不要留下中间静态变量 形式的拐杖。

作为一个解决方案,将这些数据隐藏在一个类里面。如果这个班级死了,环境也就死了。

而在全局层面上,要留下最少的静态变量。

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

实际上,我附上的是定义多用工具的工作工具的代码。欢迎提出批评。:)

作为一个提示--把Symbol 放在全局级别,在OnInit中归零。如果数组是空的,那么就该初始化了。

而且没有额外的旗帜。

 
Renat:

作为一个提示,把Symbol带到全局水平,在OnInit中把它归零。如果数组是空的,那么就该初始化了。

而且没有额外的旗帜。

我想我是偏执狂。我不喜欢公共(全局)变量。我认为这是一个穆维顿。
是否可以在OnTick里面指定OnInit的触发方式?
例如,我是否可以在OnTick里面声明一个静态变量,存储EA的初始化次数(如果MQL5中有这样或类似的属性)?

 
voix_kas:

全局变量 是邪恶的,就像当年的无条件Goto操作符一样。

我一定是个偏执狂。我不喜欢公共(全局)变量。我发现它是一个Muveton。

1.为什么?有必要摆脱有害的症状,而且是果断地摆脱。

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

雷纳特

解决办法是将这些数据隐藏在类里面。如果这个班级死了,环境也会死。

而在全局层面上,要留下最少的静态变量。

好建议。是时候改用OOP了......:)