[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 421

 

... Fortsetzung...

Am Ende des Unterabschnitts StringSubstr Function steht in Klammern der folgende Satz: "Separat müssen wir beachten, dass wirin der ersten for-Schleife (meine Anmerkung: es muss deinit() sein, da es keine andere Möglichkeit gibt, Objekte zu löschen) keine Objekte löschen können, da sich nach jedem Löschen die Anzahl der Objekte und ihre Nummerierung ändert und einige Objektnamen übersprungen werden". In dem zitierten EA gibt es jedoch überhaupt keine zweite for-Schleife . Außerdem wird die in der Funktion deinit() vor der for-Schleife definierte Variable Quant_Del mit Null initialisiert, während die Variable i vor der for-Schleife nirgends definiert wurde.

   for(int k=0; k<=Quant_Del; i++)     // Удаляем объекты с именами,.. 
         ObjectDelete(Name_Del[i]);       // .. имеющимися в массиве

es stellt sich heraus, dass der obige Code einfach mehrere Programmzeilen auslässt.

Die erste Frage lautet also: Handelt es sich wirklich um eine triviale Auslassung einiger Zeilen oder ist das Programm so kompliziert, dass ein Anfänger seine Bedeutung nicht ohne fremde Hilfe verstehen kann?

Außerdem... Im selben Kapitel desselben Abschnitts befindet sich vor dem zitierten Text ein Link zu demselben Expert Advisor (in der angehängten Datei), der, wenn er angeklickt wird, denselben Expert Advisor in MetaElitor öffnet. Der Text dieses Expert Advisors ist jedoch anders: Die Funktion deinit() sieht wie folgt aus

//--------------------------------------------------------------- 9 --
int deinit()                           // Спец. функция deinit()
  {
   string Name_Del[1];                 // Объявление массива
   int Quant_Del=0;                    // Количество удаляемых объекто
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   ArrayResize(Name_Del,Quant_Objects);// Необходимый размер массива
   for(int k=0; k<Quant_Objects; k++)  // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Найден объект, ..
        {                              // .. начинающийся с Paint_
         Quant_Del=Quant_Del+1;        // Колич имён к удалению
         Name_Del[Quant_Del-1]=Obj_Name;//Запоминаем имя удаляемого
        }
     }
   for(int i=0; i<=Quant_Del; i++)     // Удаляем объекты с именами,.. 
      ObjectDelete(Name_Del[i]);       // .. имеющимися в массиве
   return;                             // Выход из deinit()
  }
//-------------------------------------------------------------- 10 --

Dann, wenn "kombinieren" der Satz "Bitte beachten Sie, dass Sie in der ersten for-Schleife keine Objekte löschen können, da sich in diesem Fall die Gesamtzahl der Objekte und ihre Nummerierung nach jedem Löschen ändert und einige Objektnamen daher übersprungen werden" AND Text deinit() Funktion der letzten Variante habe ich die 2. Frage:

Frage. Warum kann ich nicht Objekte in der ersten for-Schleife löschen, indem ich die Funktion ObjectDelete(Obj_Name) in die if-Anweisung einfüge...? Etwa so:

int deinit()                           // Спец. функция deinit()
  {
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   for(int k=0; k<Quant_Objects; k++)  // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Если найден объект, …
        {                              // ... начинающийся с Paint_,
         ObjectDelete(Obj_Name);       // … то его и удаляем
        }                              //конец if
     }                                 //конец for
   return;                             // Выход из deinit()
  }                                    //конец deinit
//-------------------------------------------------------------- 10 --

Warum nach jeder Löschung "... Die Gesamtzahl der Objekte wird sich ändern"...? Da in diesem Fall die Variable Quant_Objects, die die Gesamtzahl der Objekte bestimmt, ihren Wert gleich ObjectsTotal() erhält, FORWARD the for loop?

P.S. Vielen Dank im Voraus für die Antwort, um das Forum nicht zu überladen.

Dateien:
strings_1.mq4  7 kb
 

Guten Tag, ich habe einen Block erstellt, um magische offene Kaufpositionen zu berechnen, aber das Problem ist, dass, wenn der Block mit verschiedenen Währungspaaren arbeitet, der Block nur Ergebnisse für ein Währungspaar (die letzte offene Position) liefert. Wie kann ich den Code korrigieren (ohne die Magie zu verändern), damit der Block das Ergebnis für jedes Währungspaar anzeigt?

int OpenMagicOrderCount_buy() 
{
   int OpenBuyOrdersCount = 0;
   int OpenOrders = 0;
   int cnt = 0;
   OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
          {                             
                  OpenBuyOrdersCount ++;
          }
   } 
   Print("+++++++++++++++++++++++OpenBuyOrdersCount: " + OpenBuyOrdersCount,"   OrderSymbol()= ", OrderSymbol());
   return(OpenBuyOrdersCount); 
}
 
int OpenMagicOrderCount_buy() 
{
   int OpenBuyOrdersCount = 0;
   int OpenOrders = 0;
   int cnt = 0;
   OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
          {                             
                  OpenBuyOrdersCount ++;
          }
   } 
   Print("+++++++++++++++++++++++OpenBuyOrdersCount: " + OpenBuyOrdersCount,"   OrderSymbol()= ", OrderSymbol());
   return(OpenBuyOrdersCount); 
}
так все " OP_BUY" Zauberer zählen
 
7777877:

... Fortsetzung...

Am Ende des Unterabschnitts StringSubstr Function steht in Klammern der folgende Satz: "Separat müssen wir beachten, dass wirin der ersten for-Schleife (meine Anmerkung: es muss deinit() sein, da es keine andere Möglichkeit gibt, Objekte zu löschen) keine Objekte löschen können, da sich nach jedem Löschen die Anzahl der Objekte und ihre Nummerierung ändert und einige Objektnamen übersprungen werden". In dem zitierten EA gibt es jedoch überhaupt keine zweite for-Schleife . Außerdem wird die Variable Quant_Del, die in der Funktion deinit() vor der for-Schleife definiert wurde, mit Null initialisiert, während die Variable i vor der for-Schleife nirgends definiert wurde.

es stellt sich heraus, dass der obige Code einfach mehrere Programmzeilen auslässt.

Die erste Frage lautet also: Handelt es sich wirklich um eine triviale Auslassung einiger Zeilen oder ist das Programm so kompliziert, dass ein Anfänger seine Bedeutung nicht ohne fremde Hilfe verstehen kann?

Außerdem... Im selben Kapitel desselben Abschnitts befindet sich vor dem zitierten Text ein Link zu demselben Expert Advisor (in der angehängten Datei), der, wenn er angeklickt wird, denselben Expert Advisor in MetaElitor öffnet. Der Text dieses Expert Advisors ist jedoch anders: Die Funktion deinit() sieht wie folgt aus

Dann, wenn "kombinieren" der Satz "Bitte beachten Sie, dass Sie in der ersten for-Schleife keine Objekte löschen können, da sich in diesem Fall die Gesamtzahl der Objekte und ihre Nummerierung nach jedem Löschen ändert und einige Objektnamen daher übersprungen werden" ANDText deinit() Funktion der letzten Variante habe ich die 2. Frage:

Frage. Warum kann ich Objekte nicht in der ersten for-Schleife löschen, indem ich die Funktion ObjectDelete(Obj_Name) innerhalb der if-Anweisung platziere?

Warum nach jeder Löschung "... Die Gesamtzahl der Objekte wird sich ändern"...? Da in diesem Fall die Variable Quant_Objects, die die Gesamtzahl der Objekte bestimmt, ihren Wert gleich ObjectsTotal() erhält, wird die for-Schleife VORGEHEN?

P.S. Vielen Dank im Voraus für die Antwort, um das Forum nicht zu überladen.

Drehen Sie den Zyklus rückwärts und löschen Sie so viel, wie Sie möchten
 
FAQ:
Erweitern Sie die Schleife nach hinten und löschen Sie so viel wie möglich

Habe ich Sie richtig verstanden? Sie sollten sich die Funktion deinit (und insbesondere die Schleife) wie folgt vorstellen:

int deinit()                           // Спец. функция deinit()
  {
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   for(int k=Quant_Objects; k>=0; k--) // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Если найден объект, …
        {                              // ... начинающийся с Paint_,
         ObjectDelete(Obj_Name);       // … то его и удаляем
        }                              //конец if
     }                                 //конец for
   return;                             // Выход из deinit()
  }                                    //конец deinit
//-------------------------------------------------------------- 10 --
 
Elektronik:


Diese Daten werden benötigt, um die Differenz zwischen Kauf- und Verkaufsaufträgen zu berechnen.

Nehmen wir an, dass ein Kaufauftrag mit einem Volumen von 0,09 Lots und zwei Verkaufsaufträge mit einem Gesamtvolumen von 0,11 Lots eröffnet wurden, dann beträgt die Differenz zwischen ihnen 0,09-0,11=-0,02, oder wenn möglich die Differenz zwischen ihren Werten.


Nun denn, die Funktion OrderLots.
 
abeiks:

Guten Tag, ich habe einen Block erstellt, um magische offene Kaufpositionen zu berechnen, aber das Problem ist, dass, wenn der Block mit verschiedenen Währungspaaren arbeitet, der Block nur Ergebnisse für ein Währungspaar (die letzte offene Position) liefert. Wie kann ich den Code korrigieren (ohne die Magie zu ändern), damit der Block für alle Währungspaare berechnet wird?

Ändern:

if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&  OrderType() == OP_BUY )

An:

if (OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
 
Wie kann ich den Stop-Loss in Pips im EA durch einen Stop-Loss über der letzten Kerze ersetzen?
 
Neo777:
Wie kann ich den Stop-Loss in Pips im EA durch einen Stop-Loss über der letzten Kerze ersetzen?
double x = ... // Задаем на сколько пипсов выше
double sl = NormalizeDouble(High[1] + x * Point, Digits); // Задаем значение стоплосс на x пипсов выше предпоследней свечи
 

Reshetov:спасибо
извиняюсь за то что не в SRC

wie man sie hier einfügt