Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1264

 
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                                              |
//+------------------------------------------------------------------+
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();                    // своп
            }
      } 
} 
//+------------------------------------------------------------------+

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.

 
Sergey Voytsekhovsky:

'.' - 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.

 
Vladimir Karputov:

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.

 
Vladimir Karputov:

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.

 
Sergey Voytsekhovsky:

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;

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

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

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

erhalten wir einen Fehler:

']' - Ausdruck erwartet eSower_and_Gather_5.mq5 69 21

Dies ist die gleiche Zeile, nur die zweite Klammer, die vor dem Punkt.
 
Vladimir Karputov:

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?

 
Sergey Voytsekhovsky:

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)

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

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:

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
//+------------------------------------------------------------------+
//| Die Methode sammelt Informationen über den aktuellen Zustand des Kontos
//| und aktualisiert die entsprechenden Felder der Struktur |
//+------------------------------------------------------------------+
void state::Refresh( void )
{
//Nullstellung der numerischen Felder der Struktur
ZeroMemory( this );
for ( int i=OrdersTotal()-1; i>=0; i--)
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
{
double OpenPrice=OrderOpenPrice();
Gewinn+=OrderProfit()+OrderCommission()+OrderSwap();
switch (Auftragsart())
{
Fall OP_BUY:
buy_count++;
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 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

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
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
{
for ( int i=0; i<2000; i++)
{
double b=MathSqrt(i);
}
// neue Orders eröffnen und nur bei Eröffnung eines neuen Balkens Gewinn mitnehmen
if (IstNeuerBalken())
{
// ein neues Signal erhalten
int Signal=GetSignal();
// Sofortiges Beenden der Funktion, wenn das Signal nicht auf dem geschlossenen Balken erzeugt worden ist.
wenn (Signal<0)
zurück;
//Auffrischung der Struktur
State.Refresh(); // (!! !)
Grund der Beschwerde: