初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1264

 
你好。从 " 使用结构进行有效的程序开发"一课中 得到启发,在MT5中创建了一个这样的简单结构
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
#include <Trade\PositionInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Expert\Money\MoneyFixedMargin.mqh>

CPositionInfo      m_position;// object of CPositionInfo class
COrderInfo         m_order;   // object of COrderInfo class
CTrade             m_trade;   // object of CTrade class
CSymbolInfo        m_symbol;  // object of CSymbolInfo class
CAccountInfo       m_account; // object of CAccountInfo class
CDealInfo          m_deal;    // object of CDealInfo class
CMoneyFixedMargin *m_money;   // object of CMoneyFixedMargin class
//+------------------------------------------------------------------+
//| Structure Positions                                              |
//+------------------------------------------------------------------+
struct STRUCT_POSITION
  {
   ENUM_POSITION_TYPE type;       // тип позиции
   ulong              ticket;     // тикет позиции
   long               identifier; // идентификатор
   long               magic;      // магический номер
   double             volume;     // объем позиции
   double             open_price; // цена открытия
   datetime           open_time;  // время открытия
   double             profit;     // профит позиции
   double             comission;  // комиссия
   double             swap;       // своп
   string             comment;    // комментарий
   
   void               GetCurrentPositionProperty();
  };
  STRUCT_POSITION StrPositionArray[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   STRUCT_POSITION.GetCurrentPositionProperty();
  }
//+------------------------------------------------------------------+
//---Заполнение массива свойств позиций                              +
//+------------------------------------------------------------------+
void STRUCT_POSITION::GetCurrentPositionProperty(void)
{   
   ZeroMemory(this);
   int pos_total = PositionsTotal();
   ArrayResize(StrPositionArray,pos_total,1000);
   for(int i=0; i<pos_total; i++)
      {
         if(m_position.SelectByIndex(i))
            {
               StrPositionArray[i].ticket     = m_position.Ticket();                  // тикет позиции
               StrPositionArray[i].identifier = m_position.Identifier();              // идентификатор
               StrPositionArray[i].magic      = m_position.Magic();                   // магический номер
               StrPositionArray[i].comment    = m_position.Comment();                 // комментарий
               StrPositionArray[i].type       =(ENUM_POSITION_TYPE)m_position.PositionType();// тип позиции
               StrPositionArray[i].volume     = m_position.Volume();                  // объем позиции
               StrPositionArray[i].open_price = m_position.PriceOpen();               // цена открытия
               StrPositionArray[i].open_time  = m_position.Time();                    // время открытия
               StrPositionArray[i].profit     = m_position.Profit();                  // профит позиции
               StrPositionArray[i].comission  = m_position.Commission();              // комиссия
               StrPositionArray[i].swap       = m_position.Swap();                    // своп
            }
      } 
} 
//+------------------------------------------------------------------+

在结构上

结构_位置

结构包含方法

GetCurrentPositionProperty(void)

它计算并为结构中的元素赋值。在结构外定义方法的主体。要做到这一点,请使用上下文解析操作(::)。

在OnTick()中,我们调用该函数。

void OnTick() { //---STRUCT_POSITION.GetCurrentPositionProperty();}

而在这里,我们得到了一个错误。

'.'- name expected eSower_and_Gather_5.mq5 69 19
我不知道哪里出错了,请帮助。

 
Sergey Voytsekhovsky:

'.'- 名称预期eSower_and_Gather_5.mq5 69 19

69 19行是什么?请公布代码第69行,并说明19的位置在哪里。它将立即明确错误在哪里。

 
Vladimir Karputov:

69 19行是什么?发布代码第69行,并说明第19个位置的位置。它将立即明确错误在哪里。

STRUCT_POSITION.GetCurrentPositionProperty();

它在上面的帖子中以红色标出。谢谢你的及时答复。

 
Vladimir Karputov:

69 19行是什么?发布代码第69行,并说明第19个位置的位置。它将立即明确错误在哪里。

这是一个必须让人进入一个函数的点,而这个函数又使用结构上下文。但我无法理解为什么它不起作用。

 
Sergey Voytsekhovsky:

它在上面的帖子中以红色标出。谢谢你的及时答复。

'STRUCT_POSITION'是一个数据类型。你需要创建一个具有这种类型的变量,然后调用VARIABLE.GetCurrentPositionProperty()。

Документация по MQL5: Основы языка / Типы данных
Документация по MQL5: Основы языка / Типы данных
  • www.mql5.com
Любая программа оперирует данными. Данные могут быть различных типов в зависимости от назначения. Например, для доступа к элементам массива используются данные целочисленного типа. Ценовые данные имеют тип двойной точности с плавающей точкой. Это связано с тем, что в языке MQL5 не предусмотрено специального типа для ценовых данных. Данные...
 
Sergey Voytsekhovsky:

这是应该让人进入函数的点,而函数又使用结构的上下文。这是我从教科书上理解的。但为什么它不工作,我无法理解。

代码:(只是调用一个函数--EA函数,而不是结构方法--这样更有意义。)

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#include <Trade\PositionInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Expert\Money\MoneyFixedMargin.mqh>
//---
CPositionInfo      m_position;// object of CPositionInfo class
COrderInfo         m_order;   // object of COrderInfo class
CTrade             m_trade;   // object of CTrade class
CSymbolInfo        m_symbol;  // object of CSymbolInfo class
CAccountInfo       m_account; // object of CAccountInfo class
CDealInfo          m_deal;    // object of CDealInfo class
CMoneyFixedMargin *m_money;   // object of CMoneyFixedMargin class
//+------------------------------------------------------------------+
//| Structure Positions                                              |
//+------------------------------------------------------------------+
struct STRUCT_POSITION
  {
   ENUM_POSITION_TYPE type;       // тип позиции
   ulong              ticket;     // тикет позиции
   long               identifier; // идентификатор
   long               magic;      // магический номер
   double             volume;     // объем позиции
   double             open_price; // цена открытия
   datetime           open_time;  // время открытия
   double             profit;     // профит позиции
   double             comission;  // комиссия
   double             swap;       // своп
   string             comment;    // комментарий

   void               GetCurrentPositionProperty();
  };
STRUCT_POSITION StrPositionArray[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   GetCurrentPositionProperty();
  }
//+------------------------------------------------------------------+
//| Заполнение массива свойств позиций                               |
//+------------------------------------------------------------------+
void GetCurrentPositionProperty(void)
  {
   int pos_total = PositionsTotal();
   ArrayResize(StrPositionArray,pos_total,1000);
   for(int i=0; i<pos_total; i++)
     {
      if(m_position.SelectByIndex(i))
        {
         StrPositionArray[i].ticket     = m_position.Ticket();                  // тикет позиции
         StrPositionArray[i].identifier = m_position.Identifier();              // идентификатор
         StrPositionArray[i].magic      = m_position.Magic();                   // магический номер
         StrPositionArray[i].comment    = m_position.Comment();                 // комментарий
         StrPositionArray[i].type       =(ENUM_POSITION_TYPE)m_position.PositionType();// тип позиции
         StrPositionArray[i].volume     = m_position.Volume();                  // объем позиции
         StrPositionArray[i].open_price = m_position.PriceOpen();               // цена открытия
         StrPositionArray[i].open_time  = m_position.Time();                    // время открытия
         StrPositionArray[i].profit     = m_position.Profit();                  // профит позиции
         StrPositionArray[i].comission  = m_position.Commission();              // комиссия
         StrPositionArray[i].swap       = m_position.Swap();                    // своп
        }
     }
  }
//+------------------------------------------------------------------+
 
Vladimir Karputov:

STRUCT_POSITION'是一个数据类型。你需要创建一个具有这种类型的对象,然后调用OBJECT.GetCurrentPositionProperty()。

试过了。这样一个对象被创建,在声明了

StrPositionArray[]。

如果你把它放入OnTick

void OnTick()
  {
//---
   StrPositionArray[].GetCurrentPositionProperty();
  }

我们得到一个错误。

']'- 预期表达式 eSower_and_Gather_5.mq5 69 21

这是同一行,只有第二个括号,即点之前的那个。
 
Vladimir Karputov:

代码:(只是调用一个函数--EA函数,而不是结构方法--这样更有意义。)

所以使用::是一个徒劳的想法?

那么你为什么要写函数

GetCurrentPositionProperty()

结构内部?它将填补结构内部没有任何填充物,不是吗?请澄清一下,我很困惑,也许这是一个过时的功能,我应该忘记它?

 
Sergey Voytsekhovsky:

所以使用::是在浪费时间?

那么你为什么要写一个函数

在结构内?我的意思是,即使没有它,它也会完美地填充结构。请澄清一下,我很困惑,也许这是一个过时的想法,应该被遗忘。

复制粘贴。复制粘贴后还剩一行。

它应该是这样的(结构内部没有方法)。

//+------------------------------------------------------------------+
//| Structure Positions                                              |
//+------------------------------------------------------------------+
struct STRUCT_POSITION
  {
   ENUM_POSITION_TYPE type;       // тип позиции
   ulong              ticket;     // тикет позиции
   long               identifier; // идентификатор
   long               magic;      // магический номер
   double             volume;     // объем позиции
   double             open_price; // цена открытия
   datetime           open_time;  // время открытия
   double             profit;     // профит позиции
   double             comission;  // комиссия
   double             swap;       // своп
   string             comment;    // комментарий
  };
STRUCT_POSITION StrPositionArray[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
 
Vladimir Karputov:

复制粘贴。拷贝后还剩一行。

它应该是这样的(结构内部没有方法)。

好吧,我已经花了这么多时间在这门课上。虽然是针对MT4的,但在那里是作为一个技巧来介绍的,所以这里是摘录的文字。

1
2
3
4
5
6
7
8
9
10
11
12
结构状态
{
int buy_count; // 买入订单的数量
int sell_count; // 卖出订单的数量
double buy_bottom_price; //最低买单的开盘价。
double sell_top_price; //最高卖单的开盘价。
double profit; // 所有订单的利润
// 收集有关账户状态信息的方法
//并刷新结构中的元素
void Refresh( )。
}州。

该结构有一个Refresh()方法,用于计算并为结构中的元素赋值。让我们在结构外定义方法的主体。要做到这一点,我们使用上下文解析操作(::)。上下文是一个结构的描述符(名称)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//+------------------------------------------------------------------+
//|该方法收集关于账户当前状态的信息。
//|并更新结构中的相关字段。
//+------------------------------------------------------------------+
空白状态::刷新( 空白 )
{
//将结构中的数字字段清零
ZeroMemory( this )。
for ( int i=OrdersTotal()-1; i>=0; i--)
如果(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
如果(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
{
double OpenPrice=OrderOpenPrice()。
profit+=OrderProfit()+OrderCommission()+OrderSwap()。
switch (OrderType())
{
case OP_BUY:
buy_count++;
如果(OpenPrice<buy_bottom_price || buy_bottom_price==0)
buy_bottom_price=OpenPrice。
断裂;
case OP_SELL:
sell_count++;
如果(OpenPrice>sell_top_price || sell_top_price==0)
sell_top_price=OpenPrice。
断裂;
}
}
}

请注意,在方法的主体中,我们引用结构中的元素时没有使用点,因为我们使用了上下文解析操作。数值字段在方法主体的开头更新之前, ZeroMemory()this 关键字归零,所以结构会传递给自己一个引用。

现在,OnTick() 处理程序内的主要EA代码将看起来像这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//+------------------------------------------------------------------+
//| 专家勾选功能|
//+------------------------------------------------------------------+
空白的OnTick()
{
for ( int i=0; i<2000; i++)
{
double b=MathSqrt(i)。
}
//开立新的订单,并只在新条形图打开时获利。
如果(IsNewBar())
{
//获得一个新的信号
int Signal=GetSignal()。
// 如果信号没有在收盘时产生,立即退出该函数。
如果(Signal<0)
返回 ;
//刷新该结构
State.Refresh(); // (! !)