Hallo.Ich habe michvon der Lektion "Strukturen für eine effektive Programmentwicklung nutzen"inspirieren lassen und eine einfache Struktur wie diese in MT5 erstellt.
#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(); // своп
}
}
}
//+------------------------------------------------------------------+
In der Struktur
STRUCT_POSITION
Struktur enthält Methode
GetCurrentPositionProperty(void)
die die Elemente der Struktur berechnet und ihnen Werte zuweist. Definieren Sie den Körper der Methode außerhalb der Struktur. Verwenden Sie dazu die Operation der Kontextauflösung (::).
Wie lautet Zeile 69 19? Bitte veröffentlichen Sie die Codezeile 69 und geben Sie an, wo sich die Position 19 befindet. Es wird sofort klar, wo der Fehler liegt.
Wie lautet Zeile 69 19? Buchen Sie die Codezeile 69 und geben Sie an, wo sich die 19. Stelle befindet. Es wird sofort klar, wo der Fehler liegt.
Dies ist ein Punkt, der den Zugang zu einer Funktion ermöglichen muss, die ihrerseits den Strukturkontext verwendet. Aber ich verstehe nicht, warum es nicht funktioniert.
Любая программа оперирует данными. Данные могут быть различных типов в зависимости от назначения. Например, для доступа к элементам массива используются данные целочисленного типа. Ценовые данные имеют тип двойной точности с плавающей точкой. Это связано с тем, что в языке MQL5 не предусмотрено специального типа для ценовых данных. Данные...
Dies ist der Punkt, der den Zugriff auf die Funktion ermöglichen soll, die wiederum den Kontext der Struktur nutzt, so wie ich es in den Lehrbüchern verstanden habe. Aber warum es nicht funktioniert, kann ich nicht verstehen.
Code: (nur Aufruf einer Funktion - EA-Funktion, nicht einer Strukturmethode - das macht mehr Sinn)
//+------------------------------------------------------------------+//| 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(); // своп
}
}
}
//+------------------------------------------------------------------+
Code: (nur Aufruf einer Funktion - EA-Funktion, nicht einer Strukturmethode - das macht mehr Sinn)
Die Verwendung von :: war also eine sinnlose Idee?
Warum haben Sie dann die Funktion
GetCurrentPositionProperty()
im Inneren der Struktur? Es würde die Struktur ausfüllen, ohne dass eine Füllung darin ist, nicht wahr? Bitte klären Sie mich auf, ich bin verwirrt, vielleicht ist dies eine veraltete Funktion, ich sollte sie vergessen?
im Inneren der Struktur. Ich meine, sie wird die Struktur auch ohne sie perfekt ausfüllen. Bitte klären Sie mich auf, ich bin verwirrt, vielleicht ist dies eine veraltete Idee, die vergessen werden sollte.
Kopieren und Einfügen. Nach dem Kopieren und Einfügen bleibt eine Zeile übrig.
Sie sollte wie folgt aussehen (es gibt keine Methoden innerhalb der Struktur)
Kopieren und Einfügen. Nach dem Kopieren ist eine Zeile übrig geblieben.
Sie sollte wie folgt aussehen (es gibt keine Methoden innerhalb der Struktur)
Nun, ich habe so viel Zeit mit dem Unterricht verbracht. Obwohl es für MT4 war, wurde es dort als Trick präsentiert, daher hier ein Auszug aus dem Text:
1
2
3
4
5
6
7
8
9
10
11
12
Strukturzustand
{
int buy_count; // Anzahl der Kaufaufträge
int sell_count; // Anzahl der Verkaufsaufträge
double buy_bottom_price; //Eröffnungspreis der niedrigsten Kauforder
double sell_top_price; //Offener Preis der höchsten Verkaufsorder
double profit; // Gewinn aller Aufträge
// Methode zum Sammeln von Informationen über den Zustand des Kontos
// und aktualisieren die Elemente der Struktur
void Refresh() ;
} Staat;
Die Struktur verfügt über eine Refresh()-Methode, die Werte berechnet und den Elementen der Struktur zuweist. Definieren wir den Körper der Methode außerhalb der Struktur. Zu diesem Zweck verwenden wir die Operation der Kontextauflösung (::). Der Kontext ist ein Deskriptor (Name) der Struktur:
if (OpenPrice<buy_bottom_price || buy_bottom_price==0)
buy_bottom_price=OpenPrice;
Pause ;
Fall OP_SELL:
sell_count++;
if (Eröffnungspreis>Verkaufsspitzenpreis || Verkaufsspitzenpreis==0)
sell_top_price=OpenPrice;
Pause ;
}
}
}
Beachten Sie, dass wir uns im Hauptteil der Methode auf Elemente der Struktur beziehen, ohne einen Punkt zu verwenden, da wir die Operation der Kontextauflösung verwendet haben. Numerische Felder werden durchZeroMemory() mit dem Schlüsselwort this auf Null gesetzt, bevor sie am Anfang des Methodenkörpers aktualisiert werden, so dass die Struktur einen Verweis auf sich selbst übergibt.
Der EA-Hauptcode innerhalb des OnTick()-Handlers sieht nun wie folgt aus
In der Struktur
STRUCT_POSITION
Struktur enthält Methode
GetCurrentPositionProperty(void)
die die Elemente der Struktur berechnet und ihnen Werte zuweist. Definieren Sie den Körper der Methode außerhalb der Struktur. Verwenden Sie dazu die Operation der Kontextauflösung (::).
In OnTick() rufen wir die Funktion auf:
void OnTick() { //--- STRUCT_POSITION.GetCurrentPositionProperty(); }
Und hier erhalten wir einen Fehler:
'.' - name expected eSower_and_Gather_5.mq5 69 19
Ich weiß nicht, wo der Fehler liegt, bitte helfen Sie mir.
'.' - Name erwartet eSower_and_Gather_5.mq5 69 19
Wie lautet Zeile 69 19? Bitte veröffentlichen Sie die Codezeile 69 und geben Sie an, wo sich die Position 19 befindet. Es wird sofort klar, wo der Fehler liegt.
Wie lautet Zeile 69 19? Buchen Sie die Codezeile 69 und geben Sie an, wo sich die 19. Stelle befindet. Es wird sofort klar, wo der Fehler liegt.
STRUCT_POSITION.GetCurrentPositionProperty();Sie ist im obigen Beitrag rot hervorgehoben. Ich danke Ihnen für Ihre prompte Antwort.
Wie lautet Zeile 69 19? Buchen Sie die Codezeile 69 und geben Sie an, wo sich die 19. Stelle befindet. Es wird sofort klar, wo der Fehler liegt.
Dies ist ein Punkt, der den Zugang zu einer Funktion ermöglichen muss, die ihrerseits den Strukturkontext verwendet. Aber ich verstehe nicht, warum es nicht funktioniert.
Sie ist im obigen Beitrag rot hervorgehoben. Ich danke Ihnen für Ihre prompte Antwort.
STRUCT_POSITION' ist ein DATA TYPE. Sie müssen eine Variable mit diesem Typ erstellen und dann VARIABLE.GetCurrentPositionProperty() aufrufen;
Dies ist der Punkt, der den Zugriff auf die Funktion ermöglichen soll, die wiederum den Kontext der Struktur nutzt, so wie ich es in den Lehrbüchern verstanden habe. Aber warum es nicht funktioniert, kann ich nicht verstehen.
Code: (nur Aufruf einer Funktion - EA-Funktion, nicht einer Strukturmethode - das macht mehr Sinn)
STRUCT_POSITION' ist ein DATA TYPE. Sie müssen ein Objekt dieses Typs erstellen und dann OBJECT.GetCurrentPositionProperty() aufrufen;
Ich habe es ausprobiert. Ein solches Objekt wird erstellt und direkt nach der Deklaration der
StrPositionArray[].
Wenn Sie es zu OnTick hinzufügen
erhalten wir einen Fehler:
']' - Ausdruck erwartet eSower_and_Gather_5.mq5 69 21
Code: (nur Aufruf einer Funktion - EA-Funktion, nicht einer Strukturmethode - das macht mehr Sinn)
Die Verwendung von :: war also eine sinnlose Idee?
Warum haben Sie dann die Funktion
im Inneren der Struktur? Es würde die Struktur ausfüllen, ohne dass eine Füllung darin ist, nicht wahr? Bitte klären Sie mich auf, ich bin verwirrt, vielleicht ist dies eine veraltete Funktion, ich sollte sie vergessen?
Die Verwendung von :: war also Zeitverschwendung?
Warum sollten Sie dann eine Funktion schreiben
im Inneren der Struktur. Ich meine, sie wird die Struktur auch ohne sie perfekt ausfüllen. Bitte klären Sie mich auf, ich bin verwirrt, vielleicht ist dies eine veraltete Idee, die vergessen werden sollte.
Kopieren und Einfügen. Nach dem Kopieren und Einfügen bleibt eine Zeile übrig.
Sie sollte wie folgt aussehen (es gibt keine Methoden innerhalb der Struktur)
Kopieren und Einfügen. Nach dem Kopieren ist eine Zeile übrig geblieben.
Sie sollte wie folgt aussehen (es gibt keine Methoden innerhalb der Struktur)
Nun, ich habe so viel Zeit mit dem Unterricht verbracht. Obwohl es für MT4 war, wurde es dort als Trick präsentiert, daher hier ein Auszug aus dem Text:
Die Struktur verfügt über eine Refresh()-Methode, die Werte berechnet und den Elementen der Struktur zuweist. Definieren wir den Körper der Methode außerhalb der Struktur. Zu diesem Zweck verwenden wir die Operation der Kontextauflösung (::). Der Kontext ist ein Deskriptor (Name) der Struktur:
Beachten Sie, dass wir uns im Hauptteil der Methode auf Elemente der Struktur beziehen, ohne einen Punkt zu verwenden, da wir die Operation der Kontextauflösung verwendet haben. Numerische Felder werden durch ZeroMemory() mit dem Schlüsselwort this auf Null gesetzt, bevor sie am Anfang des Methodenkörpers aktualisiert werden, so dass die Struktur einen Verweis auf sich selbst übergibt.
Der EA-Hauptcode innerhalb des OnTick()-Handlers sieht nun wie folgt aus