[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 240

 
a1 = OrdersTotal();
for (i = 0; i < a1; i++)
{
OrderSelect(i,SELECT_BY_POS);
OrderDelete(OrderTicket());

}

Hier ist ein einfaches Skript wie dieses sollte alle ausstehenden Aufträge löschen, aber es löscht genau die Hälfte der Aufträge ... ???

 
        
FAQ 04.03.2011 12:56 

Подскажите, как найти цену последнего фрактала?


sergeev: Для этого можно воспользоваться индикатором iFractals. Он возвращает значение 0, если на баре нет фрактала и значение цены фрактала если он есть. Фракталы делятся на верхние и нижние. Если вам надо получить верхние, то в функцию iFractals передается MODE_UPPER, а для нижних - MODE_LOWER. Поэтому для поиска фрактала надо пройти в цикле по барам и первое не 0 значение и будет искомым фракталом.

пример:

double frac;
for (int i=3; i<Bars; i++)
{
   frac=iFractals(Symbol(), Period(), MODE_UPPER, i); if (frac>0) break;
   frac=iFractals(Symbol(), Period(), MODE_LOWER, i); if (frac>0) break;
}
if (frac>0) Print("Цена последнего фрактала: ", frac);


пример организации отдельной функции:

//---------------------------------------------------------------   GetLastFrac
double GetLastFrac(string smb, int tf, int iB)
{
   int n=iBars(smb, tf);  double frac;
   for (int i=iB; i<n; i++)
   {
      frac=iFractals(smb, tf, MODE_UPPER, i); if (frac>0) return(frac);
      frac=iFractals(smb, tf, MODE_LOWER, i); if (frac>0) return(frac);
   }
   return(0);
}
.....
Print("Последний фрактал: ", GetLastFrac("EURUSD", 60, 3));
Es stand in der FAQ, ich habe sie die ersten paar Male durchgeblättert und es nicht bemerkt.
 
Neo333:
a1 = AufträgeSumme();
for (i = 0; i < a1; i++)
{
OrderSelect(i,SELECT_BY_POS);
OrderDelete(OrderTicket();

}

Dieses einfache Skript sollte alle ausstehenden Aufträge löschen, aber es löscht genau die Hälfte von ihnen ... ???

Nehmen wir an, es gäbe 10 Bestellungen.

Hier haben Sie die Hälfte gelöscht (null bis fünf)

Jetzt wollen Sie den sechsten auswählen... und es sind nur noch 5 übrig. Es liegt ein Fehler vor und es gibt nichts zu löschen. Das gilt auch für die anderen.

 
Neo333:
a1 = AufträgeSumme();
for (i = 0; i < a1; i++)
{
OrderSelect(i,SELECT_BY_POS);
OrderDelete(OrderTicket();

}

Dieses einfache Skript sollte alle ausstehenden Aufträge löschen, aber es löscht genau die Hälfte der Aufträge ... ???

Ändern Sie die Richtung der Auftragssuche:

for (i=a1-1; i>=0; i--) {....}

 
artmedia70:

Ändern Sie die Richtung der Auftragsaufzählung:

for (i=a1-1; i>=0; i--) {....}

Werke ... aber was ist die Logik - welchen Unterschied macht i++ oder i--?
 
Zhunko:

1. Haben Sie das überprüft?

Bericht: Es hat geholfen, aber es scheint eine Störung zu sein.

Erstes Terminal. Alle Diagramme und Symbole entfernt, 7 Dollar-Symbole hinzugefügt, Diagramme hinzugefügt. Alle mit Nachladungen.

Den Ticker auf 3/4 des Bildschirms ausgedehnt. Die ersten 6 Felder sind gefüllt, das 7. ist auf 5 Felder angewachsen.

Nach dem nächsten Neustart sind nicht mehr alle vollständig gefüllt, die Verteilung ist fast zufällig - je niedriger das Symbol in der Liste, desto weniger Zellen erhält es.

Das zweite Terminal. Ich hatte 7 Yen pro Paar dabei. Zusätzliche Zeichen entfernt, neu gestartet - sie füllen sich viel tiefer, aber die Tiefe der Füllung stellte sich als zufällig verteilt heraus.

Ich neige zu der Annahme, dass es sich um einen Fehler handelt, weil der Cache zu klein ist - er reicht einfach nicht für alle, und die Verteilung erfolgt entweder nach dem Zufallsprinzip oder nach dem Motto "wer zuerst kommt, mahlt zuerst".

In jedem Fall funktioniert die Methode für eine Währung. Zusammenfassung: Rezept zur Tatsache :) Danke.

 
Neo333:
Es funktioniert ... Aber was ist die Logik - welchen Unterschied macht i++ oder i--?

Der Grund dafür wurde Ihnen bereits mitgeteilt. Es geht nicht um i++ oder i--, sondern darum, an welchem Ende der Liste Sie mit dem Löschen von Aufträgen beginnen - am Anfang der Liste (wie Sie es getan haben) oder am Ende der Liste (wie Sie es in diesem Fall tun müssen).

Um zu verstehen, was passiert, wenn Aufträge gelöscht werden, müssen Sie wissen und verstehen, wie die Aufträge im Array gespeichert sind.

Wenn Sie den ersten Auftrag zuerst löschen (er ist durch i=0 indiziert), werden die Indizes aller Aufträge im Array verschoben - der erste Auftrag wird null, der zweite Auftrag wird der erste, der dritte wird der zweite und so weiter. Aus diesem Grund werden nicht alle Aufträge vollständig gelöscht - wenn i zu 6 wird, wird der sechste Auftrag an die fünfte Position im Auftragsfeld verschoben und der Auftrag wird einfach nicht durch den Index 6 ausgewählt.

Wenn Sie Aufträge am Ende der Liste löschen, findet keine Verschiebung statt - der erste Auftrag hat eine Nullposition in der Liste und wird diese auch beibehalten. Der 10. Auftrag hatte die Position 9, er wurde gelöscht, dann wurde der 9. Auftrag, der die Position 8 in der Liste hat, gelöscht, und so weiter, bis zum ersten Auftrag mit der Position Null in der Reihe der Aufträge.

 
Neo333:
Werke .... aber was ist die Logik - welchen Unterschied macht es, ob i++ oder i--?
Sie sind bereits von einem Benutzer beantwortet worden
152
ilunga zu dieser Frage
 
nadya:
Sie sind bereits von einem Benutzer beantwortet worden
152
ilunga zu dieser Frage
Irgendetwas sagte mir, ich hätte es wiederkäuen und eine ausführlichere Antwort geben sollen... :)
 
Zhunko:
... den Stundenplan selbstständig öffnen.
Der Rest der Charts "tickt". Kommt nicht in Frage.