新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1188

 
Ivan_Invanov:
一般来说,从你的回答来看,你并不真正了解该计划的运作方式。所以这似乎是一个愚蠢的问题。就像前面的评论者认为的那样,它停止了。从其他语言的编程经验来看,我认为它是在一个循环中执行其主体,当有事件发生时,它就潜入其中。如果程序以循环方式执行其主体,这就解释了为什么程序是 这样写的

当一个 "新刻度 "事件发生时,程序在OnTick()处理程序中启动,执行到完成并停止。随着新蜱的到来,一切都从头开始重复。如果在程序执行过程中出现了新的tick,而程序还没有完成对前一个tick的处理(它还在运行),那么这个tick就会被跳过。

MQL中的程序是不循环的。它们有三个入口点 - OnInit(), OnDeinit()和OnTick()。

在启动时,OnInit()被执行,然后当收到tick时--OnTick(),当操作结束时--OnDeinit()。

也有其他的处理程序。但你最好直接打开帮助,而不是要求别人在这里复制。

Документация по MQL5: Программы MQL5
Документация по MQL5: Программы MQL5
  • www.mql5.com
Для того чтобы mql5-программа могла работать, она должна быть скомпилирована (кнопка "Компилировать" или клавиша F7). Компиляция должна пройти без ошибок (допускаются предупреждения, которые необходимо проанализировать). При этом в соответствующей директории Эксперты, пользовательские индикаторы и скрипты прикрепляются к одному из открытых...
 

你好。在研究我的指标时,我发现了一个重启终端时的错误。在这个错误的基础上,我做了一个小的源代码来测试它。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

class Loader {
private:
  string symbol;
  ENUM_TIMEFRAMES timeframe;

public:  
  Loader(): symbol(Symbol()), timeframe(Period()) 
  {
    Print(__FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString(timeframe));
    ResetLastError();
    Print(__FUNCTION__ + " bars: " + (string)iBars(symbol, timeframe)); // Данный вызов iBars() даёт 0 при перезапуске терминала
    Print(__FUNCTION__ + " Error: " + (string)GetLastError());
    Print(__FUNCTION__ + " bars (2): " + (string)iBars(Symbol(), Period())); // Этот же вызов iBars() работает нормально
  }
};

Loader * loader;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
  loader = new Loader();
//---
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
  delete loader;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]
) {
  return(rates_total);
}

如果这个例子被扔在图表上(或者是系统启动后的第一个终端启动),一切都会正常。在日志中,它说了以下内容。

2020.06.24 21:05:50.773 Loader::Loader symbol: EURUSD timeframe: PERIOD_H1

2020.06.24 21:05:50.773 Loader::Loader bars: 140433

2020.06.24 21:05:50.773 Loader::Loader Error: 0

2020.06.24 21:05:50.773 Loader::Loader bars (2): 140433


但如果我用这个指标重启终端,就会出现错误。

2020.06.24 21:07:34.963 Loader::Loader symbol: EURUSD timeframe: PERIOD_H1

2020.06.24 21:07:34.963 Loader::Loader bars: 0

2020.06.24 21:07:34.963 Loader::Loader Error: 4401

2020.06.24 21:07:34.964 Loader::Loader bars (2): 140433

符号和时间框架已经初始化 ok

2020.06.24 21:07:34.963 Loader::Loader symbol: EURUSD timeframe: PERIOD_H1

但是iBars(symbol, timeframe)由于某种原因给出了0。

2020.06.24 21:07:34.963 Loader::Loader bars: 0

在这种情况下,出现错误4401。

但iBars(Symbol(), Period())工作正常。

2020.06.24 21:07:34.964 Loader::Loader bars (2): 140433

根据日志信息,至少符号=Symbol()和时间框架=Period()(甚至在滞后期间,当终端重新启动时)。如果函数中的参数相同,根据日志,iBars(symbol, timeframe)的符号和时间框架绝对正确,但iBars(Symbol(), Period())却工作正常,这怎么可能?

Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
  • www.metatrader5.com
По завершении установки в меню "Пуск" создается группа программ торговой платформы, а на рабочем столе дополнительно помещается ярлык программы. Используйте их для запуска. Нельзя запускать одновременно две копии платформы из одной директории. Чтобы одновременно запустить несколько копий, установите соответствующее количество программ в разные...
附加的文件:
Test.mq5  7 kb
 
谁知道这个主题的版主?
 

如何在MetaQuotes Demo上开立一个MT4模拟账户?以前工作时没有任何问题,现在在对话框的最后一页显示:注册,请稍等,在这种状态下,它无限期地保持空闲,有登录和密码的字段保持空闲。日志中没有消息。试过 "模拟 "和 "真实 "以及不同类型的账户。

UPD 尝试了一个经纪人的演示 - 同样的事情。

 
Artyom Trishkin:

当一个 "新刻度 "事件发生时,程序在OnTick()处理程序中启动,执行到完成并停止。随着新蜱的到来,一切都从头开始重复。如果在程序执行过程中出现了新的tick,而程序还没有完成对前一个tick的处理(它还在运行),那么这个tick就会被跳过。

MQL中的程序是不循环的。它们有三个入口点 - OnInit(), OnDeinit()和OnTick()。

在启动时,OnInit()被执行,然后当收到tick时--OnTick(),当操作结束时--OnDeinit()。

也有其他的处理程序。但你最好直接打开帮助,而不是要求别人在这里复制。

谢谢你。是的,我明白,只是这个函数是写在程序的主体中。也许我没有注意到它被称为什么地方。
 
Ivan_Invanov:
谢谢你。是的,我明白,只是这个函数是写在程序的主体中。也许我没有注意到它被称为什么地方。

我们如何才能看到你在说什么呢?给我们举个例子。

 
Artyom Trishkin:

我们如何才能看到你在说什么呢?给我们举个例子。

再次感谢,是的,我没有注意到这个调用,我现在查了一下,它是由 打开交易的函数调用 的。
 
Ivan_Invanov:
谢谢你。是的,我明白了,只是这个函数写在了程序的正文中。也许我一定是在什么地方错过了对它的呼吁。

在mql4中,函数是按任何顺序写的,上面下面都无所谓,它可能看起来更早或更晚工作。在C++中没有这样的事情,所有的函数只能按照编写顺序工作,如果你想调用它,必须在调用的地方之前定义,否则程序会崩溃。那个人向我展示了如何以不同的顺序编写函数,但我不记得在C++中如何做。

 
Ivan_Invanov:

问候。请帮助我。我有这样一个问题。我的理解是否正确。程序从头执行到尾,但当一个事件发生时就停止了,比如说一个tick,ontick函数 开始执行,然后它完成了执行,程序又从头执行?这个问题与以下内容有关,例如我应该在哪里写交易手数的大小,是在程序主体还是在ontick函数中?

我看了一下官方的机器人,它就像一个终端的例子,有很多计算是在程序主体中进行的,我不明白为什么会这样。

我的地段是这样计算的

#property link      "http://www.mql5.com"
input double CheckLots = 0.01;
input int    Persent   = 5;
   double Lots=NormalizeDouble(AccountBalance()*CheckLots/1000-0.005,2);  

它在专家顾问的开头......而我把它放在代码的最后

当OnTick函数调用Lots变量时,EA会找到并重新计算它。

 

@Artyom Trishkin

你是这个主题的版主吗?