Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1264

 
Olá.Inspirei-me nalição " Utilização de Estruturas para o Desenvolvimento Eficaz de Programas"e criei uma estrutura simples como esta em 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();                    // своп
            }
      } 
} 
//+------------------------------------------------------------------+

Na estrutura

POSIÇÃO_ESTRUTURAL

a estrutura contém método

GetCurrentPositionProperty(void)

que calcula e atribui valores aos elementos da estrutura. Definir o corpo do método fora da estrutura. Para tal, utilizar a operação de resolução de contexto (:::).

Em OnTick() chamamos a função:

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

E aqui recebemos um erro:

'.' - nome esperado eSower_and_Gather_5.mq5 69 19
Não sei onde é que correu mal, por favor ajudem-me.

 
Sergey Voytsekhovsky:

'.' - nome esperado eSower_and_Gather_5.mq5 69 19

O que é a linha 69 19? Favor publicar a linha de código 69 e especificar onde se encontra a 19 posição. Ficará imediatamente claro onde se encontra o erro.

 
Vladimir Karputov:

O que é a linha 69 19? Código postal linha 69 e especificar onde se encontra a 19ª posição. Ficará imediatamente claro onde se encontra o erro.

STRUCT_POSITION.GetCurrentPositionProperty();

É destacado a vermelho no poste acima. Obrigado pela sua resposta imediata.

 
Vladimir Karputov:

O que é a linha 69 19? Código postal linha 69 e especificar onde se encontra a 19ª posição. Ficará imediatamente claro onde se encontra o erro.

Este é um ponto que deve dar acesso a uma função que, por sua vez, utiliza o contexto da estrutura. Mas não consigo compreender porque é que não funciona.

 
Sergey Voytsekhovsky:

é destacado a vermelho no poste acima. Obrigado pela sua resposta imediata.

'STRUCT_POSITION' é um TIPO DE DADOS. É necessário criar uma variável com este tipo e depois chamar VARIABLE.GetCurrentPositionProperty();

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

Este é o ponto que deve dar acesso à função que, por sua vez, utiliza o contexto da estrutura. Foi o que entendi dos manuais escolares. Mas porque não funciona, não consigo compreender.

Código: (apenas chamar uma função - função EA, não um método de estrutura - que faz mais sentido)

//+------------------------------------------------------------------+
//|                                                      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' é um TIPO DE DADOS. É necessário criar um objecto com este tipo e depois chamar OBJECT.GetCurrentPositionProperty();

Experimentei-o. Tal objecto é criado, declarado logo após a declaração do

StrPositionArray[].

Se o colocar no OnTick

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

recebemos um erro:

']' - expressão esperada eSower_and_Gather_5.mq5 69 21

Esta é a mesma linha, apenas o segundo parêntesis, o que está imediatamente antes do ponto.
 
Vladimir Karputov:

Código: (apenas chamar uma função - função EA, não um método de estrutura - que faz mais sentido)

Então usar :: foi uma ideia fútil?

Então porque é que escreveu a função

GetCurrentPositionProperty()

dentro da estrutura? Encheria a estrutura sem qualquer enchimento dentro dela, não é verdade? Por favor esclareça, estou confuso, talvez esta seja uma característica obsoleta, devo esquecê-la?

 
Sergey Voytsekhovsky:

Então a utilização de :: foi uma perda de tempo?

Então porque escreveria uma função

dentro da estrutura???? Preenche perfeitamente a estrutura, mesmo sem ela. Por favor esclareça, estou confuso, talvez esta seja uma ideia obsoleta que deve ser esquecida.

Copipasta. Resta uma linha após a copipasta.

Deve ser assim (não há métodos dentro da estrutura)

//+------------------------------------------------------------------+
//| 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:

Copipasta. Resta uma linha após a co-pasta.

Deve ser assim (não há métodos dentro da estrutura)

Bem, passei tanto tempo na lição. Embora fosse para MT4, foi aí apresentado como um truque, por isso aqui está um extracto do texto:

1
2
3
4
5
6
7
8
9
10
11
12
estado estrutural
{
int buy_count; // número de ordens de compra
int sell_count; // número de ordens de venda
compra_bottom_price dupla; // preço aberto da ordem de compra mais baixa
venda_do dobro do preço; //preço de abertura da ordem de venda mais alta
lucro duplo; // lucro de todas as encomendas
// método de recolha de informações sobre o estado da conta
// e renovar os elementos da estrutura
Refresque nulo() ;
} Estado;

A estrutura tem um método Refresh() que calcula e atribui valores aos elementos da estrutura. Vamos definir o corpo do método fora da estrutura. Para tal, utilizamos a operação de resolução de contexto (:::). O contexto é um descritor (nome) da estrutura:

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
//+------------------------------------------------------------------+
//| O método recolhe informação sobre o estado actual da conta |
//| e actualiza os campos relevantes da estrutura |
//+------------------------------------------------------------------+
estado nulo::Refresh( vazio )
{
//zero os campos numéricos da estrutura
ZeroMemory( isto );
para ( int i=OrdensTotal()-1; i>=0; i--)
se (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
se (OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
{
duplo OpenPrice=OrderOpenPrice();
profit+=OrderProfit()+OrderComission()+OrderSwap();
interruptor (OrderType())
{
caso OP_BUY:
buy_count+++;
se (OpenPrice<buy_bottom_price || buy_bottom_price==0)
buy_bottom_price=OpenPrice;
pausa ;
caso OP_SELL:
sell_count+++;
se (OpenPrice>sell_top_price || sell_top_price==0)
sell_top_price=OpenPrice;
pausa ;
}
}
}

Note-se que no corpo do método nos referimos a elementos da estrutura sem utilizar um ponto, uma vez que utilizámos a operação de resolução de contexto. Os campos numéricos são zerados por ZeroMemory() com esta palavra-chave antes de serem actualizados no início do corpo do método, pelo que a estrutura passa uma referência a si mesma.

O código EA principal dentro do manipulador OnTick() terá agora o seguinte aspecto

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
//+------------------------------------------------------------------+
//| Função de carrapato de perito|
//+------------------------------------------------------------------+
nulo OnTick()
{
para ( int i=0; i<2000; i++)
{
duplo b=MathSqrt(i);
}
// abrir novas encomendas e só ter lucro na abertura de um novo bar
se (IsNewBar())
{
// obter um novo sinal
int Signal=GetSignal();
// abandonar imediatamente a função se o sinal não tiver sido gerado no bar fechado.
se (Sinal<0)
voltar ;
//refazer a estrutura
State.Refresh(); // (!! !)