Fehler, Irrtümer, Fragen - Seite 1439

 
George Merts:

Wenn der Programmierer etwas in ein Array schreibt, das 10 Elemente mit dem Index 20 enthält, bedeutet das meiner Erfahrung nach höchstwahrscheinlich, dass er/sie einen Fehler gemacht hat und das Programm einen Fehler generieren sollte, anstatt das Array zu vergrößern und damit eine fragwürdige Aktion zu verbergen.

All diese "Arrays zur Größenanpassung" sind in Bezug auf das Verstecken potenzieller Fehler weitaus lästiger als bequem. Die Größe eines Arrays nicht im Auge behalten zu müssen, ist außerdem eine potenziell gefährliche Praxis, die zu schwer zu behebenden Fehlern führt.

Liegt es an mir, oder haben Sie nicht mit den betreffenden Sprachen gearbeitet? Sie müssen keinen Index angeben, der hinzugefügt werden soll: er wird automatisch zugewiesen und die Größe des Arrays wird ebenfalls erhöht. Der Programmierer hat bei diesem Vorgang einfach keine Chance, einen Fehler mit dem Index zu machen.

Sie können ein ähnliches Verhalten mit Klassen implementieren und die entsprechenden Funktionen pop, shift, unshift usw. hinzufügen. Und ziehen Sie einen Wagen von Klassen von Code zu Code, wobei jeder Code %10...20 Funktionen davon verwendet. Hört sich das nach einer guten Lösung an? Ein Beispiel für die richtige Lösung ist meiner Meinung nach das Hinzufügen der Funktion ObjectsDeleteAll mit der Möglichkeit, nach Präfix zu löschen - dies ist ein weiterer Baustein in Richtung höherer Programmierung - und die meisten Programmierer sind in den Papierkorb geflogen, also haben sie die Funktion selbst entwickelt. Leider werden wir das bei Arrays kaum sehen...

 

И таскать телегу классов из кода в код, при том что в каждом коде из неё используются %10..20 функций.

Haben Sie noch nie von include mqh-Dateien gehört?
 

Sie brauchen keine "Smart Array"-Klassen zu schreiben, diese sind bereits in der MetaQuotes Standard Library enthalten, siehe die Arry-Klassenfamilie

 
Hallo. Ich versuche, MT5 zu verwenden, um mit Futures über Broker "Otkritie" zu arbeiten.
Beim Zugriff auf die Funktion SymbolInfoTick stellte sich heraus, dass die letzten beiden Parameter der Struktur MqlTick
- time_msc, flag fehlen. Ist es möglich, dieses Problem zu lösen? Nehmen Sie zum Beispiel MT5 von dieser Website,
versuchen, ihn mit dem Server des Brokers zu verbinden. Es ist auch möglich, die gewünschten Informationen auf andere Weise zu erhalten.
Mich interessiert: Wer hat die Transaktion initiiert, der Verkäufer oder der Käufer?
 
Alexander Puzanov:

Geht es nur mir so, oder haben Sie nicht mit den fraglichen Sprachen gearbeitet? Sie müssen keinen Index für das hinzugefügte Element angeben, es wird automatisch zugewiesen und die Größe des Arrays wird ebenfalls erhöht. Der Programmierer hat bei diesem Vorgang einfach keine Chance, einen Fehler mit dem Index zu machen

Awwwww... Welche Chancen hat der Programmierer, einen Fehler zu machen? Sie irren sich, wenn Sie glauben, dass Sie alle Varianten eines komplexen Programms berücksichtigen können.

Alle diese "Standardaktionen" müssen Eigenschaften von komplexen Objekten sein. Einfache Objekte, wie Variablen, Arrays und einfache Strukturen, müssen so wenig "Standard"-Eigenschaften wie möglich haben.

Zum Beispiel müssen sie bei der Erstellung einen undefinierten Wert speichern, nicht Null.

Sie können ein ähnliches Verhalten mit Klassen implementieren und entsprechende Funktionen wie pop, shift, unshift usw. hinzufügen. Und ziehen Sie einen Wagen von Klassen von Code zu Code, wobei jeder Code %10...20 Funktionen davon verwendet. Hört sich das nach der richtigen Lösung an?

Von der Logik her ist es die richtige Lösung. Wenn Sie mit solchen Klassen arbeiten, ist ihr Verhalten transparent.

Und was ist mit dem "Ziehen eines Wagens voller Klassen" - beim Programmieren zieht man sie nicht, man fügt einfach die Bibliothek ein. Und beim Kompilieren sollte ein normaler Linker nicht alle Methoden aus der Bibliothek in eine ausführbare Datei einfügen, sondern nur die, die verwendet werden.

Beispiel für die richtige Lösung meiner Meinung nach - das Hinzufügen zu ObjectsDeleteAll Funktion löschen durch Präfix - dies ist ein weiterer Mikron in Richtung höherer Ebene Programmierung - und die meisten Programmierer haben in Papierkorb diese selbstgemachte Funktion geflogen. Leider ist es unwahrscheinlich, dass dies bei Arrays der Fall ist...

Meiner Meinung nach ist dies auch ein falscher Ansatz, und zwar aus demselben Grund. Die Funktion wird mit Aufgaben belastet, die nicht typisch für sie sind und nicht der Logik ihrer Anwendung folgen.

Die richtige Lösung scheint mir zu sein, einen Klassenobjektmanager im Graphen zu haben, der eine Liste dieser Objekte führt und die notwendigen Objekte entfernt, wenn Funktionen aufgerufen werden. Die Namenspräfixe sollten meines Erachtens lediglich dazu dienen, einer Person einige Informationen über den Gegenstand zu verdeutlichen. Und das Löschen - sollte in keiner Weise auf dem Namen des Objekts basieren, sondern auf dem Speichern dieses Namens in einem Array.

 
Demal:
Hallo. Ich versuche, MT5 zu verwenden, um mit Futures über Broker "Otkritie" zu arbeiten.
Beim Zugriff auf die Funktion SymbolInfoTick stellte sich heraus, dass die letzten beiden Parameter der Struktur MqlTick
- time_msc, flag fehlen. Ist es möglich, dieses Problem zu lösen? Nehmen Sie zum Beispiel MT5 von dieser Website,
versuchen, ihn mit dem Server des Brokers zu verbinden. Es ist aber auch möglich, die gewünschten Informationen auf andere Weise zu erhalten.
Mich interessiert: Wer hat die Transaktion eingeleitet, der Verkäufer oder der Käufer?
  1. Welche Version des Terminals haben Sie jetzt?
  2. Stellen Sie eine Verbindung zu einem Demo- oder einem echten Server her?
 
Version 5.0 build 1150, Demo
 
Demal:
Version 5.0 build 1150, Demo

Aktualisieren Sie Ihr Terminal (Sie müssen sich mit dem MetaQuotes-Demo-Server verbinden). Derzeitige Ausführung:

Terminal        MetaTrader 5 build 1210 started (MetaQuotes Software Corp.)

Dies ist das Drehbuch:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2015, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlTick last_tick;
//--- 
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      Print("time = ",last_tick.time,"; bid = ",last_tick.bid,
            "; ask = ",last_tick.ask,"; volume = ",last_tick.volume,
            "; time_msc = ",last_tick.time_msc,"; flag = ",last_tick.flags);
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
  }
//+------------------------------------------------------------------+

Ergibt dieses Ergebnis:

Test (RTS-12.15,H1)     time = 2015.11.26 09:42:57; bid = 88360.0; ask = 88400.0; volume = 2; time_msc = 1448530977000; flag = 0

Dateien:
Test.mq5  2 kb
 
Karputov Vladimir:

Aktualisieren Sie Ihr Terminal (Sie müssen sich mit dem MetaQuotes-Demo-Server verbinden). Derzeitige Ausführung:

Dies ist das Drehbuch:

Ergibt dieses Ergebnis:

Danke. Wissen Sie, warum das Kennzeichen den Wert 0 hat, als ob sich nichts geändert hätte?
 
Demal:
Danke, wissen Sie, warum das Flag einen Wert von 0 hat, als ob sich nichts geändert hätte?
Verwenden SieCopyTicks und Sie werden zufrieden sein. UndSymbolInfoTick weiß wahrscheinlich noch nicht, wie man mit der neuen Tick-Struktur arbeitet.
Dateien:
CopyTicks.mq5  4 kb