Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 739

 
korobok777:
Lot=NormalizeDouble(Balance*0.001,2);
 
Vinin:
Sie haben etwas Falsches geschrieben.

Ja, das ist ein Tippfehler, ich habe ihn korrigiert. Oder ist das Prinzip falsch? Der Punkt war, dass, wenn der Saldo durch 10 geteilt wird, ohne dass ein Rest übrig bleibt, die Partie als das Produkt aus der ursprünglichen Partie und 1/10 des Saldos betrachtet wird. Nicht wahr? Und wie?


Obwohl Vadim schrieb es einfacher hier, ja )))

 
evillive:

Ja, das ist ein Tippfehler, ich habe ihn korrigiert. Oder ist das Prinzip falsch? Der Punkt war, dass, wenn der Saldo durch 10 geteilt wird, ohne dass ein Rest übrig bleibt, die Partie als das Produkt aus der ursprünglichen Partie und 1/10 des Saldos betrachtet wird. Nicht wahr? Wie machen Sie es dann?


Obwohl Vadim schrieb es einfacher hier, ja )))

Der Saldo wird sehr selten durch 10 geteilt, ohne dass ein Rest übrig bleibt. In anderen Fällen (den meisten) würde es eine Standardpartie geben
 
evillive:
double StartLot=0.01;
if(MathMod(AccountBalance(),10)==0) Lot=StartLot*AccountBalance()/10;

Und MarketInfo()?

UND MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP?

Sie müssen noch in das zulässige Ziffernraster der Loswerte gelangen:

#property strict

/******************************************************************************/
double getLot(double factor = 0.001) {
  double minLot = MarketInfo(Symbol(), MODE_MINLOT);

  if (minLot > 0) { // Проверка значения от функции MetaQuotes на вменяемость
    double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);

    if (maxLot >= minLot) { // Проверка второго значения от функции MetaQuotes на вменяемость
      double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);

      if (lotStep > 0) { // Проверка третьего значения от функции MetaQuotes на вменяемость
        double rawLot = AccountBalance() * factor; // Грубо вычисленное значение лота

        // В процессе "рихтования" грубо вычисленного значения лота подразумевается, что "округление" происходит всегда к меньшему
        if (rawLot >= minLot && rawLot < maxLot + lotStep) { // Если грубо вычисленное значение "влезает" в диапазон разрешённых значений лотов
          int stepNum = int((rawLot - minLot) / lotStep); // Количество step'ов, которое надо "отступить вправо на числовой оси" от минимального значения лота (при преобразовании double -> int как раз и происходит нужный тип округления)

          return minLot + lotStep * stepNum; // Вычисляем значение лота в "разрядной сетке" разрешённых лотов.
        }
      }
    }
  }

  return 0; // Какие-то обстоятельства не позволили выдать значение в "разрядной сетке" разрешённых лотов; для индикации данного события выдаётся специальное значение 0.
}

/******************************************************************************/
void OnStart() {
  Print("AccountBalance() = ", AccountBalance(), ", getLot() = ", getLot());
}

Ich habe es ausprobiert und etwas Ähnliches wie die Wahrheit erhalten:

0       20:09:49.699    Script 3 EURUSDm,H1: loaded successfully
0       20:09:49.699    3 EURUSDm,H1: initialized
0       20:09:49.699    3 EURUSDm,H1: AccountBalance() = 152.82, getLot() = 0.15
0       20:09:49.699    3 EURUSDm,H1: uninit reason 0
0       20:09:49.699    Script 3 EURUSDm,H1: removed

Kein Fehler, denke ich.

 
simpleton:

Und MarketInfo()?

UND MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP?

Sie müssen noch in das zulässige Ziffernraster der Loswerte gelangen:

Ich habe es ausprobiert und etwas erhalten, das der Wahrheit ähnelt:

Ich scheine keinen Fehler gemacht zu haben.

Danke, das wurde mir schon erklärt :D

Es ist klar, dass für mich selbst schreibe ich mit allen Kontrollen, wie es sein sollte, gab es nur einen Entwurf, wie man das Los auf die Balance/10 Verhältnis zu bringen, aber die Idee war nicht erfolgreich ...

Aber Sie haben eine Menge Text, es könnte einfacher sein:

  lotstep= MarketInfo(Symbol(),MODE_LOTSTEP);
  lotmax=MarketInfo(Symbol(), MODE_MAXLOT);
  lotmin=MarketInfo(Symbol(), MODE_MINLOT);

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);
if(lot < lotmin) lot = lotmin;
if(lot > lotmax) lot = lotmax;
 
simpleton:

Und MarketInfo()?

UND MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP?

Sie müssen noch in das zulässige Ziffernraster der Loswerte gelangen:

Ich habe es ausprobiert und etwas Ähnliches wie die Wahrheit erhalten:

Ich scheine es nicht falsch machen zu können.

warum, wenn ein natürlicher Programmierer eine Aufgabe übernimmt, aus einer einzigen Zeile, die zum Erreichen des Ziels erforderlich ist, eine einen halben Kilometer lange Auflistung wird?

double Lot = NormalizeDouble(AccountBalance()/1000,2);
if(Lot<Min_Lot)Lot=Min_Lot;
 
_new-rena:

Wie kommt es, dass, wenn ein natürlicher Programmierer eine Aufgabe übernimmt, eine einzige Codezeile, die zum Erreichen des Ziels erforderlich ist, zu einem einen halben Kilometer langen Listing wird?

Manche Menschen haben nicht 0,01, sondern z. B. 0,03 oder sogar 0,1. Und wie dann? Kontrollen sind in allen Fällen erforderlich, und das dauert weiß Gott nicht lange.
 
evillive:
Bei manchen Menschen ist die Schrittweite nicht 0,01, sondern z. B. 0,03. Und wie? Für alle Fälle sind Kontrollen erforderlich, die nicht viel Zeit in Anspruch nehmen.
Setzen Sie (unten) in der inite und Sie müssen Ihren Server und Computer nicht mehr belästigen
double Min_Lot=MarketInfo(Symbol(), MODE_MINLOT);
 
Ich spreche vom Spielfeld, nicht vom Mindestparkplatz, aber gut, vergessen Sie es.
 
_new-rena:

Wie kommt es, dass, wenn ein natürlicher Programmierer eine Aufgabe übernimmt, eine einzige Codezeile, die zum Erreichen des Ziels erforderlich ist, zu einem einen halben Kilometer langen Listing wird?

Denn an jeder Ecke lauern Gefahren, und man muss sich schützen. Wenn Sie sich nicht schützen, wird die Qualität sehr niedrig sein, was Sie auf lange Sicht sehr viel Geld kosten kann. 90 % der Anstrengungen werden für die Abwehr des Teufels aufgewendet und nur 10 % für die Lösung des Problems. Im Falle von MT4 und MQL4++ ist das Verhältnis noch asymmetrischer.

Der Mist fängt schon beim Lesen der Dokumentation an:

Возвращаемое значение

Информация о финансовом инструменте. Часть информации о текущем финансовом инструменте хранится в предопределенных переменных.

Alles. Ist verpflichtet, die Informationen über das Finanzinstrument zurückzusenden, und nichts anderes. Es gibt keine anderen Ergebnisse. Wir erhalten Informationen über das Instrument:

#property strict

/******************************************************************************/
void OnStart() {
  Print("MarketInfo(\"Фигня\", MODE_MINLOT) = ", MarketInfo("Фигня", MODE_MINLOT));
  Print("MarketInfo(\"Фигня\", MODE_MAXLOT) = ", MarketInfo("Фигня", MODE_MAXLOT));
  Print("MarketInfo(\"Фигня\", MODE_LOTSTEP) = ", MarketInfo("Фигня", MODE_LOTSTEP));
}

Schauen wir uns an, was die Losparameter für dieses Werkzeug sind:

0       21:12:18.980    Script 3 EURUSDm,H1: loaded successfully
0       21:12:18.980    3 EURUSDm,H1: initialized
0       21:12:18.980    3 EURUSDm,H1: MarketInfo("Фигня", MODE_MINLOT) = 0.0
0       21:12:18.980    3 EURUSDm,H1: MarketInfo("Фигня", MODE_MAXLOT) = 0.0
0       21:12:18.980    3 EURUSDm,H1: MarketInfo("Фигня", MODE_LOTSTEP) = 0.0
0       21:12:18.980    3 EURUSDm,H1: uninit reason 0
0       21:12:18.980    Script 3 EURUSDm,H1: removed

Interessante Parameter. Ich weiß nicht, warum in der Dokumentation nicht beschrieben wird, wie sich diese Funktion im Falle von Fehlern verhält. Wir werden undokumentierte Funktionen verwenden müssen, die wir bei der Beobachtung des Verhaltens dieser Funktion entdeckt haben.

Daher kann die Funktion MarketInfo() für diese angeforderten Parameter, deren Werte von Natur aus von 0 verschieden sein müssen, 0 zurückgeben, was eine undokumentierte Fehlersituation darstellt. Der Code muss prüfen, ob bei der Abfrage der einzelnen Parameter ein Fehler aufgetreten ist. Allein aus diesem Grund sind im Code 3 Kontrollen vorgesehen.

Nächste. Natürlich kann es sein, dass die berechnete Losgröße nicht in den Bereich der zulässigen Losgrößen passt. Wollen wir es nicht überprüfen? Oder sollten wir diese Situation explizit programmieren und dann die Reaktion darauf im übergeordneten Code programmieren, anstatt "wie es passiert"? Ein Beispiel dafür, wie es aussieht, wenn nicht alles programmiert ist und es so funktioniert, wie es von selbst geschieht, könnte eine weitere neue Version von MT4 sein, bei der sich irgendwo etwas verschoben hat, irgendwo auf wundersame Weise ein Fehler auftrat und irgendwo nicht mehr funktionierte. Vielleicht ist dies nicht das gewünschte Ergebnis?

Der Code ist erweitert und auskommentiert, so dass der Gedankengang und das verwendete Berechnungsmodell ersichtlich sind. Da das von MetaQuotes festgelegte Lot-Modell in Form eines "Spread Order Values Grid" implementiert ist, das durch die Parameter MINLOT, MAXLOT und LOTSTEP definiert ist, wäre es sinnvoller, den genauen Wert des Lots in diesen Begriffen zu berechnen. Deshalb ist das Berechnungsmodell auch so formuliert.

Ich sehe keine "Halbkilometer" oder etwas anderes. Das Einzige ist, dass der Code so ausgeführt wird, dass eine maximale Leistung erreicht wird, wenn Funktionen einmal aufgerufen und die resultierenden Werte in Variablen gespeichert werden, und jeder Aufruf erst nach einer weiteren Prüfung ausgeführt wird, wenn sich herausstellt, dass der zurückgegebene Wert kein Fehlerindikator ist und es noch sinnvoll ist, die Berechnungen fortzusetzen. Sobald klar ist, dass ein Fehler aufgetreten ist, werden die Rechenressourcen nicht mehr für sinnlose Aufrufe verschwendet.

Um den Code kompakter zu gestalten, könnten wir alle 3 Werte auf einmal ermitteln und alle 3 Bedingungen in einem if überprüfen. Aber im Falle eines Fehlers beim ersten Aufruf wären die anderen 2 Aufrufe eine Verschwendung von Rechenressourcen.

Beachten Sie, dass wir bei der Programmierung eines Ausdrucks, der die Division durch lotStep verwendet, absichtlich darauf geachtet haben, dass er unter den if's verwendet wird, die gerade geprüft haben, dass der Wert von lotStep von 0 verschieden ist, d.h., eine Division durch 0 kann dort nicht stattfinden. Im Prinzip kann der Code noch verbessert werden, indem alle Variablen als "double" und "int" und "const double" und "const int" deklariert werden, um sich bei weiteren möglichen Codeänderungen vor sich selbst zu schützen. Insbesondere, wenn unter if's Code, der gerade überprüft, ob der Wert der lotStep Variable von 0 verschieden ist, versehentlich in einigen neu hinzugefügt an dieser Stelle Code fälschlicherweise den Wert 0 zu dieser Variable zuweisen, dann weitere Division durch 0 wird in Ausdruck auftreten. Wenn die Variable als "const double" deklariert ist, dann hoffe ich, dass der Compiler sofort einen unbefugten Versuch, lotStep Variable zu ändern, zu melden, wodurch von einem solchen Fehler zu verhindern.

Die "halben Kilometer" sind also auf strenge objektive Bedingungen zurückzuführen, nicht auf die Laune eines Menschen.

Wie heißt der Zweig? Wenn Sie helfen wollen, dann tun Sie es richtig, damit Sie wirklich etwas lernen können.

Grund der Beschwerde: