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 |//+------------------------------------------------------------------+structSTRUCT_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; // комментарийvoidGetCurrentPositionProperty();
};
STRUCT_POSITION StrPositionArray[];
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---STRUCT_POSITION.GetCurrentPositionProperty();
}
//+------------------------------------------------------------------+//---Заполнение массива свойств позиций +//+------------------------------------------------------------------+voidSTRUCT_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 (:::).
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.
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.
Любая программа оперирует данными. Данные могут быть различных типов в зависимости от назначения. Например, для доступа к элементам массива используются данные целочисленного типа. Ценовые данные имеют тип двойной точности с плавающей точкой. Это связано с тем, что в языке MQL5 не предусмотрено специального типа для ценовых данных. Данные...
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 |//+------------------------------------------------------------------+intOnInit()
{
//---//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
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(); // своп
}
}
}
//+------------------------------------------------------------------+
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?
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)
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étodoRefresh() 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:
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 porZeroMemory() 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
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.
'.' - 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.
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.
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.
é 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();
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)
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
recebemos um erro:
']' - expressão esperada eSower_and_Gather_5.mq5 69 21
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
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?
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)
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:
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:
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