Wie programmiert man? - Seite 312

 

...

Wie ist Ihr LastProfitHigh deklariert?

Wenn sie innerhalb des Funktionskörpers deklariert ist (z. B. start()), wird sie immer ihren Wert ändern, wenn Sie sie nicht als statisch deklarieren. Wenn sie also als lokal (innerhalb der Funktion) deklariert ist, versuchen Sie, sie im globalen Bereich oder als statische Variable zu deklarieren, und auf diese Weise wird sie Werte zwischen zwei Ticks "erben".

aud4xtrader:
Hallo zusammen,

Ich bin neu im Programmieren und lerne langsam die Sprache und Syntax, aber ich habe eine Frage dazu, wie MT4 die Variablen aktualisiert.

Ich habe versucht, einen einfachen EA zu programmieren, der den höchsten Gewinn anzeigt, den ein aktuell geöffneter Handel erzielt hat, und der nur aktualisiert werden sollte, wenn ein neuer Höchststand erreicht wird, aber was passiert, ist, dass sich der Betrag nach unten und nach oben bewegt, wie der Gewinn.

Ich überprüfe, ob der ausgewählte Handel noch offen ist

t_CloseTime=OrderCloseTime(); //gibt 0 zurück, wenn die Order nicht geschlossen ist

if(t_CloseTime==0) //Order ist geschlossen, wenn nicht Null.

{

if(OrderProfit() > LastProfitHigh) LastProfitHigh=OrderProfit();

if(LastProfitHigh >= MinProfit && MinProfitReached==false) MinProfitReached=true;

}//endif

Wenn die Logik korrekt ist, warum steigt und sinkt dann die Variable "LastProfitHigh"? ....

Vielen Dank für Ihre Hilfe.
 

Neu in der Codierung

mladen:
Wie ist Ihre LastProfitHigh deklariert? Wenn sie innerhalb des Funktionskörpers deklariert ist (z. B. start()), ändert sie immer ihren Wert, wenn Sie sie nicht als statisch deklarieren. Wenn sie also als lokal (innerhalb der Funktion) deklariert ist, versuchen Sie, sie im globalen Bereich oder als statische Variable zu deklarieren, so dass sie die Werte zwischen zwei Ticks "erbt".

Hallo mladen,

Ich habe jetzt die Variable außerhalb der start()-Funktion verschoben und sie als "static double" deklariert, danke für die Antwort und drücke die Daumen, dass sie korrekt angezeigt wird.

Die Logik des Codes ist korrekt angegeben??

 

aud4xtrader

Die Logik ist in Ordnung

Wenn Sie die Variable außerhalb des Starts verschieben, brauchen Sie sie nicht als statisch zu deklarieren (sie ist automatisch eine globale Variable, wenn sie sich außerhalb eines Funktionskörpers befindet - und sie ist im gesamten Code "sichtbar"). Wenn Sie möchten, dass die Variable lokal zu einer Funktion bleibt und dennoch ihren vorherigen Zustand beibehält (z. B. den Zustand bei einem vorherigen Tick), müssen Sie sie als statisch deklarieren.

Hier sind zwei Beispiele, die zum gleichen Ergebnis führen

double previousProfit=0;

int start()

{

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

[/PHP]

or the same thing but with static variable

[PHP]

int start()

{

static double previousProfit=0;

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

aud4xtrader:
Hallo mladen,

Ich habe jetzt die Variable außerhalb der start()-Funktion verschoben und sie als "static double" deklariert, danke für die Antwort und drücke die Daumen, dass sie korrekt angezeigt wird.

ist die Logik des Codes korrekt angegeben??
 

Wie kodiere ich?

Es funktioniert großartig, nochmals vielen Dank für die ausgezeichnete Hilfe.

mladen:
aud4xtrader

Die Logik ist in Ordnung

Wenn Sie die Variable außerhalb des Starts verschieben, brauchen Sie sie nicht als statisch zu deklarieren (sie ist automatisch eine globale Variable, wenn sie sich außerhalb eines Funktionskörpers befindet - und sie ist im gesamten Code "sichtbar"). Wenn Sie möchten, dass die Variable lokal zu einer Funktion bleibt und trotzdem ihren vorherigen Zustand beibehält (z. B. den Zustand bei einem vorherigen Tick), müssen Sie sie als statisch deklarieren.

Hier sind zwei Beispiele, die zum gleichen Ergebnis führen

double previousProfit=0;

int start()

{

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

[/PHP]

or the same thing but with static variable

[PHP]

int start()

{

static double previousProfit=0;

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

 

Perfekt! Danke!

mladen:
Probieren Sie diese 2 Funktionen aus
: Erstens, um herauszufinden, ob es bereits eine Order mit genau demselben offenen Preis gibt

. Zweitens, um zu prüfen, ob es eine Order gibt, die weniger als nnn Punkte vom gewünschten Preis entfernt ist

.

Beide geben true zurück, wenn der Preis gleich ist oder wenn der Abstand zum Preis einiger aktuell geöffneter Orders innerhalb des angegebenen Abstands liegt

bool existsAtSamePrice(int magicNumber, double price)

{

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

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol()!=Symbol()) continue;

if (OrderMagicNumber()!=magicNumber) continue;

if (CompareDouble(OrderOpenPrice(),price)) return(true);

}

return(false);

}

//

//

//

//

//

bool existsAtApproximatePrice(int magicNumber, double price, double distance)

{

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

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol()!=Symbol()) continue;

if (OrderMagicNumber()!=magicNumber) continue;

if (MathAbs(OrderOpenPrice()-price)< distance) return(true);

}

return(false);

}

//

//

//

//

//

bool CompareDouble(double val1, double val2)

{

return(NormalizeDouble(val1,Digits)==NormalizeDouble(val2,Digits));

}

 

Wie codiere ich?

Hallo Pip,

Danke für die Codeschnipsel, es ist großartig, wie Leute Ideen und Codierungsstile austauschen können, während mein Wissen wächst, kann ich von Leuten wie dir und mladen lernen.

Pip:
Perfekt! Danke!
 

Hallo,

ich habe eine Anfrage.

Wenn ich alle Objekte, die im Namen das Wort "Beispiel" enthalten, mit dem Befehl ObjectDelete löschen möchte, wie muss ich den Code schreiben?

Für Beispiel

Objektname

"Beispiel13241"

"Beispiel453623"

Ich möchte alle Objekte löschen, die das Wort "Beispiel" enthalten.

Ich danke Ihnen vielmals

 

...

Verwenden Sie etwas wie dieses (dies löscht alle Objekte, deren Namen mit "Beispiel" beginnen) :

string lookFor = "Example";

int lookForLength = StringLen(lookFor);

for (int i=ObjectsTotal()-1; i>=0; i--)

{

string objectName = ObjectName(i);

if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);

}

dasio:
Hallo!

Ich habe eine Anfrage.

Wenn ich alle Objekte, die im Namen das Wort "Beispiel" enthalten, mit dem Befehl ObjectDelete löschen möchte, wie muss ich den Code schreiben?

Für Beispiel

Objektname

"Beispiel13241"

"Beispiel453623"

Ich möchte alle Objekte löschen, die das Wort "Example" enthalten.

Vielen Dank für Ihre Aufmerksamkeit.
 
mladen:
Verwenden Sie etwas wie dieses (dadurch werden alle Objekte gelöscht, deren Namen mit "Beispiel" beginnen):
string lookFor = "Example";

int lookForLength = StringLen(lookFor);

for (int i=ObjectsTotal()-1; i>=0; i--)

{

string objectName = ObjectName(i);

if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);

}

Danke, das ist perfekt.

Ich habe noch eine Frage ^^.

Ich erstelle ein Segment der Trendlinie im Diagramm mit angegebener Länge. Ich kann die Farbe einstellen und es ist in Ordnung. Ich möchte wissen, ob es möglich ist, mehr als 1 Farbe in der gleichen Trendlinie zu setzen.

Zum Beispiel für den ersten 1/3 Teil eine Farbe, für den 2/3 Teil eine andere Farbe und für den 3/3 Teil eine andere.

Ist das möglich?

Vielen Dank^^

 

..

Kurz gesagt, wenn Sie sich auf Objekte beziehen, lautet die Antwort nein. Sie müssten dafür 3 Objekte erstellen.

Wenn du Puffer dafür verwendest, dann bräuchtest du 5 Zeichenpuffer für eine 3-farbige, nicht wiederholende Linie, und da es nur 8 Zeichenpuffer gibt, schränkt dich das erheblich ein

dasio:
Danke, das ist perfekt.

Ich habe eine andere Frage ^^.

Ich erstelle ein Segment einer Trendlinie im Diagramm mit angegebener Länge. Ich kann die Farbe einstellen und es ist ok. Ich würde gerne wissen, ob es möglich ist, mehr als 1 Farbe für dieselbe Trendlinie einzustellen.

Zum Beispiel für den ersten 1/3 Teil eine Farbe, für den 2/3 Teil eine andere Farbe und für den 3/3 Teil eine andere.

Ist das möglich?

Danke^^
Grund der Beschwerde: