Fehler, Irrtümer, Fragen - Seite 1747

 

Wie kann ich das visuelle Anhaften von NOT LABEL-Objekten an den Zeitkoordinaten von Balken aufheben?

Ich habe die Zeitkoordinate des Objekts auf Sekunden eingestellt, aber es wird so dargestellt, als ob ich es auf den Zeitrahmen eingestellt hätte.

Ich habe die Frage gegraben

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

Andreas Petras, 2014.11.26 13:34

Ich bin sehr gut darin, Objekte wie Dreieck, Ellipse oder Rechteck zu verschieben, und die Ankerpunkte sind unverhältnismäßig "schwebend".

Es hängt nicht von diesen Einstellungen ab


Ich schaffe


Ziehen und Ablegen


Das Rechteck "treibt" den zweiten Punkt, das Dreieck und die Ellipse haben den dritten Punkt.

Kann dies behoben werden? Ich brauche genaue "Messungen".

Wenn ich "Präzise Zeitskala" wähle, verschwindet die erwähnte Bindung und alles wird so angezeigt, wie es sein sollte. Ich habe jedoch nirgendwo in MQL5 gefunden, wie man diesen Parameter aktivieren/deaktivieren kann. Ist sie nicht vorgesehen?

 

Ich brauche wirklich Hilfe! Seit ein paar Stunden versuche ich, die Ursache für das seltsame Verhalten herauszufinden. Am Ende schrieb ich einen EA mit einem unerwarteten Ergebnis

#define TOSTRING(A) #A + " = " + (string)A + "\n"

string TimeToString( const ulong Time )
{
  return(TimeToString(Time / 1000, TIME_DATE|TIME_SECONDS) + "." + ::IntegerToString(Time % 1000, 3, '0'));
}

void OnTick()
{
  static MqlTick PrevTick = {0};
  
  MqlTick NowTick;
  
  if (SymbolInfoTick(_Symbol, NowTick) && (PrevTick.time_msc > NowTick.time_msc))
    Alert(TOSTRING(TimeToString(PrevTick.time_msc)) + TOSTRING(TimeToString(NowTick.time_msc)));
    
  PrevTick = NowTick;  
}

Das Ergebnis (bottom-up)

2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.698
2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.702
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.654
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.656
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:05.458
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:05.464
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:56:05.474
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:56:05.476

SymbolInfoTick liefert manchmal (man muss warten) einen Tick mit einer niedrigeren Zeit als die vorherige!

Was zum Teufel soll das alles? Konfiguration

Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 112.19 ms)
Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700K  @ 3.50GHz, RAM: 11327 / 16301 Mb, HDD: 4346 / 30000 Mb, GMT+02:00
Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
 
fxsaber:

Ich brauche wirklich Hilfe! Seit ein paar Stunden versuche ich, die Ursache für dieses seltsame Verhalten herauszufinden. Am Ende schrieb ich einen EA mit einem unerwarteten Ergebnis

#define TOSTRING(A) #A + " = " + (string)A + "\n"

string TimeToString( const ulong Time )
{
  return(TimeToString(Time / 1000, TIME_DATE|TIME_SECONDS) + "." + ::IntegerToString(Time % 1000, 3, '0'));
}

void OnTick()
{
  static MqlTick PrevTick = {0};
  
  MqlTick NowTick;
  
  if (SymbolInfoTick(_Symbol, NowTick) && (PrevTick.time_msc > NowTick.time_msc))
    Alert(TOSTRING(TimeToString(PrevTick.time_msc)) + TOSTRING(TimeToString(NowTick.time_msc)));
    
  PrevTick = NowTick;  
}

Das Ergebnis (bottom-up)

2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.698
2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.702
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.654
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.656
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:05.458
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:05.464
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:56:05.474
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:56:05.476

SymbolInfoTick liefert manchmal (man muss warten) einen Tick mit einer niedrigeren Zeit als die vorherige!

Was zum Teufel soll das alles? Konfiguration

Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 112.19 ms)
Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700K  @ 3.50GHz, RAM: 11327 / 16301 Mb, HDD: 4346 / 30000 Mb, GMT+02:00
Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
Ja, Sie sind nicht der Einzige, der hier Hilfe braucht. Seit ein paar Wochen versuche ich, die Zecken ganz normal zu einer Kerze zu rollen. Also... die Zecken sind noch roh. Angebot in SD#1598238
 

Magische Linie

#include "key.mqh"
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }

Abfolge der Aktionen (streng)

  1. Legen Sie die angehängten Dateien in denselben Ordner. Dann mit der Maus im MetaEditor
  2. Datei->Öffnen->Test.mqh auswählen->Öffnen-Taste
  3. Bearbeiten->Suchen und Ersetzen->Ersetzen->die Felder "Suchen:" und "Ersetzen durch:" wie unten gezeigt ausfüllen->die Schaltfläche "Alle ersetzen" drücken

Ergebnis:

Einstellungen hier: https://www.mql5.com/ru/forum/1111/page1127#comment_795376

Dateien:
Test.mqh  1 kb
key.mqh  1 kb
 
Alexey Kozitsyn:
Ja, Sie sind nicht der Einzige, der hier Hilfe braucht. Seit ein paar Wochen versuche ich, meine Tics richtig in eine Kerze zu verwandeln. Also... Die Tics sind immer noch roh. Angebot in SD#1598238
Die Tics rollen ganz normal in die Kerze hinein.
 
fxsaber:
Tiki rollt ganz normal in die Kerze.
Wirklich? Und die Mengen stimmen überein? Und haben Sie die Kontrollen durchgeführt? Und können Sie die Protokolle überhaupt zeigen?
 
Alexey Kozitsyn:
Wirklich? Und die Mengen sind die gleichen? Und Sie haben Kontrollen durchgeführt? Und können Sie die Protokolle überhaupt zeigen?

Hat die Kontrolle - beobachten Sie die Codobase. Die Diskrepanz zwischen den Candlestick-Volumina und den berechneten Volumina spielt keine Rolle, da es sich um einen Grenztick handelt, der entweder in den einen oder den anderen Balken fallen kann. Dies ist kein Prinzip. Ich habe auch den Indikator für den Handelsumsatz in das Forum gestellt. Es gibt also überhaupt kein Problem.

In Ihrem Fall, wenn Sie sehr nerdy, können Sie auf die Bar Erstellung Mechanismus, aber nicht auf CopyTicks.

 

Kompilierungsfehler

class A {
protected:
        void f(  int ) {} //(*)
};
class B : public A {
public:
        void f( uint ) {}
};
void OnStart()
{
        B b;
        b.f( 1 ); //'A::f' - cannot call protected member function
}

Und wenn Sie die (*)-Zeile entfernen, ist alles in Ordnung. Was ist falsch an B::f(uint)? Wenn Sie die Situation von der anderen Seite betrachten

class A {
public:
        void f(  int ) {} //(**)
};
class B : public A {
public:
        void f( uint ) {}
};

können wir die grundlegenden Nachteile des MQL-Algorithmus für die Suche nach einer passenden Funktion erkennen. Im 2. Beispiel wird B::f(uint) so lange aufgerufen, bis keine Zeichenkette mehr vorhanden ist (**). Sobald die Zeile (**) erscheint, wird A::f(int) aufgerufen. Das bedeutet, dass sich Änderungen in der Basisklasse auf das Endergebnis auswirken, während in C++ B::f(uint) unabhängig von Änderungen in der Basisklasse immer aufgerufen wird, was die Stabilität des Endergebnisses garantiert.

In MQL stellt sich heraus, dass der Entwickler der Klasse A gerade eine neue öffentliche\geschützte\private Funktion erfunden hat und der Benutzer der Klasse B deshalb aufgehört hat, den Code zu kompilieren und/oder, was noch kritischer ist, das Endergebnis geändert hat

 
A100:

Magische Linie

#include "key.mqh"
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }

Abfolge der Aktionen (streng)

  1. Legen Sie die angehängten Dateien in denselben Ordner. Dann mit der Maus im MetaEditor
  2. Datei->Öffnen->Test.mqh auswählen->Öffnen-Taste
  3. Bearbeiten->Suchen und Ersetzen->Ersetzen->Felder "Suchen:" und "Ersetzen durch:" wie unten gezeigt ausfüllen->die Schaltfläche "Alles ersetzen" drücken

Ergebnis:

Einstellungen hier: https://www.mql5.com/ru/forum/1111/page1127#comment_795376

Danke für den Beitrag, der Fehler wird im nächsten Update behoben.
 
A100:

Kompilierungsfehler

class A {
protected:
        void f(  int ) {} //(*)
};
class B : public A {
public:
        void f( uint ) {}
};
void OnStart()
{
        B b;
        b.f( 1 ); //'A::f' - cannot call protected member function
}

Und wenn Sie die (*)-Zeile entfernen, ist alles in Ordnung. Was ist falsch an B::f(uint)? Wenn Sie die Situation von der anderen Seite betrachten

class A {
public:
        void f(  int ) {} //(**)
};
class B : public A {
public:
        void f( uint ) {}
};

können wir die grundlegenden Nachteile des MQL-Algorithmus für die Suche nach einer passenden Funktion erkennen. Im 2. Beispiel wird B::f(uint) so lange aufgerufen, bis keine Zeichenkette mehr vorhanden ist (**). Sobald die Zeile (**) erscheint, wird A::f(int) aufgerufen. Das bedeutet, dass sich Änderungen in der Basisklasse auf das Endergebnis auswirken, während in C++ B::f(uint) unabhängig von Änderungen in der Basisklasse immer aufgerufen wird, was die Stabilität des Endergebnisses garantiert.

In MQL stellt sich heraus, dass der Entwickler der Klasse A gerade eine neue öffentliche\geschützte\private Funktion erfunden hat und der Benutzer der Klasse B deshalb aufgehört hat, den Code zu kompilieren und/oder, was noch kritischer ist, das Endergebnis geändert hat.

Nur die Konstante "1" in dem Aufruf b.f( 1 ) wird als int interpretiert. Machen Sie eine explizite Konvertierung und alles wird funktionieren:

b.f( (uint)1 );