Helfen Sie mir, das Programmieren zu lernen. - Seite 2

 
Alexey Viktorov:

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.

 
Dmitry Fedoseev:
Ich danke Ihnen. Verdauung.
 
Alexey Viktorov:

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:

for(int index=PositionsTotal()-1; index>=0; index--) { /* тело цикла */ }

Es ist ein Ärgernis für das Auge. Wäre es nicht besser, es nicht"zaz wie", sondern so zu machen:

int index = PositionsTotal();

while (index-- > 0) { /* тело цикла */ }

Oder diese Art von "Scheißhaufen":

for(int i=0;i<PositionsTotal();i++)

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:

double Lot;

// где-то вычисляется значение Lot, финальная проверка и приведение к допустимым границам фееричны:
if(Lot > MaxLot) Lot = MaxLot;
if(Lot < MinLot) Lot = MinLot;

// а то и вовсе:
if(Lot > MaxLot) Lot = MaxLot;
  else
    if(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.

So, das war's...

 
Tio Nisla:

...

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...

 
Dmitry Fedoseev:

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.

int OnInit()
{
   for(int i=0;i<somefunc();i++) PrintFormat("array[%d]\n", i);
   return(INIT_SUCCEEDED);
}

int somefunc() {
   static int count = 0;
   PrintFormat("Туточки уже %d-й раз!\n", ++count);
   return 3; // это типа количество чего-то там, элементов массива например
}

Und das ist das Ergebnis des Probelaufs:

2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: initialized
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 4-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[2]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 3-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[1]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 2-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[0]
2021.05.03 08: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.

So, das war's.

Циклы в Си. Циклы с постусловием, предусловием, Цикл for со счётчиком.
Циклы в Си. Циклы с постусловием, предусловием, Цикл for со счётчиком.
  • 1989.04.14
  • Sypachev S.S. 1989-04-14 sypachev_s_s@mail.ru Stepan Sypachev
  • learnc.info
Циклы в Си: цикл while с предусловием, цикл do while с постусловием, цикл for со сщётчиком. Бесконечный цикл. Оператор break. Оператор continue. Примеры работы с циклами
 
Tio Nisla:

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...


 
Dmitry Fedoseev:

Ich applaudiere! Machen Sie weiter...


Warum hast du so ein Chaos angerichtet? Und stellen Sie es ins Netz. Deine Mutter wird dich ausschimpfen!
 
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...
 
Dmitry Fedoseev:

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;
//-------------------------------------------------------------------+
void OnInit()
  {
   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.

Irgendetwas passt für mich nicht zusammen.

 
Aleksandr Slavskii:

Interessante Unterhaltung, die Sie da führen)))

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.