Salve.Sono stato ispiratodalla lezione "Using Structures for Effective Program Development"e ho creato una semplice struttura come questa in 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(); // своп
}
}
}
//+------------------------------------------------------------------+
Nella struttura
POSIZIONE_STRUTTURA
la struttura contiene il metodo
GetCurrentPositionProperty(void)
che calcola e assegna valori agli elementi della struttura. Definire il corpo del metodo al di fuori della struttura. Per farlo, usate l'operazione di risoluzione del contesto (::).
Cos'è la linea 69 19? Si prega di pubblicare la linea di codice 69 e di specificare dove si trova la posizione 19. Sarà immediatamente chiaro dove si trova l'errore.
Cos'è la linea 69 19? Codice postale linea 69 e specificare dove si trova la 19a posizione. Sarà immediatamente chiaro dove si trova l'errore.
Questo è un punto che deve dare accesso a una funzione che a sua volta utilizza il contesto della struttura. Ma non riesco a capire perché non funziona.
Любая программа оперирует данными. Данные могут быть различных типов в зависимости от назначения. Например, для доступа к элементам массива используются данные целочисленного типа. Ценовые данные имеют тип двойной точности с плавающей точкой. Это связано с тем, что в языке MQL5 не предусмотрено специального типа для ценовых данных. Данные...
Questo è il punto che dovrebbe dare accesso alla funzione, che a sua volta utilizza il contesto della struttura. Ma perché non funziona non riesco a capire.
Codice: (basta chiamare una funzione - funzione EA, non un metodo di struttura - che ha più senso)
//+------------------------------------------------------------------+//| 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(); // своп
}
}
}
//+------------------------------------------------------------------+
Codice: (basta chiamare una funzione - funzione EA, non un metodo di struttura - che ha più senso)
Quindi usare :: era un'idea inutile?
Allora perché hai scritto la funzione
GetCurrentPositionProperty()
all'interno della struttura? Riempirebbe la struttura senza alcun riempimento al suo interno, vero? Per favore chiarite, sono confuso, forse questa è una funzione obsoleta, dovrei dimenticarla?
all'interno della struttura? Cioè, riempirà perfettamente la struttura anche senza. Per favore, chiarisci, sono confuso, forse questa è un'idea obsoleta che dovrebbe essere dimenticata.
Copia-incolla. C'è una linea rimasta dopo il copia-incolla.
Dovrebbe essere così (non ci sono metodi all'interno della struttura)
Copia-incolla. C'è una linea lasciata dopo il copia-incolla.
Dovrebbe essere così (non ci sono metodi all'interno della struttura)
Beh, ho speso tanto tempo per la lezione. Anche se era per MT4, è stato presentato lì come un trucco, quindi ecco un estratto del testo:
1
2
3
4
5
6
7
8
9
10
11
12
struttura stato
{
int buy_count; // numero di ordini di acquisto
int sell_count; // numero di ordini di vendita
double buy_bottom_price; //prezzo di apertura dell'ordine di acquisto più basso
double sell_top_price; //prezzo di apertura dell'ordine di vendita più alto
doppio profitto; // profitto di tutti gli ordini
// metodo per raccogliere informazioni sullo stato dell'account
// e aggiornare gli elementi della struttura
void Refresh() ;
} Stato;
La struttura ha un metodoRefresh() che calcola e assegna valori agli elementi della struttura. Definiamo il corpo del metodo fuori dalla struttura. Per fare questo, usiamo l'operazione di risoluzione del contesto (::). Il contesto è un descrittore (nome) della struttura:
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 ;
}
}
}
Notate che nel corpo del metodo ci riferiamo agli elementi della struttura senza usare un punto, poiché abbiamo usato l'operazione di risoluzione del contesto. I campi numerici sono azzerati daZeroMemory() con la parola chiave this prima di aggiornarli all'inizio del corpo del metodo, quindi la struttura passa un riferimento a se stessa.
Il codice principale di EA all'interno del gestore OnTick() sarà ora simile a questo
Nella struttura
POSIZIONE_STRUTTURA
la struttura contiene il metodo
GetCurrentPositionProperty(void)
che calcola e assegna valori agli elementi della struttura. Definire il corpo del metodo al di fuori della struttura. Per farlo, usate l'operazione di risoluzione del contesto (::).
In OnTick() chiamiamo la funzione:
void OnTick() { //--- STRUCT_POSITION.GetCurrentPositionProperty(); }
E qui otteniamo un errore:
'.' - nome atteso eSower_and_Gather_5.mq5 69 19
Non so dove sia andato storto, per favore aiutatemi.
'.' - nome previsto eSower_and_Gather_5.mq5 69 19
Cos'è la linea 69 19? Si prega di pubblicare la linea di codice 69 e di specificare dove si trova la posizione 19. Sarà immediatamente chiaro dove si trova l'errore.
Cos'è la linea 69 19? Codice postale linea 69 e specificare dove si trova la 19a posizione. Sarà immediatamente chiaro dove si trova l'errore.
STRUCT_POSITION.GetCurrentPositionProperty();È evidenziato in rosso nel post sopra. Grazie per la sua pronta risposta.
Cos'è la linea 69 19? Codice postale linea 69 e specificare dove si trova la 19a posizione. Sarà immediatamente chiaro dove si trova l'errore.
Questo è un punto che deve dare accesso a una funzione che a sua volta utilizza il contesto della struttura. Ma non riesco a capire perché non funziona.
è evidenziato in rosso nel post sopra. Grazie per la sua pronta risposta.
STRUCT_POSITION' è un TIPO DI DATI. Dovete creare una variabile con questo tipo e poi chiamare VARIABLE.GetCurrentPositionProperty();
Questo è il punto che dovrebbe dare accesso alla funzione, che a sua volta utilizza il contesto della struttura. Ma perché non funziona non riesco a capire.
Codice: (basta chiamare una funzione - funzione EA, non un metodo di struttura - che ha più senso)
STRUCT_POSITION' è un TIPO DI DATI. Dovete creare un oggetto con questo tipo e poi chiamare OBJECT.GetCurrentPositionProperty();
Provato. Tale oggetto viene creato, dichiarato subito dopo la dichiarazione dell'elemento
StrPositionArray[].
Se lo metti in OnTick
otteniamo un errore:
']' - espressione prevista eSower_and_Gather_5.mq5 69 21
Codice: (basta chiamare una funzione - funzione EA, non un metodo di struttura - che ha più senso)
Quindi usare :: era un'idea inutile?
Allora perché hai scritto la funzione
all'interno della struttura? Riempirebbe la struttura senza alcun riempimento al suo interno, vero? Per favore chiarite, sono confuso, forse questa è una funzione obsoleta, dovrei dimenticarla?
Quindi usare :: è stata una perdita di tempo?
Allora perché scrivere una funzione
all'interno della struttura? Cioè, riempirà perfettamente la struttura anche senza. Per favore, chiarisci, sono confuso, forse questa è un'idea obsoleta che dovrebbe essere dimenticata.
Copia-incolla. C'è una linea rimasta dopo il copia-incolla.
Dovrebbe essere così (non ci sono metodi all'interno della struttura)
Copia-incolla. C'è una linea lasciata dopo il copia-incolla.
Dovrebbe essere così (non ci sono metodi all'interno della struttura)
Beh, ho speso tanto tempo per la lezione. Anche se era per MT4, è stato presentato lì come un trucco, quindi ecco un estratto del testo:
La struttura ha un metodo Refresh() che calcola e assegna valori agli elementi della struttura. Definiamo il corpo del metodo fuori dalla struttura. Per fare questo, usiamo l'operazione di risoluzione del contesto (::). Il contesto è un descrittore (nome) della struttura:
Notate che nel corpo del metodo ci riferiamo agli elementi della struttura senza usare un punto, poiché abbiamo usato l'operazione di risoluzione del contesto. I campi numerici sono azzerati da ZeroMemory() con la parola chiave this prima di aggiornarli all'inizio del corpo del metodo, quindi la struttura passa un riferimento a se stessa.
Il codice principale di EA all'interno del gestore OnTick() sarà ora simile a questo