Ein normaler Programmierer würde niemals den Schleifenkörper manipulieren, der die Positionen nach ihrem Index durchläuft (der hier Gott sei Dank nicht vorhanden ist), was zu einer Änderung ihrer Anzahl führt. Das ist der Gipfel an Analphabetismus und fehlerhaftem Code. Wenn so etwas passieren soll, muss man die ganze Schleife neu starten, und zwar auf eine gute Art und Weise.
Auch manche Leute mögen so etwas:
double Lot;
// где-то вычисляется значение Lot, финальная проверка и приведение к допустимым границам фееричны:if(Lot > MaxLot) Lot = MaxLot;
if(Lot < MinLot) Lot = MinLot;
// а то и вовсе:if(Lot > MaxLot) Lot = MaxLot;
elseif(Lot < MinLot) Lot = MinLot;
// а не проще ли сделать так?
Lot = MathMin(MathMax(Lot, MinLot), MaxLot);
Für einen Anfänger, dem es nicht um zusätzliche Stunden an CPU-Zeit für die Optimierung geht, sind solche "Wenn-dann-alles"-Konstruktionen aus dem BASIC-Schulunterricht klarer.
Und all dies wird nach dem Prinzip des Copy-Paste von Code zu Codeweitergegeben.
Sind Sie sicher? Du hast versucht, clever zu sein, aber du bist abtrünnig geworden...
Und dafür haben Sie sich absichtlich angemeldet? Einfach so, vom ersten Posting an, bist du auf der Toilette...
Oh je. "Lernen Sie Rechnen", Elger und Knut. Werden Sie nicht persönlich.
Na gut, ich erkläre es Ihnen:
for ( int i=0 ; i<PositionsTotal() ; i++ ) { }
^^^ ^^^^^^^ ^^^^^^^^^^^^^^^^^^ ^^^ ^^^
объявление | объявление переменной | проверка условия выполнения цикла: | инкремент | тело цикла
цикла | типа "int", инициализация | 'i' < значения, возвращаемого функцией | переменной |
типа "for" | значением '0' | которая вызывается на каждую итерацию |
Ist das klar, meine Liebe?
Wenn nicht, lesen Sie aufmerksam https://learnc.info/c/loop.html ab [ctrl+f , suchen Sie nach "Cycle for"].
Hier ist nicht einmal faul, den Link zu finden.
Und lernen Sie, lesbaren, schönen und prägnanten Code zu schreiben. Sie hätten mit Assembler beginnen sollen, mit Mikrocontrollern, bei denen jedes Byte zählt.
P.S.
Hier war ich sogar zu faul, dem Experten ein einfaches Beispiel für seine Schleife "for" zu zeigen.
intOnInit()
{
for(int i=0;i<somefunc();i++) PrintFormat("array[%d]\n", i);
return(INIT_SUCCEEDED);
}
int somefunc() {
staticint count = 0;
PrintFormat("Туточки уже %d-й раз!\n", ++count);
return3; // это типа количество чего-то там, элементов массива например
}
Und das ist das Ergebnis des Probelaufs:
2021.05.0308:01:36.343 show_the_shitz EURJPY,H1: initialized
2021.05.0308:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 4-й раз!
2021.05.0308:01:36.343 show_the_shitz EURJPY,H1: array[2]
2021.05.0308:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 3-й раз!
2021.05.0308:01:36.343 show_the_shitz EURJPY,H1: array[1]
2021.05.0308:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 2-й раз!
2021.05.0308:01:36.343 show_the_shitz EURJPY,H1: array[0]
2021.05.0308:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 1-й раз!
Sie können sehen, dass die Funktion nicht nur bei jeder Iteration aufgerufen wird, sondern sogar +1 Mal am Ende.
Циклы в Си: цикл while с предусловием, цикл do while с постусловием, цикл for со сщётчиком. Бесконечный цикл. Оператор break. Оператор continue. Примеры работы с циклами
Eh, Liebling. "Lernt Mathe", Elger und Knut. Werden Sie nicht persönlich.
Na gut, ich erkläre es Ihnen:
Ist das klar, mein Lieber?
Wenn nicht, lesen Sie aufmerksam https://learnc.info/c/loop.html ab [ctrl+f , suchen Sie nach "Cycle for"].
Hier ist nicht einmal faul, den Link zu finden.
Und lernen Sie, lesbaren, schönen und prägnanten Code zu schreiben. Sie hätten mit Assembler beginnen sollen, mit Mikrocontrollern, bei denen jedes Byte zählt.
P.S.
Hier war ich sogar zu faul, dem Experten ein einfaches Beispiel für seine Schleife "for" zu zeigen.
Und das ist das Ergebnis des Probelaufs:
Sie können sehen, dass die Funktion nicht nur bei jeder Iteration aufgerufen wird, sondern sogar +1 Mal am Ende.
Wenn ein Code anstrengend ist und man mit den Augen rollt, gibt es viele andere Berufe auf der Welt: Hausmeister, Verlader, Reinigungskräfte, Sanitäter...
Sind Sie sicher? Du hast versucht, clever zu sein, aber du bist abtrünnig geworden...
Und dafür haben Sie sich absichtlich angemeldet? Einfach so - vom ersten Pfosten in eine Pfütze...
Was fürein interessantes Gespräch, das Sie da führen) ))
Meine Herren, Persönlichkeiten sind Persönlichkeiten, aber lassen Sie uns die Wahrheit herausfinden.
Anhand des Beispiels kann ich sehen, dassPositionsTotal()bei jeder Schleifeniteration aufgerufen wird.
Aber Dimitri, im Gegenteil, du sagst, dass der Compiler es anders macht - das verstehe ich nicht. Erklären Sie das.
//+------------------------------------------------------------------+#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade m_trade;
CSymbolInfo m_symbol;
//-------------------------------------------------------------------+voidOnInit()
{
m_symbol.Name(Symbol());
m_symbol.RefreshRates();
for(int i = 0; i < 10; i++)
{
m_trade.Buy(1, _Symbol, m_symbol.Ask() + i * 2 * _Point, 0, 0);
}
//---закомментировать не нужноеfor(int i = 5; i < PositionsTotal(); i++) // так удаляются только 3 сделки
{
m_trade.PositionClose(_Symbol);
}
//---закомментировать не нужноеint index = PositionsTotal();
for(int i = 5; i < index; i++) // так удаляются 5 сделок
{
m_trade.PositionClose(_Symbol);
}
//вывод: PositionsTotal() вызывается на каждой итерации
}
//+------------------------------------------------------------------+
Wenn Sie sagen wollen, dass die FunktionPositionsTotal() die Positionen nicht jedes Mal neu berechnet, sondern einfach den Wert einer Variablen zurückgibt, die die Anzahl der offenen Positionen enthält, dann haben Sie recht, es macht keinen Sinn, eine weitere Variable zu deklarieren, aber was hat der Compiler dann damit zu tun?
Und wenn diese Funktion die offenen Positionen jedes Mal neu berechnet, dann stellt sich heraus, dass der Compiler verstehen muss, ob der Wert dieser Funktion weitere Berechnungen beeinflusst und entweder eine Funktion oder eine Variable verwendet.
Ich wollte schon früher hinzufügen, dass, wenn die Funktion somefunc() neben der Rückgabe eines Betrags oder etwas anderem noch andere Manipulationen durchführt, z.B. Handelsparameter berechnet, eine solche Verwendung schwer zu fangende Artefakte verursacht und den Autor des Codes in einen Stupor versetzen kann: "Ht??? Wie kommt es, dass er viermal auftaucht? O_o F$#@!!! Sollte es nicht dreimal vorkommen? Warum belügt mich mein EA?". Das habe ich "Shithcod" genannt, worüber ein Experte bis in die Haarwurzeln empört war. Ich habe es nicht erwähnt, weil es offensichtlich ist, aber Sie haben es für mich getan. Aber Sie haben nicht berücksichtigt, dass die Adressierung über einen dynamisch berechneten Index ohne Neuinitialisierung des Arrays etwas anderes ist. In Bare Sys führt dies normalerweise zu GPF, in Plus mit Smart Pointers und Arrays zu einer Exception und deren Handler. In mql ist nicht klar, wozu das führt.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
Vielen Dank für dieses Beispiel.
Ich dachte, ich wäre der Einzige, der es vorzieht, die Dinge auf diese Weise darzulegen, anstatt dickfellig zu schreiben.
hz - ins Russische übersetzt: "Ich würde es gerne wissen"... nicht schlecht...Es ist besser, Klassen aus der Standardbibliothek zu verwenden, damit Sie nicht all diese langen PositionGet... usw.
Vielen Dank für dieses Beispiel.
Ich dachte, ich wäre der Einzige, der es vorzog, die Dinge auf diese Weise darzulegen, anstatt sie auf dümmliche Weise zu schreiben.
Wo liegt das Problem?
Verstehen Sie das bitte nicht als"Coder-Nazi", aber ich finde solche Konstruktionen beunruhigend:
Es ist ein Ärgernis für das Auge. Wäre es nicht besser, es nicht"zaz wie", sondern so zu machen:
Oder diese Art von "Scheißhaufen":
WobeiPositionsTotal()bei jeder Schleifeniteration aufgerufen wird!
Ein normaler Programmierer würde niemals den Schleifenkörper manipulieren, der die Positionen nach ihrem Index durchläuft (der hier Gott sei Dank nicht vorhanden ist), was zu einer Änderung ihrer Anzahl führt. Das ist der Gipfel an Analphabetismus und fehlerhaftem Code. Wenn so etwas passieren soll, muss man die ganze Schleife neu starten, und zwar auf eine gute Art und Weise.
Auch manche Leute mögen so etwas:
Für einen Anfänger, dem es nicht um zusätzliche Stunden an CPU-Zeit für die Optimierung geht, sind solche "Wenn-dann-alles"-Konstruktionen aus dem BASIC-Schulunterricht klarer.
Und all dies wird nach dem Prinzip des Copy-Paste von Code zu Codeweitergegeben.
So, das war's...
...
Oder diese Art von "Shithcoding":
WobeiPositionsTotal()pro Schleifeniteration aufgerufen wird!
...
Sind Sie sicher? Du wolltest clever sein, aber du steckst in einem Trott...
Und Sie haben sich zu diesem Zweck angemeldet? Einfach so - vom ersten Posting an, und schon ist er weg...
Sind Sie sicher? Du hast versucht, clever zu sein, aber du bist abtrünnig geworden...
Und dafür haben Sie sich absichtlich angemeldet? Einfach so, vom ersten Posting an, bist du auf der Toilette...
Oh je. "Lernen Sie Rechnen", Elger und Knut. Werden Sie nicht persönlich.
Na gut, ich erkläre es Ihnen:
Ist das klar, meine Liebe?
Wenn nicht, lesen Sie aufmerksam https://learnc.info/c/loop.html ab [ctrl+f , suchen Sie nach "Cycle for"].
Hier ist nicht einmal faul, den Link zu finden.
Und lernen Sie, lesbaren, schönen und prägnanten Code zu schreiben. Sie hätten mit Assembler beginnen sollen, mit Mikrocontrollern, bei denen jedes Byte zählt.
P.S.
Hier war ich sogar zu faul, dem Experten ein einfaches Beispiel für seine Schleife "for" zu zeigen.
Und das ist das Ergebnis des Probelaufs:
Sie können sehen, dass die Funktion nicht nur bei jeder Iteration aufgerufen wird, sondern sogar +1 Mal am Ende.
So, das war's.
Eh, Liebling. "Lernt Mathe", Elger und Knut. Werden Sie nicht persönlich.
Na gut, ich erkläre es Ihnen:
Ist das klar, mein Lieber?
Wenn nicht, lesen Sie aufmerksam https://learnc.info/c/loop.html ab [ctrl+f , suchen Sie nach "Cycle for"].
Hier ist nicht einmal faul, den Link zu finden.
Und lernen Sie, lesbaren, schönen und prägnanten Code zu schreiben. Sie hätten mit Assembler beginnen sollen, mit Mikrocontrollern, bei denen jedes Byte zählt.
P.S.
Hier war ich sogar zu faul, dem Experten ein einfaches Beispiel für seine Schleife "for" zu zeigen.
Und das ist das Ergebnis des Probelaufs:
Sie können sehen, dass die Funktion nicht nur bei jeder Iteration aufgerufen wird, sondern sogar +1 Mal am Ende.
So, das war's.
Ich applaudiere! Machen Sie weiter...
Ich applaudiere! Machen Sie weiter...
Sind Sie sicher? Du hast versucht, clever zu sein, aber du bist abtrünnig geworden...
Und dafür haben Sie sich absichtlich angemeldet? Einfach so - vom ersten Pfosten in eine Pfütze...
Was fürein interessantes Gespräch, das Sie da führen) ))
Meine Herren, Persönlichkeiten sind Persönlichkeiten, aber lassen Sie uns die Wahrheit herausfinden.
Anhand des Beispiels kann ich sehen, dassPositionsTotal()bei jeder Schleifeniteration aufgerufen wird.
Aber Dimitri, im Gegenteil, du sagst, dass der Compiler es anders macht - das verstehe ich nicht. Erklären Sie das.
Wenn Sie sagen wollen, dass die FunktionPositionsTotal() die Positionen nicht jedes Mal neu berechnet, sondern einfach den Wert einer Variablen zurückgibt, die die Anzahl der offenen Positionen enthält, dann haben Sie recht, es macht keinen Sinn, eine weitere Variable zu deklarieren, aber was hat der Compiler dann damit zu tun?
Und wenn diese Funktion die offenen Positionen jedes Mal neu berechnet, dann stellt sich heraus, dass der Compiler verstehen muss, ob der Wert dieser Funktion weitere Berechnungen beeinflusst und entweder eine Funktion oder eine Variable verwendet.
Irgendetwas passt für mich nicht zusammen.
Interessante Unterhaltung, die Sie da führen)))