Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 121

 
Ihor Herasko:

Schreiben Sie mindestens einen Satz und zeigen Sie ihn. Der nächste Schritt ist, sie hier vorzuschlagen.

Zu den Arrays: Hier habe ich 4 Arrays auf globaler Ebene deklariert:

// массивы, в которых будут храниться характеристики ордеров:
int _OrderTicket[],_OrderType[];
double _OrderOpenPrice[];
datetime _OrderOpenTime[];

Dann habe ich sie in der Positionseröffnungsfunktion auf Null gestellt:

   // обнуляем массивы
   ArrayInitialize(_OrderTicket,0);
   ArrayInitialize(_OrderType,0);
   ArrayInitialize(_OrderOpenPrice,0);
   ArrayInitialize(_OrderOpenTime,0);

Wie kann ich sie jetzt füllen? In dem Beispiel, mit dem ich es zu tun versuche, wird eine zusätzliche Variable verwendet, aber ich verstehe nicht, wie man sie benutzt:

// переменная, которая будет хранить количество ордеров, 
// принадлежащих эксперту:
int _ExpertOrdersTotal=0;

Allerdings ist mir nicht ganz klar, warum ich all diese Arrays benötige, wenn ich die Werte des Tickets, des Positionstyps, des Eröffnungskurses und der Eröffnungszeit mit der entsprechenden Funktion abrufen kann.

 
novichok2018:

Zu den Arrays: Hier habe ich 4 Arrays auf globaler Ebene deklariert:

Dann habe ich sie in der Funktion " Position öffnen" auf Null gestellt:

Wie kann ich sie jetzt füllen? In dem Beispiel, das ich zu verwenden versuche, wird eine zusätzliche Variable verwendet, aber ich verstehe nicht, wie man sie verwendet:

Obwohl es nicht ganz klar ist, warum all diese Arrays, wenn ich die Werte des Tickets, des Positionstyps, des offenen Preises und der offenen Zeit mit der entsprechenden Funktion erhalten kann.

Versuchen Sie, von Grund auf neu zu schreiben und alle Zwischendaten mit Alert(. Zum Beispiel

int ord=OrdersTotal();
if ! ord )
{
   Alert("Ордера отсутствуют. Выход");
   return;
} else   Alert("Всего ордеров = ", ord);

// Посмотрев, что получилось, добавляете:
int n;
int Ords[10];
for(n=0; n<ord && n<10; n++)
{
   OrderSelect(...
}

Und wenn Sie sich ein Beispiel an jemandem nehmen, nehmen Sie es vollständig auf und studieren Sie es. Wer weiß, wofür der Autor des Beispiels Arrays verwendet

 
novichok2018:

Zu den Arrays: Hier habe ich 4 Arrays auf globaler Ebene deklariert:

Verwenden Sie eine Reihe von Strukturen. Sie wird viel leichter zugänglich sein. Hier ist eine Variante mit einem statischen Array. Es ist leichter zu verstehen. Aber ich verwende selbst dynamische Arrays. Aber der Code wird mit ihnen etwas größer werden.

#define MAX_ORDERS_CNT   int(500)
struct OrderInfo
{
   int      nTicket;
   int      nType;
   double   fOpenPrice;
   double   fSL;
   double   fTP;
   datetime dtOpenTime;
};

OrderInfo  arrstOrderInfo[MAX_ORDERS_CNT];

Dann habe ich sie auf die Funktion der Positionsöffnung eingestellt:

Nein, das haben Sie nicht. Denn es werden dynamische Arrays deklariert, die standardmäßig eine Größe von Null haben. In diesem Fall bewirken diese vier Codezeilen also nichts.

Wie füllt man sie nun aus? Das Beispiel, das ich zu verwenden versuche, hat eine zusätzliche Variable, aber ich verstehe nicht, wie ich sie verwenden soll:

Als nächstes wird eine Schleife von Aufträgen organisiert, in der jeder "eigene" Auftrag in einem Array gespeichert wird:

g_nOrderCnt = 0;
for (int i = OrdersTotal() - 1; i >= 0; --i)
{
   if (!OrderSelect(i, SELECT_BY_POS))
      continue;

   if (OrderSymbol() != Symbol())   // Если нужны ордера только по текущему символу, к графику которого прикреплен советник
      continue;

   if (OrderMagicNumber != i_nMagicNumber)  // Если имеется входной параметр советника i_nMagicNumber, в котором указан ID ордеров советника
      continue;

   if (g_nOrderCnt < MAX_ORDERS_CNT)
      continue;

   g_arrstOrderInfo[g_nOrdersCnt].nTicket = OrderTicket();
   g_arrstOrderInfo[g_nOrdersCnt].nType = OrderType();
   g_arrstOrderInfo[g_nOrdersCnt].fOpenPrice = OrderOpenPrice();
   g_arrstOrderInfo[g_nOrdersCnt].fSL = OrderStopLoss();
   g_arrstOrderInfo[g_nOrdersCnt].fTP = OrderTakeProfit();

   ++g_nOrdersCnt;
}

Allerdings bin ich mir nicht ganz sicher, wozu all diese Arrays dienen, wenn ich die Werte des Tickets, der Positionsart, des Eröffnungskurses und der Eröffnungszeit mit der entsprechenden Funktion abrufen kann.

Es ist viel schneller und bequemer, mit Arrays zu arbeiten, da im Allgemeinen nicht alle im Konto vorhandenen Aufträge von diesem speziellen EA verarbeitet werden müssen. Und wir werden dadurch eine Menge Aufwand und Geld sparen.

Außerdem ist der oben genannte Fall ein allgemeiner. Universalismus ist natürlich nicht immer notwendig. In der Regel werden solche Arrays auf der Grundlage der Anforderungen einer Strategie erstellt. Zum Beispiel können wir die Aufträge sofort nach Typ aufteilen: Kaufen, Verkaufen, BuyStop, SellStop, BuyLimit, SellLimit. Dann brauchen wir vier solcher Arrays. Aber dann müssen wir nicht noch einmal die gesamte Liste der offenen Aufträge durchgehen, wenn wir Handelsentscheidungen treffen. Wir müssen nur die Anzahl der Aufträge eines bestimmten Typs kennen und auf das erforderliche Array verweisen.

Es gibt noch eine weitere wichtige Sache zu beachten: die Änderung der Auftragsreihe während der Verarbeitung eines Ticks. Es kann durchaus vorkommen, dass eine Liste von Aufträgen am Eingang von OnTick empfangen wurde und eine andere irgendwo in der Mitte. Dies führt zu einem Fehler im Programmablauf, der nur schwer zu erkennen ist. Und das Array der Orders, das bereits beim Eintritt in OnTick gebildet wurde, wird sich nicht ändern (es sei denn, Sie ändern es selbst während der Ausführung des Programms).

 
STARIJ:

string s=FileReadString(F1); // String der Textdatei lesen
StringSplit(s, "," , a); // Kommagetrennte Zeichenkettenelemente in ein Array
datetime T1=StrToTime(a[4]); // Außerdem wird die Transformation ...
int ord=StrToInteger(a[8]);
double Preis=StrToDouble(a[12]);

Danke, genau das, was ich wollte.



Als nächstes werden 5 Produkte hergestellt

Wir fügen eine Warnmeldung hinzu (jede Meldung)

zum Beispiel Stufe "200"

Wenn der Alarm ausgelöst wird, öffnet etwas die Pose, etwas löscht sich selbst, etwas tut andere Dinge. Ich möchte einen Mechanismus implementieren, um ein Signal auf diese Weise zu geben


P.S.

Ich habe fertiggestellt, was ich wollte, ich kann es zur Überprüfung schicken. Die Schuppen sind perfekt. Aber es ist verboten, hier zu posten.

 
Ihor Herasko:

Es ist zum Beispiel möglich, Aufträge sofort nach Typ aufzuteilen: Kaufen, Verkaufen, BuyStop, SellStop, BuyLimit, SellLimit. Dann brauchen wir vier solcher Arrays. Aber dann müssen wir nicht noch einmal die gesamte Liste der offenen Aufträge durchgehen, wenn wir Handelsentscheidungen treffen. Wir müssen nur die Anzahl der Aufträge eines bestimmten Typs kennen und auf das erforderliche Array verweisen.

Das ist genau das, was ich brauche, oder besser gesagt, nur fürBuy and Sell. Das Wichtigste bei meiner einfachen Strategie ist, dass sich die offenen Positionen nicht gegenseitig stören, um die Schlussbedingungen zu sehen. Vielleicht können wir ohne Arrays auskommen? Ich verstehe sie nicht: wie man sie schafft, wie man sie angeht - ich tappe im Dunkeln. Vielleicht wird Ihnen meine Situation auf dem Screenshot deutlicher:

Es scheint, dass alles im Code einfach ist und klar funktioniert, aber dies ist der einzige Fall von Unverständnis.

 
novichok2018:

Das ist genau das, was ich brauche, oder besser gesagt nur fürBuy and Sell. Bei meiner einfachen Strategie kommt es vor allem darauf an, dass sich die offenen Positionen nicht gegenseitig in die Quere kommen. Vielleicht können wir ohne Arrays auskommen? Ich verstehe sie nicht: wie man sie schafft, wie man sie angeht - ich tappe im Dunkeln. Vielleicht wird Ihnen meine Situation auf dem Screenshot deutlicher:

Es scheint, dass alles im Code einfach ist und klar funktioniert, aber dies ist der einzige Fall von Unverständnis.

Natürlich, in der einfachsten (und mittlere Komplexität) ist es bequemer, ohne Arrays. Und wenn Sie Hunderte von Aufträgen haben, ist es viel einfacher, zwischen den Aufträgen zu unterscheiden. Zum Beispiel, nach OrderType() - eine zu kaufen 0, die andere zu verkaufen 1. Die Strategie Ihres Händlers ist gut - Sie können 1 Tag gewinnen oder die Hälfte eines Tages verlieren. Das Einzige, was wir brauchen, ist, wie wir diese Pfeile fangen können. Und sie sind zu häufig. Es ist sinnvoll, zuerst zu lernen, wie man Signale gibt: Kaufen und Verkaufen
 
LRA:
Natürlich, in der einfachsten (und mittlere Komplexität) ohne Arrays ist bequemer. Aber wenn man an den Punkt kommt, an dem man Hunderte von Aufträgen benötigt - dann...

Könnte es der Grund für meine Situation sein, dass das Log schreibt: 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138 und wiederholt sich stetig bis

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Alert: Total orders = 3 ? Auf dem Screenshot können Sie sehen, dass dieser Zeitraum zwei Abschlussbedingungen des SELL erfasst.

Und die Signale zur Eröffnung einer Position werden durch eine Kombination mehrerer Indikatoren ausgelöst und durch einen Indikator geschlossen. Und sie funktionieren nicht so oft: Es kann ein paar Tage lang fünf Minuten lang still sein. Zum Beispiel wurden seit dem 1. Februar dieses Jahres nur 14 Positionen ausgelöst.


 
novichok2018:

Könnte es der Grund für meine Situation sein, dass das Log schreibt: 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138 und wiederholt sich stetig bis

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Alert: Total orders = 3 ? Auf dem Screenshot sehen Sie, dass dieser Zeitraum zwei enge Bedingungen erfasst

Wie ist Ihre Situation? Wollen Sie damit sagen, dass das Terminal einen Protokolleintrag erstellt, der den Fehler verursacht? und was bedeutet 138? Wissen Sie, wo Sie suchen müssen? Wie Sie das geschafft haben, ist ein sehr seltener Fehler. Was Sie auf dem Bildschirmfoto sehen, ist die halbe Miete. Wie kann man das dem Expert Advisor erklären? Man muss eine mathematische Bedingung schreiben - statt den Screenshot zu sehen, arbeitet der Expert Advisor mit Zahlen

 
LRA:

Wollen Sie damit sagen, dass das Terminal einen Protokolleintrag erstellt, der den Fehler verursacht? ... Was bedeutet 138? Wissen Sie, wo Sie suchen müssen?

Nein, ich will damit sagen, dass der Tester in diesem Intervall der Geschichte versagt, was verhindert, dass die Signale korrekt funktionieren. Denn die Requotes können nicht 24 Stunden lang weiterlaufen.

 
novichok2018:

Nein, was ich sagen will, ist, dass es an diesem Punkt in der Geschichte einen Fehler im Prüfgerät gibt, der verhindert, dass die Signale korrekt funktionieren. Denn Requotes können nicht 24 Stunden lang laufen.

Das ist das erste Mal, dass ich davon höre. Der Tester ist ideal - er hat nicht einmal Schlupf

...irgendetwas stößt den Indikator an - Tendenz steigend. Ich werde kaufen ... Ich hab's... Obwohl es nicht genug ist, wollte ich TP nach oben verschieben - es hat bereits funktioniert...

Stellen Sie also einen EA so ein, dass er, wenn er das tut, aussteigt und mit dem nächsten Tick fortfährt. Und probieren Sie es mit der Demo