Fehler, Irrtümer, Fragen - Seite 2101

 
damirqa:

Hallo, ich habe mit dem Studium von MQL5 seithttps://www.mql5.com/ru/articles/100 begonnen. Ich habe den Code gestartet und bekam den Fehler 4756. Ich habe die Dokumentation durchgesehen und es war nicht besser. Ich dachte, ich beginne mit etwas Einfachem (Warnung/Drucken...). Eine der wichtigsten Funktionen ist OrderSend. Ich habe angefangen, das Forum/die Dokumentation zu durchsuchen, wie man OrderSend verwendet. Ich habe diesen Artikelhttps://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions gefundenund den Code für die Eröffnung einer Kaufposition gefunden. Ich habe Fehler 4756 und Retcode 10030. Ich habe verstanden, dass 10030 - es ist die OrderSend-Eigenschaft, aber ich habe nicht verstanden, wie diese Eigenschaft verwendet werden sollte (ich habe mir den Code von jemand anderem angesehen) und wofür sie hauptsächlich verwendet wird. Dann öffnete ichhttps://www.mql5.com/ru/docs/trading/ordersend, kopierte den Code, startete ihn, alles ist in Ordnung, es funktionierte.
Aber ich verstehe immer noch nicht, warum der Fehler 4756 auftritt und wie man ihn loswerden kann, ebenso wie den Fehler 10030.

Ich habe mir den Code zwischen

und diese.

Sie scheinen mir fast identisch zu sein, ich kann nicht erkennen, wo diese Fehler auftreten (4756 und 10030). Zeigen Sie mit dem Finger und erklären Sie bitte

Ein Feld in der Struktur ist nicht ausgefüllt. Und das ist nicht genug, aber auch kein Fehler.

Sofortige Vollstreckung

Ein Handelsauftrag zur Eröffnung einer Position im Modus der sofortigen Ausführung (der Modus des Handels zu Streaming-Preisen). 9 Felder sind erforderlich:

  • Aktion
  • Symbol
  • Band
  • Preis
  • sl
  • tp
  • Abweichung
  • Typ
  • Typ_Füllung

Sie können auch magische und Kommentarfelder angeben.

Marktausführung

Ein Handelsauftrag zur Eröffnung einer Position im Marktausführungsmodus. Es müssen 5 Felder angegeben werden:

  • Aktion
  • Symbol
  • Band
  • Typ
  • Typ_Füllung

Sie können auch magische und Kommentarfelder angeben.


 

welche Aktualisierung ist eingetroffen, 1736, was steht drin, wo kann ich sie lesen?

 

Ich schlage vor, eine Möglichkeit zu schaffen, programmatisch zu bestimmen, welcher Indikatorpuffer auf dem Diagramm gezeichnet wird.

Angenommen, ein Händler erstellt seine eigenen Indikatoren. Wir wissen nicht, wie viele Puffer für die Berechnung und wie viele für die Darstellung des Indikators auf dem Diagramm verwendet werden.

Adressierung von benutzerdefinierten Indikatoren durch

intChartIndicatorGet(
longchart_id,// Kennung der Karte
intsub_window// Nummer des Unterfensters
const string indicator_shortname // Kurzname des Indikators
);


Wir können auch das Array von Zeichenpuffern anfordern

intChartIndicatorGet(
longchart_id,// Kennung der Karte
intsub_window//Fensternummer
const string indicator_shortname // Kurzname des Indikators

int & IndicatorVisualBuffer[] // Zeichenpuffer-Nummern... );


Dadurch wird die Möglichkeit erweitert, mit unbekannten Indikatoren zu arbeiten, die auf dem Chart installiert sind...

 
Vladimir Pastushak:

Ich schlage vor, eine Möglichkeit zu schaffen, programmatisch zu bestimmen, welcher Indikatorpuffer auf dem Diagramm gezeichnet wird.

Angenommen, ein Händler startet seine Indikatoren. Wir wissen nicht, wie viele Puffer für die Berechnung und wie viele für die Darstellung des Indikators auf dem Diagramm verwendet werden.

Adressierung an den Indikator über

intChartIndicatorGet(
longchart_id,// Diagramm-ID
intsub_window// Nummer des Unterfensters
const string indicator_shortname // Kurzname des Indikators
);


Wir können auch das Array der Zeichenpuffer anfordern

intChartIndicatorGet(
longchart_id,// Kennung der Karte
intsub_window//Fensternummer
const string indicator_shortname // Kurzname des Indikators

int & IndicatorVisualBuffer[] // Zeichenpuffer-Nummern... );


Dadurch wird die Möglichkeit erhöht, mit unbekannten Indikatoren zu arbeiten, die im Diagramm installiert sind...

Was bringt sie zurück?

int  ChartIndicatorGet(
   long           chart_id,              // идентификатор графика
   int            sub_window             // номер подокна
   const string   indicator_shortname    // короткое имя индикатора
   );

und was nützt es, sie hinzuzufügen? Sie möchten einen Eingabeparameter hinzufügen und als Antwort denselben Indikator-Handle erhalten...

Und wenn es Ihnen nichts ausmacht, wozu wird es benötigt? Das ist nicht ironisch gemeint. Wenn man etwas vorschlägt, sollte man meiner Meinung nach ein überzeugendes Argument für die Notwendigkeit des Vorgeschlagenen anführen.

 
Alexey Viktorov:

Was bringt sie zurück?

und was würde es nützen, sie hinzuzufügen? Sie schlagen vor, einen Eingabeparameter hinzuzufügen und denselben Indikator-Handle als Antwort zu erhalten...

Und wenn es nicht schwierig ist, wozu ist dann eine solche Notwendigkeit entstanden? Die Frage ist nicht ironisch gemeint. Denn wenn etwas angeboten wird, ist es meiner Meinung nach notwendig, überzeugende Argumente für die Notwendigkeit des Angebots zu liefern.


Der Benutzer setzt einen beliebigen Indikator.

Der Expert Advisor findet ihn automatisch und verwendet Pufferdaten, um das Signal zu empfangen.


Jetzt müssen wir iCustom verwenden und wenn wir die Parameterliste schreiben können, hier ist das Problem mit buffers....

Es ist möglich, die Anzahl der Puffer durch Kopieren zu zählen, aber es ist unmöglich zu verstehen, welche es sind ...

 
Vladimir Pastushak:

Der Benutzer setzt einen beliebigen Indikator.

Der Expert Advisor findet ihn automatisch und verwendet Pufferdaten, um das Signal zu erhalten.


Jetzt müssen wir iCustom verwenden, und wenn wir die Liste der Parameter schreiben können, ist hier das Problem mit buffers....

Es ist möglich, die Anzahl der Puffer mit Copy programmatisch zu zählen, aber es ist unmöglich zu verstehen, welcher von ihnen gerade zeichnet ...

Warum ist das unmöglich? Kann der Puffer INDICATOR_CALCULATIONS durch iCustom() herausgenommen werden?

Das ist eine interessante Frage, aber sie gehört nicht in diesen Thread, um sie zu diskutieren. Ich persönlich bezweifle, dass es die Arbeit der Programmierer irgendwie verbessern oder vereinfachen kann. Die Indikatoren sind zu unterschiedlich und die Bedingungen für ihre Anwendung sind zu verschieden. Dann werden wir darum bitten müssen, die Art der grafischen Darstellung und einige andere Dinge bestimmen zu können, und unsere internen Anfragen werden sich häufen.

 
Alexey Viktorov:

Warum ist das nicht möglich? Kann der INDICATOR_CALCULATIONS-Puffer über iCustom() erreicht werden?

Die Frage ist interessant, aber nicht in diesem Thread zu diskutieren. Ich persönlich bezweifle, dass es die Arbeit des Programmierers irgendwie verbessern oder erleichtern kann. Es gibt zu viele verschiedene Indikatoren und zu unterschiedliche Bedingungen für ihre Anwendung. Dann werden wir darum bitten müssen, die Art der grafischen Darstellung und einige andere Dinge bestimmen zu können, und unsere internen Anfragen werden sich häufen.


Theoretisch sollte das, was standardmäßig in den Indikator geschrieben wird - ich spreche nicht vom Code des Programmierers -, von außen verfügbar sein ... Puffert ihre Anzahl, die Art der Darstellung, die Farbe und andere Standardwerte ...

 

Das ist das Problem, auf das ich gestoßen bin:

Ich habe beschlossen, als Magie den Rest der Division von ChartID durch 1000 oder 10000 zu verwenden, das spielt keine Rolle.

Aber aus irgendeinem Grund mit verschiedenen ChartID() der Rest der Division ist plötzlich die gleiche. Frage: Warum?

Skript prüfen

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d = 100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
}/*******************************************************************/

Ergebnis

2018.01.15 13:01:45.881 Script 00 EURUSD,M15: removed
2018.01.15 13:01:45.881 00 EURUSD,M15: uninit reason 0
2018.01.15 13:01:45.881 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:45.881 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 13:01:45.881 00 EURUSD,M15: initialized
2018.01.15 13:01:45.871 Script Test\00 EURUSD,M15: loaded successfully
2018.01.15 13:01:40.361 Script 00 EURUSD,H1: removed
2018.01.15 13:01:40.361 00 EURUSD,H1: uninit reason 0
2018.01.15 13:01:40.361 00 EURUSD,H1: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:40.361 00 EURUSD,H1: ChartID - 131472503841474908
2018.01.15 13:01:40.361 00 EURUSD,H1: initialized
2018.01.15 13:01:40.351 Script Test\00 EURUSD,H1: loaded successfully

Ich hatte erwartet, 74907 bzw. 74908 zu sehen, weil der Rest der Division gleich sein sollte.


Ich warte auch auf eine Antwort auf diese Frage.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

Alexey Viktorov, 2018.01.09 14:21

Im MT5-Tester erlaubt das "Input field"-Objekt OBJ_EDIT nicht, den Wert darin zu bearbeiten. Ist das so gewollt oder ist es ein Fehler?

In den Terminals und im MT4-Tester ist es editierbar, aber im MT5-Tester will es nicht, der Wert, der bei der Erstellung des Objekts programmatisch eingegeben wurde, verschwindet überhaupt nicht.


 
Alexey Viktorov:

Aber aus irgendeinem Grund erzeugt eine andere ChartID() plötzlich das gleiche Residuum aus der Division. Frage: Warum?

Weil die Eingabe fmod doppelt ist. Double kann nicht eine große Anzahl von ganzen Zahlen speichern. Dies ist zum Beispiel Ihr Fall:

Print(DoubleToString((double)131472503841474907, 0)); // 131472503841474912

Tun Sie dies.

long fmod( const long Value, const long Value2 )
{
  return(Value % Value2);
}


Am Beispiel von float lässt sich die Besonderheit von double schnell nachvollziehen

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  for (int i = 0; i < INT_MAX; i++)
    if ((int)(float)i != i)
    {
      PRINT(i);
      PRINT((float)i);
      PRINT((double)i);
      
      break;
    }
}


Ergebnis

i = 16777217
(float)i = 16777216.0
(double)i = 16777217.0


SZY double verliert nicht die Information des gesamten inneren Bereichs, nicht so bei long.

 
fxsaber:

Denn die Eingabe fmod ist doppelt. Double kann nicht eine große Anzahl von ganzen Zahlen speichern. Zum Beispiel Ihr Fall:

Tun Sie dies.

Natürlich werde ich dieses Beispiel jetzt überprüfen, aber ich hatte auch einen Prüfcode wie diesen

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
  printf("LONG_MAX = %I64d",LONG_MAX);
  printf("DBL_MAX = %.16e",DBL_MAX);
  Print("DBL_MAX-LONG_MAX = ", DBL_MAX-LONG_MAX);
}/*******************************************************************/

das Ergebnis ist

2018.01.15 14:07:20.440 Script 00 EURUSD,M15: removed
2018.01.15 14:07:20.440 00 EURUSD,M15: uninit reason 0
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX-LONG_MAX = 17976931348623157081452742373170435679807 0567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX = 1.7976931348623157 e+308
2018.01.15 14:07:20.440 00 EURUSD,M15: LONG_MAX = 9223372036854775807
2018.01.15 14:07:20.440 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:07:20.440 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:07:20.440 00 EURUSD,M15: initialized
2018.01.15 14:07:20.430 Script Test\00 EURUSD,M15: loaded successfully

Es zeigt an, dass es keine Wertabschneidung geben sollte.


Aber hier habe ich diese Variante geprüft und den Vorschlag leicht verändert

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", (long)fmod(ChartID(), d));
  Print("ChartID() % ", d, " = ", ChartID() % d);
}/*******************************************************************/

und erhielt die erwartete Variante.

2018.01.15 14:17:51.301 Script 00 EURUSD,M15: removed
2018.01.15 14:17:51.301 00 EURUSD,M15: uninit reason 0
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID() % 100000 = 74907
2018.01.15 14:17:51.301 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:17:51.301 00 EURUSD,M15: initialized
2018.01.15 14:17:51.291 Script Test\00 EURUSD,M15: loaded successfully

Eine weitere Frage taucht auf,

Sowohl MathMod als auch fmodgeben nach der Division zweier Zahlen den reellen Rest zurück. Und % laut der Dokumentation

Die verbleibenden Minuten = Zeit % 60;


Warum gibt es einen Unterschied?