[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 304

 
Chiripaha:

: )))))))) Ja - das ist richtig. Alle Vorwürfe angenommen! - Dafür entschuldige ich mich nochmals. - Das alles sind die Folgen einer stark entwickelten (durch spezielle Übungen)

schöpferische, phantasievolle, poetische usw. Seite - trotzdem gibt es zwei Hemisphären im Menschen: die kreative und die rationale. Mein Fehler ist, dass ich es gesehen und nicht korrigiert habe.

Alle Ihre Behauptungen sind also zutreffend und ich bin schuldig.

Aber nur die Frage bleibt ungelöst...

Wie kann man das Problem letztendlich lösen?

Wenn Sie glauben, dass ich etwas nicht verstanden habe, klären Sie mich bitte auf. Ich verstehe die Rückkopplungstechnik (um "hören" zu können), aber ich habe noch keine Lösung gesehen.

Wie erhält man die richtige Zahl ohne Rundung in Double, bis zur 3. Dezimalstelle, z.B. bei dem Wert von Ask = 1,20667 ?- Eine Lösung wie "StrToDouble(DoubleToStr(Ask,3)) = 1,2100 // 1,2100 ist das Ergebnis (d.h. Rundung)" hat nicht funktioniert.

Ich danke Ihnen im Voraus für Ihre Toleranz und Ihr Verständnis.

DoubleToStr(Ask,3) !!! - Das war eine tolle Erfahrung.

Und die Lösung befindet sich in der Datei (es ist ein Testskript).

Dateien:
test_ind.mq4  2 kb
 
alsu:

Ich habe mir Ihren Code angesehen.... Sie sind zu verwirrt))))

Ich verstehe nicht ganz, warum wir Ticks akkumulieren müssen, denn es reicht aus, die Parameter des aktuellen Balkens - sechs Zahlen TOHLCV - im Speicher zu speichern (oder auch nicht zu speichern, da der aktuelle Balken in HST geschrieben werden muss - sonst wird das Diagramm nicht aktualisiert) und sie bei Bedarf beim Tick-Empfang zu aktualisieren und die Balken durch eine bestimmte Bedingung (TimeCurrent()-O>1) abzuschneiden.

Versuchen Sie, den Code auf diese Weise zu überarbeiten, er wird sich um das 8-fache verringern, das garantiere ich Ihnen (ich habe es überprüft:)


Etwa so? Ich habe den Algorithmus überarbeitet, den Akkumulator entfernt, ihn in einen Expert Advisor umgewandelt, eine Abstufung der Ticks in bearish-bullish hinzugefügt, Candlestick-Tails mit einem anderen Algorithmus hinzugefügt und alles kommentiert. Ich habe nichts, womit ich es überprüfen könnte, am Wochenende gibt es keine Zecken. Wie für das Volumen - es scheint mir, es war in FileFlush, es funktioniert mit dem Puffer. Für die Zukunft weigere ich mich, irgendetwas zwischen FileSeek und FileFlush zu setzen...
Dateien:
elz.jp.mq4  23 kb
 
IgRU4ek:

DoubleToStr(Ask,3) !!! - das hätte man sehen müssen.

Und die Lösung befindet sich in der Datei (es ist ein Testskript).


Ich danke Ihnen vielmals.

Ich verstehe den Mechanismus immer noch nicht - warum es in meiner Version nicht funktionierte und warum "DoubleToStr(Ask,3) != DoubleToStr(Ask,Digits)" - Offensichtlich werden nicht alle Eigenschaften von Funktionen im Handbuch offengelegt.

Ihre Funktion wurde geparst - ich habe verstanden, wie sie gelöst wurde. Aber ich war mir sicher, dass es eine "einfachere" Lösung geben muss, denn die Menge der Funktionen in einer Programmiersprache ist darauf ausgelegt, typische Probleme mit ihnen zu lösen, anstatt diese typischen Funktionen für jeden Benutzer selbst zu erstellen. Ich habe naiverweise angenommen, dass DoubleToStr() genau dieses Problem löst. - Ich verstehe nicht, warum man ihn dann verwendet (was sind seine Feinheiten). Ich bin ein normaler Benutzer, kein Programmierer, der sich mit solchen Details befasst". Wann sollte man in diesem Fall Erstellungsprodukte verwenden, wenn die gesamte Zeit für die detaillierte Programmierung aufgewendet werden soll?

Nochmals vielen Dank. Ich werde nun versuchen, das alles in den Code zu übertragen. Hoffentlich klappt das alles.

 
Chiripaha:

Ich danke Ihnen vielmals.

Ich verstehe den Mechanismus immer noch nicht - warum meine Version nicht funktionierte und warum "DoubleToStr(Ask,3) != DoubleToStr(Ask,Digits)" - Offensichtlich sind nicht alle Eigenschaften von Funktionen im Referenzbuch offengelegt.

Ihre Funktion wurde geparst - ich habe verstanden, wie sie gelöst wurde. Aber ich war mir sicher, dass es eine "einfachere" Lösung geben muss, denn die Menge der Funktionen in einer Programmiersprache ist darauf ausgelegt, typische Probleme mit ihnen zu lösen, anstatt diese typischen Funktionen für jeden Benutzer selbst zu erstellen. Ich bin naiverweise davon ausgegangen, dass DoubleToStr() genau dieses Problem löst. - Ich verstehe nicht, warum man ihn dann verwendet (was sind seine Feinheiten). Ich bin ein normaler Benutzer, kein Programmierer, der sich mit solchen Details befasst". Wann sollte man in diesem Fall Erstellungsprodukte verwenden, wenn die gesamte Zeit für die detaillierte Programmierung aufgewendet werden soll?

Nochmals vielen Dank. Ich werde nun versuchen, das alles in den Code zu übertragen. Hoffentlich klappt das alles.

DoubleToStr() führt eine Konvertierung mit einer Zahl in zwei Schritten durch: zuerst rundet es (nach den Regeln der Mathematik) die Zahl auf das richtige Vorzeichen und konvertiert sie dann in eine Zeichenkette.
 

Versuchen Sie es für Ihren Fall

double x = MathFloor(y*1000)/1000;

 
IgRU4ek:
DoubleToStr() führt die Umwandlung in eine Zahl in zwei Schritten durch: Zuerst rundet es (nach mathematischen Regeln) die Zahl auf das richtige Vorzeichen und wandelt sie dann in eine Zeichenkette um.


Danke für die Klarstellung. Das wusste ich natürlich nicht und habe StrToDouble() in diesem Fall die Schuld gegeben. Aber nach Ihrer Klarstellung gehe ich jetzt davon aus, dass sie beide aufrunden :(

Warum gerundet wird, ist nicht klar. Wenn eine Rundung erforderlich wäre, wäre es in diesem Fall besser, erstens eine Rundungsfunktion (je nach Bedarf) zu verwenden - die gleiche Normalisierung. Dann gäbe es beide Möglichkeiten, mit und ohne Rundung. Andernfalls würden wir unnötig viel Unordnung haben. Außerdem verstehe ich nicht, warum es zu Rundungen kommt, wenn ich nur eine vorhandene Zahl in einen anderen Typ umwandeln muss. Ich habe sie bereits (eine Nummer), warum sollte ich sie zusätzlich erfinden.

 
Roger:

Versuchen Sie es für Ihren Fall

double x = MathFloor(y*1000)/1000;


Ganz genau! Das ist eine gute Lösung. Ich habe es schon einmal gesehen, aber in meinem Fall etwas übersehen. Auch dir, Alexander, vielen Dank! - Jetzt werde ich 2 Lösungen haben! : )) (Für den Zeichentrickfilm "Prostokvashino")
 

Das ist eine theoretische Frage. Handelt es sich bei dem Schlusskurs um einen Geld- oder Briefkurs des letzten Ticks in der Kerze? Ich habe festgestellt, dass, wenn das Gebot in Close[0] geschrieben wird, die Notierung auf dem Läufer dieselbe ist wie auf dem Protokoll.

Ich dachte darüber nach... Bieten Sie auf die Idee...

 
Zhunko:
Eine Menge Fehler. Vielleicht sollten Sie sich ein Beispiel ansehen und es in Analogie tun?


Im Grunde genommen ist es dasselbe. Meines Erachtens wird die Einbindung nur als Verbindung zwischen dem Expert Advisor und der Bibliothek benötigt, auch wenn in der Anleitung nichts darüber steht.

Die Funktion wird in der Inline importiert, und die zu importierenden Funktionen werden deklariert. Sie setzen ein . Zeichen zwischen die Erklärungen;

Hier habe ich ein Inlude und eine Bibliothek geschrieben (mit nur einer Funktion, aber die ist nur für einen Test).

Die Aufnahme erfolgt hier:

//+------------------------------------------------------------------+
//|                                       HozIncludeToScalper_M1.mqh |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

#import "Scalper_M1_lbr.ex4"

//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
double GetMA(int typeOfMA);

// Очередная функция

// Очередная функция

// Очередная функция

#import

Wenn alle notwendigen (von bestimmten Eulen verwendeten) Funktionen deklariert sind, fügen Sie#import am Ende ein

Hier ist die Bibliothek selbst:

//+-------------------------------------------------------------------------------------+
//|                                                                  Scalper_M1_lbr.mq4 |
//|                                                                                 hoz |
//|                                                                                     |
//+-------------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""
#property library

//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
double GetMA(int typeOfMA)
{
   switch (typeOfMA)
   {
      case 1:      return (iMA(NULL, i_fastMATF, i_fastMAPeriod, i_fastMAShift, i_fastMAMethod, i_fastMAApplied, i_fastMAIndex));
      case 2:      return (iMA(NULL, i_slowMATF, i_slowMAPeriod, i_slowMAShift, i_slowMAMethod, i_slowMAApplied, i_slowMAIndex));
      case 3:      return (iMA(NULL, i_filtrMATF, i_filtrMAPeriod, i_filtrMAShift, i_filtrMAMethod, i_filtrMAApplied, i_filtrMAIndex));
   }
}

Es lässt sich nicht einmal kompilieren.

'i_fastMATF' - variable not defined     E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 38)
'i_fastMAPeriod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 50)
'i_fastMAShift' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 66)
'i_fastMAMethod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 81)
'i_fastMAApplied' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 97)
'i_fastMAIndex' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 114)
'i_slowMATF' - variable not defined     E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 38)
'i_slowMAPeriod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 50)
'i_slowMAShift' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 66)
'i_slowMAMethod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 81)
'i_slowMAApplied' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 97)
'i_slowMAIndex' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 114)
'i_filtrMATF' - variable not defined    E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 38)
'i_filtrMAPeriod' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 51)
'i_filtrMAShift' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 68)
'i_filtrMAMethod' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 84)
'i_filtrMAApplied' - variable not defined       E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 101)
'i_filtrMAIndex' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 119)
18 ошибок, 0 предупреждений     

Sie deklarieren nichts in der Bibliothek, und es treten keine Fehler auf, aber ich tue es aus irgendeinem Grund. Ich habe keinen Unterschied festgestellt.

 

Victor, Sie haben viele Variablen in Ihrer Funktion und keine ist deklariert.

Der Compiler sagte:

Variable nicht definiert

Eine Variable ist nicht definiert. Es gibt 18 von ihnen.

==============

Dem Design der Funktion nach zu urteilen, handelt es sich um eine hochspezialisierte Funktion. Warum sollten Sie es in die Bibliothek stellen? Vor allem, weil es wahrscheinlich in der Schleife bei jedem Takt aufgerufen wird.

Sie haben etwas über Geschwindigkeit und Optimierung gesagt. Sie erstellen einen sehr langsamen Code. In MQL4 sollten Sie Funktionen nicht in eine Schleife einfügen. Je weniger Funktionsaufrufe in einer Schleife, desto schneller läuft der Code.

==============

Vor langer Zeit, als ich begann, in MQL4 zu schreiben, schrieb ich meinen ersten Forex-Index-Indikator. Dort gab es auch Funktionen, Operationen mit Zeichenketten... Was für ein Chaos... Ich habe 5 Minuten gebraucht, um die TFs zu wechseln.

Dann habe ich mich hingesetzt und nachgedacht, alle Funktionen eliminiert und sie direkt im Schleifenblock geöffnet. Die Arbeit mit Zeichenketten wurde durch die Verwendung von Bezeichnern ersetzt. Alles, was im Voraus kalkulierbar war und sich nicht geändert hat - so habe ich es berechnet (Optimierung). Code in den Expert Advisor verschoben. Infolgedessen betrug die schwerste Berechnung beim Wechsel der TF 15 Sekunden. Dann habe ich die Berechnungen in die DLL übertragen. Jetzt dauert es etwa 5 Sekunden.

Grund der Beschwerde: