[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 492

 
paladin80:
Schauen Sie, wo die Summe danach verwendet wird. Höchstwahrscheinlich geht die Schleife dann durch die Aufträge for (i=0; i<=Gesamt; i++).

Übrigens, ja... Ich habe den vollständigen Code dieser Funktion bereits oben eingefügt:

void FindOrders()
{
// - 1 - == Инициализация переменных перед поиском ======================================
   int total = OrdersTotal() - 1;
   g_type = -1;                                    // На текущий момент у нас нет позиций
// - 1 - == Окончание блока =============================================================
 
// - 2 - == Непосредственно поиск =======================================================
   for (int i = total; i >= 0; i--)                // Используется весь список ордеров
      if (OrderSelect(i, SELECT_BY_POS))           // Убедимся, что ордер выбран
         if (MathFloor(OrderMagicNumber()) == i_magicNumber &&// Ордер открыт
             OrderSymbol() == Symbol())            // ..экспертом, который прикреплен к..
         {                                         // ..текущей паре
            g_ticket = OrderTicket();              // Запишем данные ордера
            g_type = OrderType();
         } 
// - 2 - == Окончание блока =============================================================
}

Ich dachte, es wäre logischer, es nicht so zu schreiben:

int total = OrdersTotal() - 1;

und dann die Schleife wie folgt einstellen:

for(i=total; i>=1; i--)

Oder? Nur irgendwie ist es nicht sehr gut wahrgenommen, wenn der Zähler der Anzahl der Positionen von Null... es ist nicht logisch, und deshalb, warum verwirren sich...

 
hoz:

Übrigens, ja... Ich habe den vollständigen Code dieser Funktion bereits oben eingefügt:

Ich dachte, es wäre logischer, es nicht so zu schreiben:

und dann die Schleife wie folgt einstellen:

Oder? Es ist nur so, dass der Zähler der Anzahl der Positionen von Null an nicht als solcher wahrgenommen wird... Es ist nicht logisch und daher gibt es keinen Grund, uns zu verwirren...

Um nach Aufträgen zu suchen, muss man bei Null anfangen, nicht bei Eins.

for(i=total; i>=0; i--)

Ein Profi hat mir einmal erklärt, dass wir eine Reihe von Aufträgen suchen und es besser ist, die Suche mit einer höheren Zahl zu beginnen. Im Array hat das erste Element den Index 0 (Null), so dass wir 1 nicht erreichen sollten, und dies ist auch der Grund, warum wir OrdersTotal() - 1 verwenden sollten, anstatt einfach OrdersTotal().

Ich habe die Auftragssuche auf diese Weise durchgeführt:

for (int i=OrdersTotal()-1; i>=0; i--)
 
paladin80:

Um nach Aufträgen zu suchen, müssen Sie bis auf Null und nicht bis auf Eins heruntergehen.

Ein Profi hat mir einmal erklärt, dass es sich um eine Reihe von Aufträgen handelt und dass es besser ist, mit einer größeren Zahl zu beginnen. Im Array hat das erste Element einen Index von 0 (Null), also nicht von 1, und auch aus diesem Grund brauchen wir OrdersTotal() - 1, nicht nur OrdersTotal().

Das ist sehr interessant. Und das erste, was ich tat, war, das Lehrbuch aufzuschlagen und zu versuchen, die Antwort dort zu finden. Und dann sahhttps://book.mql4.com/ru/trading/ordermodify, wie das Tutorial den Überlauf machte:

 for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер

Das ist der Faktor, der mich in die Irre geführt hat...

 
hoz:

Sehr interessant. Und das erste, was ich tat, war, das Lehrbuch aufzuschlagen und zu versuchen, die Antwort dort zu finden. Und dannhttps://book.mql4.com/ru/trading/ordermodify sah ich, dass das Lehrbuch übertrieben war:

Das ist der Faktor, der mich in die Irre geführt hat...


Haben Sie die nächste Zeile nicht bemerkt?

   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер     
   {      
     if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
//
//Тут компенсируется отсутствие нуля с i-1
 
borilunad:


Haben Sie die nächste Zeile nicht bemerkt?

Nein. Aber irgendwie ist es schief, das zu schreiben. Ich möchte das Lehrbuch nicht kritisieren, aber... es ist viel angemessener, von 0 statt von -1 zu zählen. Sonst hätten Sie schon bei -30 anfangen können...

Wiepaladin80 bereits erwähnt hat, wäre der Wert von Arrays ab 0 angemessener als ab -N.

 
hoz:

Nein. Aber irgendwie ist es schief, das zu schreiben. Ich will das Lehrbuch nicht kritisieren, aber... es ist viel angemessener, von 0 statt von -1 zu zählen. Sonst hätten Sie schon bei -30 anfangen können...

Wiepaladin80 oben darauf hingewiesen, von 0 der Wert von Arrays würde die meisten angemessen sein, wenn von -N.


Denken Sie jetzt logisch!

Diese Varianten sind identisch, denn wenn i = 0 ist, müssen wir von 1 bis OrderTotal() schauen, d.h. von 0+1 bis OrderTotal() - 1+1 (+1, weil i++ am Ende der for-Anweisung steht) Das Gleiche im Tutorial, nur von 1 bis OrderTotal() geschrieben und, um nicht von 2 bis OrderTotal()+1 zu zählen, hat der Lehrbuchautor in derOrderSelect-Funktion -1 zu i hinzugefügt. Verstanden?

Übrigens: So viele Programmierer es gibt, so viele Varianten gibt es auch. Jeder hat seine eigene Vision, seine eigene Handschrift!

 
hoz:

Nein. Aber irgendwie ist es schief, das zu schreiben. Ich will das Lehrbuch nicht kritisieren, aber... es ist viel angemessener, von 0 statt von -1 zu zählen. Sonst hätten Sie schon bei -30 anfangen können...

Wiepaladin80 bereits erwähnt hat, wäre 0 für Arrays angemessener als -N.

Wenn Sie an der Suche nach Aufträgen interessiert sind, kann ich Ihnen das folgende Schema vorschlagen:

if (OrdersTotal()>0)
{  for (int i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // ордер выбирается среди открытых
                                                    // и отложенных ордеров
      {  if (OrderSymbol()!=Symbol()) continue;     // если не наш символ, то уходим
         if (OrderMagicNumber()!=555) continue;     // если не наш магик номер, то уходим
                                                    // можно поставить любые другие фильтры
         // ... ваши вычисления
      }
   }
}
 
hoz:

Nein. Aber irgendwie ist es schief, das zu schreiben. Ich möchte das Lehrbuch nicht kritisieren, aber... es ist viel angemessener, von 0 statt von -1 zu zählen. Sonst hätten Sie schon bei -30 anfangen können...

Wiepaladin80 oben dargelegt hat, wäre 0 der geeignetste Weg, um Arrays zu lesen, im Gegensatz zu -N.

Ich habe den gleichen Standpunkt, das Tutorial wurde von einer bestimmten Person geschrieben, das ist seine Sicht der Dinge (Organisation der Auftragsschleife), und es gibt IMMER viele richtige Lösungen. Es gibt richtige Ansichten, und es gibt richtige und elegante zur gleichen Zeit... :)
 
borilunad:


Und jetzt denken Sie nach, einschließlich der Logik!

Diese Varianten sind identisch, denn wenn i = 0 ist, versuchen wir es von 1 bis OrderTotal(), d.h. von 0+1 bis OrderTotal() - 1+1 (+1, weil i++ am Ende der for-Anweisung steht). Und das Gleiche steht im Lehrbuch, nur von 1 bis OrderTotal() und um nicht von 2 bis OrderTotal()+1 zu zählen, addieren wir -1 zu i in der OrderSelect-Funktion. Verstanden?

Natürlich, das ist klar. Aber ich habe noch nie gesehen, dass Aufträge auf diese Art und Weise analysiert werden:

if (OrderSelect(i-1,SELECT_BY_POS)==true)

normalerweise nur ohne ==true... Dieser Punkt hat mir sogar gefallen. Obwohl es interessant ist, ist mir eine solche Methode in anderen EAs noch nie begegnet. Ich verstehe die Logik, aber trotzdem.

 
Bitte beraten Sie, wie können Sie eine muving Wert von vor ein paar Bars für die Berechnung, dh aus der Geschichte verwenden? Wenn es sich nur um einen gleitenden Durchschnitt handelt
AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);
Und wenn es -5 Takte her ist?