mql5语言的特点、微妙之处以及技巧 - 页 18

 
丹尼斯-基里琴科
我可以问为什么是静态的 吗?

因为断章取义--见原帖
 

OnInit()函数的 非文档化特征,这个函数可以在程序的任何部分运行。测试代码。

//+------------------------------------------------------------------+
//|                                                       test10.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNevBar
  {
private:
   datetime          curbar;
   datetime          lastbar;
public:
                     CNevBar();
                    ~CNevBar();
   bool              bar(string symbol,ENUM_TIMEFRAMES period);
  };
//+------------------------------------------------------------------+
void CNevBar::CNevBar()
  {

  }
//+------------------------------------------------------------------+
void CNevBar::~CNevBar(void)
  {

  }
//+------------------------------------------------------------------+
bool CNevBar:: bar(string symbol,ENUM_TIMEFRAMES period)
  {
   curbar=(datetime) SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar==0)lastbar=(datetime)SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar!=curbar)
     {
      lastbar=curbar;
      return(true);
     }
   return(false);
  }

int test=0;
CNevBar newbar;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   test=5;
   Print(__FUNCTION__,": test = ",test);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(newbar.bar(_Symbol,PERIOD_CURRENT))
     {
      test=10;
      Print(__FUNCTION__,": test = ",test);
      OnInit();
     }
  }
//+------------------------------------------------------------------+

结果

2017.03.10 19:26:02.977 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:27:03.041 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:27:03.042 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:28:03.245 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:28:03.245 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:29:02.995 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:29:02.995 test10 (EURUSD,M1)      OnInit: test = 5


...

 
谢尔盖-格里察伊

OnInit()函数的 非文档化特征,这个函数可以在程序的任何部分运行。测试代码。


所有的On-functions都是正常的函数,因此它们可以在你想的时候被调用。OnCalculate或OnTradeTransaction。
 
fxsaber:

所有的On-functions都是正常的函数,相应地,只要你想,它们就可以被调用。无论是OnCalculate还是OnTradeTransaction。


但文件中没有写明

启用时

OnInit()函数是OnInit事件处理程序。它可以是typevoid或int,并且没有参数

voidOnInit()。

Init事件是在加载专家顾问或指标后立即生成的,该事件不为脚本生成。OnInit()函数用于初始化。如果OnInit()的返回值为int,非零的返回代码意味着初始化不成功,它将生成Deinit事件,其原因代码为REASON_INITFAILED

为了优化专家的输入参数,建议使用ENUM_INIT_RETCODE枚举的值作为返回代码。这些值被用来控制优化的过程,包括选择最合适的测试 剂。在测试开始前的专家顾问初始化过程中,你可以使用TerminalInfoInteger() 函数请求关于代理的配置和资源的信息(核心数量、可用内存数量等)。根据获得的信息,你可以允许使用这个测试代理,或者在这个专家顾问的优化期间拒绝使用它。

enum_init_retcode

识别器

描述

INIT_SUCCEEDED

初始化成功后,可以继续测试专家顾问。

这个代码的意思和零一样--测试器中的专家顾问初始化成功了。

INIT_FAILED

初始化失败,由于无法恢复的错误,测试没有意义。例如,未能创建一个专家顾问工作所需的指标。

该值的返回意味着与返回一个非零的值相同--测试器中专家顾问的初始化已经失败。

错的参数

旨在向程序员指示一组不正确的输入参数。 包含该返回代码的结果字符串将在一般优化表中以红色突出显示。

对专家顾问的这组参数的测试将不会被执行,代理可以自由接收新的任务。

收到这个值后,策略测试者保证不把这个工作交给其他代理重复执行。

激活代理不适合

在初始化过程中没有错误,但由于某些原因,给定的代理不适合测试。例如,内存不足,支持OpenCL等等

返回该代码后,代理将不会收到任务,直到该优化 结束。

空白类型的OnInit()函数总是意味着初始化成功。

Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
Программы MQL5 / События клиентского терминала - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
当我在周末写代码时,我在OnInit中插入OnTick。而且一切都很好,即使没有新的虱子进入也是如此
 
谢尔盖-格里察伊


但文件中没有写明

启用时

OnInit()函数 是OnInit事件处理程序。它可以是typevoid或int,并且没有参数

voidOnInit()。

启动事件在加载专家顾问或指标后立即生成。

它说这是一个函数。

在OnInit之前和OnDeinit之后,有全局对象的构造函数/解构函数的调用(帮助中不准确)。这就是为什么,例如在指标中,你可以不用OnInit来声明指标缓冲区。其基本原理如下。

 
搜索FullOnCalculate 可以立即找到很多在MT4/MT5中使用指标缓冲区的完全没有记录的功能--在一些地方它们有严重的差异。
 
以下是我对解决问题的最终设想。
iCustom(... inputs, PRICE_CLOSE,
         color &colors[], int &widths[], int &styles[] );

iAlligator(... params, PRICE_CLOSE,
         color &colors[], int &widths[], int &styles[] );
比方说,一个指标有这些参数。
#property indicator_plots 5
#property  indicator_color1 clrAquamarine, clrBeige, clrBurlyWood
#property  indicator_color2 clrRed, clrGreen

#property  indicator_color5 clrGold, clrCrimson, clrCadetBlue
那么它的颜色阵列将如下。
color colors[] = {
   clrAquamarine, clrBeige, clrBurlyWood,  // 1 plot
   clrRed, clrGreen,                       // 2 plot
   clrBlack,                               // 3 plot
   clrWhite,                               // 4 plot
   clrGold, clrCrimson, clrCadetBlue,      // 5 plot
   clrBurlyWood, clrBlue                   // ignore
};

如果阵列较小,则只传输部分颜色。如果阵列较大,就会被修剪。

对于宽度和样式数组,原理是一样的。

 
fxsaber:

在OrderSendSync中,重载的(见上文)HistoryDealSelect被调用。

如何确定最后一次开仓的时间 和最后一次平仓的时间?

而一般来说,我想知道在mql5上获取开仓/平仓信息的一般原则和算法。

需要考虑到什么,目前有哪些具体内容?

 
阿尔乔姆-特里什金

如何确定最后一次开仓的时间 和最后一次平仓的时间?

一般来说,我想知道在mql5中获取开仓/平仓信息的一般原则和算法。

应该考虑什么,目前的特殊性是什么?


这都是通过选择订单和交易历史,然后读取订单的属性来确定的。

bool  HistorySelectByPosition( 
   long   position_id     // идентификатор позиции - POSITION_IDENTIFIER 
   );

位置标识符

职位标识符是一个唯一的数字,它被分配给每个新开的职位,并且在其整个生命周期内不会改变。它与开仓时的订单票相对应。

仓位标识符在每个订单(ORDER_POSITION_ID)和每个开启、改变或关闭它的交易(DEAL_POSITION_ID)中被指定。使用此属性来搜索与头寸相关的订单和交易。

当一个头寸在净值模式下被逆转(一个单一的进出交易),头寸的POSITION_IDENTIFIER标识符不会改变。然而,POSITION_TICKET被改变为导致逆转的订单票。在对冲模式下,不存在头寸逆转。


并使用来自枚举的属性 ENUM_DEAL_ENTRY

帐户

进入市场

拒绝接受

市场退出

交易_进入_退出

U-turn

交易_进入_退出_by

近距离反击位置