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

 
sergeev:

keine


Das Problem liegt hier einfach in der Schleife: Sie geht durch i von 0 bis 2. Sie wollen 2 bis 0.



Zeigen Sie mir bitte ein Beispiel, ich habe
 for(i = OrdersTotal(); i > 0; i--)
Es hat nicht funktioniert.
 

sss2019:



Zeigen Sie mir bitte ein Beispiel, ich habe es getan, es hat nicht funktioniert.


Ich habe das Skript wie folgt erstellt

int orderstotal = OrdersTotal();
        for(i = 0; i < orderstotal; i++ )
                {
                if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == FALSE) break;
                if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                        {
                        if(OrderType() == OP_BUY)
                        if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() == OP_SELL)
                        if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() > 1)
                        if(OrderDelete(OrderTicket()) == false)
                                {
                                Print(GetLastError());
                                }
                        }
                Print(i," ",orderstotal);
                }

Als Ergebnis gibt Print das Folgende aus

0 4

1 4

Das ist alles, aus irgendeinem Grund druckt die Schleife nicht

2 4

3 4

Ich habe der Schleife OrderSelect(i, SELECT_BY_POS, MODE_TRADES) anstelle von I 0 hinzugefügt, d.h. der erste Auftrag wird immer ausgewählt und das Skript funktioniert korrekt. Es stellt sich heraus, dass die Schleife, wenn sie zwei Aufträge löscht, versucht, den dritten Auftrag auszuwählen, obwohl nur zwei Aufträge in der Liste vorhanden sind.

 
sss2019:


Das Skript wurde wie folgt erstellt

Am Ende...

Beispiele
 
sss2019:

Bitte zeigen Sie mir ein Beispiel, ich habe

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

Das hat nicht geholfen.


weil man immer noch denken muss.

for(i = OrdersTotal()-1; i >=0; i--)
 

Helfen Sie mir, dieses Dilemma zu lösen

int i;
    double maxrange,range;
    double Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
    double Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
   
                    while(Ma1 > Ma2)
                        {
                        i++;
                        Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        range = (Ma1 - Ma2)/Point;
                        if(range > maxrange) maxrange = range;
                        }

Das Skript sucht nach dem maximalen Abstand zwischen den Zeilen. Er gibt alle Werte auf allen Balken aus, der maximale Bereich ist 1,6235 auf einem Balken und 1,6208 auf dem anderen.

Ich versuche, Print(maxrange) zu drucken; es wird 0,086 gedruckt, ich verstehe nicht warum, ich teile durch Punkt

 
sss2019:

Helfen Sie mir, dieses Dilemma zu lösen

Das Skript sucht nach dem maximalen Abstand zwischen den Zeilen. Er gibt alle Werte auf allen Balken aus, der maximale Bereich ist 1,6235 auf einem Balken und 1,6208 auf dem anderen.

Ich versuche, Print(maxrange) auszugeben; es wird 0,086 zurückgegeben, ich verstehe überhaupt nicht, warum, ich teile durch Punkt


Dies ist kein Dilemma. Ein Dilemma ist, wenn man nicht weiß, welche von zwei Lösungen die beste ist.

Nun, erstens hat die Funktion iMA() sieben Parameter, nicht sechs. Zweitens haben Sie eine Variable mit dem String int i deklariert. Außerdem ist die Variable i nirgendwo mit einem Wert initialisiert. Infolgedessen ist er entweder gleich Null oder enthält Speicherreste, die von der vorherigen Aktivität übrig geblieben sind. Und drittens ist die while-Schleife falsch angeordnet. Nun, nehmen wir an, die Variable i ist nach der Initialisierung gleich Null. Nehmen wir außerdem an, dass der Ausdruck Ma1 > Ma2 ebenfalls wahr ist. Daher wird die Zeile while(Ma1 > Ma2) die Schleife starten. Bei der nächsten Iteration der Schleife werden wir feststellen, dass der Ausdruck (Ma1 > Ma2) nicht mehr wahr ist, und die Schleife wird abgebrochen. Die Variablen Ma1 und Ma2 werden nicht den maximalen Abstand enthalten - der maximale Abstand war einmal. Diese Bedingung zeigt nur, dass Ma1 jetzt kleiner oder gleich Ma2 geworden ist.

Außerdem wird die Variable maxrange nur in der Zeichenkette range = (Ma1 - Ma2)/Point mit einem Wert initialisiert. Was ist, wenn die Bedingung if(range > maxrange) nie eintritt, weil Sie die Variable maxrange nirgendwo sonst im Code mit einem Wert initialisieren? Es stellt sich also heraus, dass Sie das Ergebnis von Berechnungen mit dem Schrott von Speicherzellen vergleichen. Hier haben Sie unverständliche Ausdrucke als Ergebnis der Codeausführung.

 
Die Sache ist die, dass ich alle MA-Werte in der Schleife ausgegeben habe, und alle Werte sind korrekt, d.h. alle MA-Werte für diese Periode sind aufgezählt worden. Aber die Berechnung ist an dieser Stelle falsch - Bereich = (Ma1 - Ma2)/Punkt;
if(bereich > maxbereich) maxbereich = bereich;
 
sss2019:
Das ist der Punkt, ich habe alle MA-Werte in der Schleife ausgegeben und alle Werte sind korrekt, d.h. alle MA-Werte für den Zeitraum wurden überprüft. Aber die Berechnung ist an dieser Stelle falsch - Bereich = (Ma1 - Ma2)/Punkt;
if(bereich > maxbereich) maxbereich = bereich;

*Punkt

Bereich = (Ma1 - Ma2)*Punkt





 
pako:

*Punkt

Bereich = (Ma1 - Ma2)*Punkt

MA1 = 0,6526, MA2 = 0,6516. MA1-MA2 = 0,6526-0,6516 = 0,0010. Punkt = 0,0001. Multipliziert man sie, ist sie eine Bilibrary. 0,0010 * 0,0001 = 0,0000001
 
sss2019:
Die Sache ist die, dass ich alle MA-Werte in der Schleife ausgegeben habe, und alle Werte sind korrekt, d.h. alle MA-Werte für diese Periode sind aufgezählt worden. Aber die Berechnung ist an dieser Stelle falsch - Bereich = (Ma1 - Ma2)/Punkt;
if(bereich > maxbereich) maxbereich = bereich;

Nun, Sie müssen überprüfen, was eingegeben wird. Welche Variablenwerte sind an den Berechnungen beteiligt?