Wie programmiert man? - Seite 305

 
gmailer:
^ Danke - das könnte es sein. Wissen Sie, wie man diese "grünen und rosa Punkte" am unteren und oberen Rand loswird?

Entschuldigung - ich habe mir gerade meine andere Stoch angesehen, wo solche Punkte vorhanden sind. Der in der Antwort auf meinen ersten Beitrag vorgeschlagene Punkt war in Ordnung. Danke!

 

Vielleicht nur ein Ratschlag:

Wenn Sie einen "Baustein" (eine Funktion, ein Snippet, einen Teil des Codes) haben, der gut funktioniert, ändern Sie ihn nicht. Funktionen sind gut, weil man ihre Eingaben ändern kann und sie entsprechend der Eingaben funktionieren. Und wenn Sie Funktionen in allen möglichen Situationen getestet haben, müssen Sie nicht mehr darüber nachdenken, ob sie gut funktionieren. Auf diese Weise kann man den Code einschränken, den man sich bei der Fehlersuche ansehen muss (und das kann die Entwicklungszeit immens beschleunigen).

crsnape@btinternet.com:
Hallo mladen Ich stimme Ihnen völlig zu, die Funktion GetLots, die Sie zur Verfügung gestellt haben, funktioniert wie sie sollte; ich habe sie als Teil meines Codes getestet und sie hat funktioniert.

Ich habe Änderungen daran vorgenommen, weil ich meine Risikoperamter ändern möchte, je nachdem, ob ich gewinne oder verliere. Im Grunde habe ich den bestehenden Code weiter ausgearbeitet (oder es zumindest versucht) und zusätzliche Regeln für das Geldmanagement eingebaut.

Ich kann ehrlich sagen, dass mein Code nicht geheim ist; ich bin sicher, dass viele andere das, was ich zu tun versuche, in Betracht gezogen und in Code umgesetzt haben; aber ich nehme an, dass es ein Element der Privatsphäre gibt, weil ich persönlich so viel Zeit in die Entwicklung investiert habe.

Ich werde meinen Code immer wieder überprüfen, denn ich möchte natürlich versuchen, alle Probleme selbst zu lösen, da ich stolz darauf bin, Dinge von Grund auf zu lernen und zu tun.

Aber ich verstehe Ihren letzten Absatz; ich werde eine "Risiko"-Variable verwenden und dieses Risiko bei der Ausgabe einer Funktion entsprechend ändern.

Jedenfalls vielen Dank für deine Antwort, dieses Forum wäre ohne dich nicht dasselbe; du hast mir schon unzählige Male geholfen.

Prost :-)
 

Was ich nicht genau weiß, sind die Funktionsklammern und was darin steht.

Wenn ich eine Funktion innerhalb einer Funktion schreibe, muss ich dann diesen Funktionsnamen in die Klammern setzen?

Wenn ich zum Beispiel eine Funktion LastOpenTicket() habe und diese innerhalb einer Funktion namens GetLots aufgerufen wird, muss ich dann LastOpenTicket() in die Klammern setzen, wie GetLots (LastOpenTicket())?

Muss ich dort auch das () einfügen? Was ist, wenn es sich um LastOpenTicket (int number, int digit, int anotherone) handelt, wird dann alles in die Klammer der Funktion GetLots gesetzt, z. B. GetLots (int number, int digit, int anotherone... und alle anderen Variablen in der Funktion usw.)?

 

...

1. Stellen Sie sich das Klammerpaar {} als "Anfang" und "Ende" vor

2. Sie können in mql keine verschachtelten Funktionen schreiben (Pascal erlaubt das, aber mql nicht - verschachtelte Funktionen wären die Deklaration einer Funktion innerhalb des Körpers anderer Funktionen. Siehe hier : Verschachtelte Funktion - Wikipedia, die freie Enzyklopädie). Sie können einen Funktionsaufruf an jeder beliebigen Stelle Ihres Codes platzieren

3. Sie können diese Form des Aufrufs verwenden (ein direkter Aufruf, wie in Ihrem Beispiel GetLots (LastOpenTicket())) oder Sie können die Rückgabe von LastOpenTicket() einer Variablen zuweisen und diese dann als Argument in einem Aufruf von GetLots() verwenden.

crsnape@btinternet.com:
Etwas, das ich nicht sicher bin, ist die Funktion Klammern und was geht in sie.

Wenn ich eine Funktion innerhalb einer Funktion schreibe, muss ich dann diesen Funktionsnamen in die Klammern setzen?

Wenn ich zum Beispiel eine Funktion LastOpenTicket() habe und diese innerhalb einer Funktion namens GetLots aufgerufen wird, muss ich dann LastOpenTicket() in die Klammern setzen, wie GetLots (LastOpenTicket())?

Muss ich auch das () dort einfügen? Wie sieht es aus, wenn LastOpenTicket (int number, int digit, int anotherone), wird das alles auch in diesem Fall in die Klammer der Funktion GetLots gesetzt, z. B. GetLots (int number, int digit, int anotherone... und alle anderen Variablen in der Funktion usw.)?
 

Was ist der Unterschied zwischen diesen beiden? Gibt es einen?

double GetLots (int number, int call, int specialcall, int order)

{

und.

double GetLots ()

{

int Zahl;

int call;

int specialcall;

int Reihenfolge;

?

 

...

Die erste ist eine Funktion, die Argumente akzeptiert.

Die zweite ist eine Funktion ohne Argumente, so dass Sie die Werte "number", "call", "specialcall" und "order" außerhalb des Funktionskörpers nicht ändern können.

Einige weitere nützliche Informationen zur Deklaration von Funktionen finden Sie in diesem Thread: https: //www.mql5.com/en/forum/173005

crsnape@btinternet.com:
Was ist der Unterschied zwischen diesen beiden? Gibt es einen?

double GetLots (int number, int call, int specialcall, int order)

{

und.

double GetLots ()

{

int Zahl;

int call;

int specialcall;

int Reihenfolge;

?
 

Ich habe in den letzten Tagen mit meinen Funktionen herumgespielt und erhalte immer noch leere Ergebnisse. Ich bin buchstäblich Reißen meine Haare aus.

Ich habe die Funktion geändert, um RiskSize zu berechnen, wie Sie vorgeschlagen haben (ich stimme zu, dass es jetzt ein besseres System ist) und habe das in meiner GetLots-Funktion verwendet. Das ist es:

//--- Funktion zur Berechnung von Lots für Long-Positionen

double GetLotsLong (double SLDistanceLong)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

double LotsLong = 0;

int LotDigit = 2;

int Risk = GetRiskLong (RiskLong);

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // Lots müssen normalisiert werden, um LotStep zu berücksichtigen.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // Bei der Normalisierung wird nicht gerundet, sondern jeder Teil des Lots, der größer als LotStep ist, abgeschnitten.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // Auf diese Weise ist das Risiko etwas geringer.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

wenn (LotStep == 1.00) LotDigit = 0;

wenn (LotStep == 0.10) LotDigit = 1;

wenn (LotStep == 0.01) LotDigit = 2;

wenn (Kontostand() > KontoFreierSpielraum())

LotsLong = NormalizeDouble(AccountFreeMargin() * (Risk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

sonst LotsLong = NormalizeDouble(Kontostand() * (Risiko / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

}

Es beschwert sich auch RiskLong - Variable nicht definiert. Diese ist jedoch unter der Funktion GetRiskLong definiert, die sie aufruft.

Wenn es schwierig ist, nur mit dem Code zu helfen, den ich gepostet habe, kann ich ihn Ihnen schicken?

 

...

Zunächst einmal ist es nicht notwendig, getrennte Lose für einen Long- und für einen Short-Auftrag zu erstellen. Verwenden Sie eine Funktion (die Ihnen bereits zur Verfügung gestellt wurde) für beide Arten von Aufträgen (die Berechnung der Losgröße für beide, Short und Long, muss exakt gleich sein). Ändern Sie einfach das Risiko oder den Stop-Loss-Abstand, wenn Sie eine andere Berechnung wünschen.

Der Fehler, den Sie erhalten, liegt daran, dass Variablen, die innerhalb von Funktionen deklariert werden, nur innerhalb von Funktionen "sichtbar" sind. Es spielt keine Rolle, dass Sie die Funktion aufrufen, die eine Variable mit dem von Ihnen angegebenen Namen hat: sie ist nur für die aufgerufene Funktion lokal, andere Teile des Codes "wissen" nichts von ihr und können nicht darauf zugreifen

crsnape@btinternet.com:
Ich habe in den letzten Tagen mit meinen Funktionen herumgespielt und erhalte immer noch leere Ergebnisse. Ich bin buchstäblich Reißen meine Haare aus.

Ich habe die Funktion geändert, um RiskSize zu berechnen, wie Sie vorgeschlagen haben (ich stimme zu, dass es jetzt ein besseres System ist) und habe das in meiner GetLots-Funktion verwendet. Dies ist es:

//--- Funktion zur Berechnung von Lots für Long-Positionen

double GetLotsLong (double SLDistanceLong)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

double LotsLong = 0;

int LotDigit = 2;

int Risk = GetRiskLong (RiskLong);

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // Lots müssen normalisiert werden, um LotStep zu berücksichtigen.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // Bei der Normalisierung wird nicht gerundet, sondern jeder Teil des Lots, der größer als LotStep ist, abgeschnitten.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // Auf diese Weise ist das Risiko etwas geringer.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

wenn (LotStep == 1.00) LotDigit = 0;

wenn (LotStep == 0.10) LotDigit = 1;

wenn (LotStep == 0.01) LotDigit = 2;

wenn (Kontostand() > KontoFreierSpielraum())

LotsLong = NormalizeDouble(AccountFreeMargin() * (Risk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

sonst LotsLong = NormalizeDouble(Kontostand() * (Risiko / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

}

Es beschwert sich auch RiskLong - Variable nicht definiert. Diese ist jedoch unter der Funktion GetRiskLong definiert, die sie aufruft.

Wenn es schwierig ist, nur mit dem Code zu helfen, den ich gepostet habe, kann ich ihn an Sie schicken?
 
mladen:
First ist eine Funktion, die Argumente akzeptiert

Die zweite ist eine Funktion ohne Argumente, so dass Sie die Werte "number", "call", "specialcall" und "order" außerhalb des Funktionskörpers nicht ändern können.

Weitere nützliche Informationen zur Deklaration von Funktionen finden Sie in diesem Thema: https: //www.mql5.com/en/forum/173005

Vielen Dank für diesen Hinweis. Wenn ich also eine Funktion namens GetRisk aus einer Funktion namens GetLots aufrufe, müsste ich die Variablen der Funktion GetRisk in die Klammern (...) von GetLots setzen, weil die Werte außerhalb der Funktion GetLots berechnet werden?

 

...

Lassen Sie es mich auf diese Weise versuchen:

2 Fragen (unter der Annahme, dass wir den aktuellen Stand des Kontos kennen):

Frage 1: Ich bin bereit, (weiß nicht) % mit (weiß nicht) Pips Stop Loss zu riskieren. Wie groß sollte meine Losgröße sein?

Frage 2: Ich bin bereit, ein Risiko von 1 % mit einem Stop-Loss von 100 Pips einzugehen. Wie groß sollte meine Losgröße sein?

Es ist offensichtlich, dass die Antwort auf die erste Frage unmöglich ist, da Sie weder das prozentuale Risiko kennen, das ich bereit bin einzugehen, noch den Stop-Loss, den ich verwenden werde. Aber im zweiten Beispiel ist es möglich, die Losgröße zu berechnen, da Sie alle diese Faktoren kennen. Das sind Argumente: Da wir vorhersagen, dass rsik% und Stop Loss variieren können, geben wir diese der Losgrößenberechnung als variable Argumente, die der Funktion jedes Mal mitgeteilt werden, wenn sie aufgerufen wird.

Ich hoffe, dies verdeutlicht, wozu Argumente (Parameter) in Funktionen dienen. Jede Funktion funktioniert nach dem gleichen Prinzip: Wenn Sie vorhersagen, dass ein Teil der Berechnung ausfallen kann, geben Sie ihn als Argument in die Funktion ein.

Hier sind einige weitere Beispiele für die Kodierung von Funktionen: https: //en.wikipedia.org/wiki/Function_%28computer_science%29

crsnape@btinternet.com:
Vielen Dank für diese. Wenn ich also eine Funktion namens GetRisk aus einer Funktion namens GetLots aufrufe, müsste ich die Variablen der Funktion GetRisk in die Klammern (...) von GetLots setzen, weil die Werte außerhalb der Funktion GetLots berechnet werden?
Grund der Beschwerde: