Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1179

 
Mikhail:

Wenn ich eine Abfrage wie diese mache:

Ich erhalte dieses Ergebnis:

2020.06.17 13:49:53.270 2020.01.02 06:50:00 Symbol EURUSD_i Ziffern 5 Punkt 1e-05

Wenn ich eine Anfrage wie diese stelle:

Ich erhalte dieses Ergebnis:

2020.06.17 13:51:58.787 2020.01.02 06:45:00 Symbol EURUSD_i Ziffern 0 Punkt 0.0

Gleichzeitig möchte ich anmerken, dass ich, wenn ich die Funktion Print nicht einfüge, überhaupt keinen Fehler erhalte, der Auftrag versucht nicht einmal, sich zu ändern. Es ist, als ob CTrade meine Bestellung nicht sieht.

Die Suche nach dem Symbol und der magischen Zahl funktioniert nicht:

Ergebnis:

2020.06.17 14:37:38.147 2020.01.02 06:50:00 Symbol Magic 0 Ticket 2

Die magische Zahl sollte 12345 sein, das Symbol ist Euro-Dollar.

Warum kann ich kein Symbol und kein Medikament bekommen?

Wenn Sie die Zeichenfolge ändern:

wird geändert in

und die Validierung durch die magische Zahl entfernen, dann gibt es Probleme mit den Preisen

2020.06.17 01:38:24.136 2020.01.02 07:40:00 fehlgeschlagene Änderung der Order #2 buy stop 0.1 EURUSD_i bei 1.12086 sl: 1.12023 tp: 1.12275 -> 1.00000, sl: 1.00000 tp: 1.00000 [Ungültiger Preis]

2020.06.17 01:38:24.136 2020.01.02 07:40:00 CTrade::OrderSend: modify #2 at 1.00000 (sl: 1.00000 tp: 1.00000) [invalid price]

2020.06.17 01:38:24.136 2020.01.02 07:40:00 BUY STOP modification failed! Ergebnis Retcode: 10015, Beschreibung des Retcodes: ungültiger Preis

Ich habe mir bereits das Hirn zermartert, während derselbe Code in einem anderen Expert Advisor gut funktioniert.

Was mache ich falsch?

Falsch initialisiertes (oder nicht) Objekt der Klasse CSymbolInfo.

Wenn Sie die Zeichenfolge asymbol.Name(Symbol()) nicht haben, fügen Sie sie hinzu.

Wenn Sie eine haben, debuggen Sie in der Funktion Name(string symbol), was passiert.

Füllen der Felder m_digits usw. mit Refresh().

s.s. Nach dem zu urteilen, was Sie hinzugefügt haben, haben Sie definitiv asymbol uninitialisiert.

 
Mikhail:

Bis zum Eintreffen des neuen Häkchens werden die Tasten nicht bewegt. Das ist es, was ich mit meinen Augen sehen kann. Sobald sich der Preis ändert, bewegen sich die Schaltflächen.

Allerdings werden die Schaltflächen heute auch auf dem neuen Häkchen nicht mehr neu gezeichnet, obwohl ich nichts geändert habe. Nur der Hintergrund bewegt sich.

Um zu klären - wie Sie sagen, Sie ändern die Koordinaten in OnTick, und behaupten, dass in der Tat die Tasten auf der NEXT Tick bewegen. Der nächste Tick von dem, bei dem Sie die Koordinaten geändert haben, oder der von Weihnachten?

 
Aleksey Mavrin:

Ihr CSymbolInfo-Klassenobjekt ist falsch (oder gar nicht) initialisiert.

Wenn Sie keine solche Zeichenfolge asymbol.Name(Symbol()) haben, fügen Sie sie hinzu.

Wenn Sie eine haben, debuggen Sie in der Funktion Name(string symbol), was passiert.

Füllen der Felder m_digits usw. mit Refresh().

s.s. Nach dem zu urteilen, was Sie hinzugefügt haben, ist Ihr asymbol definitiv uninitialisiert.

Ganz oben in meinem Code stehen die folgenden Zeilen
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Trade\SymbolInfo.mqh>

CTrade atrade;
COrderInfo aorder;
CPositionInfo apos;
CDealInfo adeal;
CSymbolInfo asymbol;

Ist es eine Initialisierung? Beim Kompilieren erhalte ich die folgenden Informationen

Panel "Handel.mq5" Panel "Handel.mq5" 1 1

Handel.mqh' Handel.mqh 1 1

Object.mqh' Object.mqh 1 1

'StdLibErr.mqh' StdLibErr.mqh 1 1

'OrderInfo.mqh' OrderInfo.mqh 1 1

HistoryOrderInfo.mqh' HistoryOrderInfo.mqh 1 1

PositionInfo.mqh' PositionInfo.mqh 1 1

'DealInfo.mqh' DealInfo.mqh 1 1

'SymbolInfo.mqh' SymbolInfo.mqh 1 1

erzeugter Code 1 1

0 Fehler, 0 Warnungen, 3192 msec verstrichen 1 1

Nachdem ich einen Kauf-Stopp-Auftrag eröffnet habe, berechne ich alle Aufträge neu, wähle einen offenen Auftrag aus und prüfe, ob das Symbol und die Majdic-Nummer übereinstimmen:

for(int i=OrdersTotal()-1;i>=0;i--)
          if(aorder.SelectByIndex(i))  
              if(aorder.Symbol()==asymbol.Name() && aorder.Magic()==MagicNumber && Ask < aorder.PriceOpen())

In dieser Phase passiert nichts, wie ich bereits oben geschrieben habe. asymbol.Name() gibt aus irgendeinem Grund nicht das Symbol der offenen Order zurück, aorder.Magic() gibt den Wert 0 zurück (obwohl meine magische Zahl 121345 ist), asymbol.TickSize() gibt den Wert 0 zurück. Mit anderen Worten: Die Prüfung schlägt fehl, und die weitere Bearbeitung des Auftrags wird eingestellt. Bitte klären Sie"debug in function Name(string symbol) what's going on", ich verstehe diese Formulierung nicht ganz. Was sollte ich hinzufügen und wo?

 
Aleksey Mavrin:

Um zu klären - wie Sie sagen, Sie ändern die Koordinaten in OnTick, und behaupten, dass in der Tat die Tasten auf der NEXT Tick bewegen. Der nächste Tick von dem, bei dem du die Koordinaten geändert hast, oder der von Weihnachten?

Ich denke, die Sequenz ist wie folgt: ein neuer Tick kommt herein, ich ändere die Panelkoordinaten, der Panelhintergrund beginnt sich an die gewünschte Stelle zu bewegen, die Schaltflächen stehen zu diesem Zeitpunkt still, ein neuer Tick kommt herein und die Schaltflächen folgen dem Panel an die gewünschte Stelle. Ist es möglich, direkt aus der Krippe heraus Zecken zu erzeugen?
 
Mikhail:

In diesem Stadium passiert nichts, denn wie ich bereits oben geschrieben habe, gibt die Funktion asymbol.Name() aus irgendeinem Grund nicht das Symbol der offenen Order zurück, die Funktion aorder.Magic() gibt den Wert 0 zurück (obwohl meine Magic 121345 ist), die Funktion asymbol.TickSize() gibt den Wert 0 zurück. Mit anderen Worten: Die Prüfung schlägt fehl, und die weitere Bearbeitung des Auftrags wird eingestellt. Bitte klären Sie"debug in function Name(string symbol) what's going on", ich verstehe diese Formulierung nicht ganz. Was sollte ich hinzufügen und wo?

Der Fehler im Auftragsindex / Ticket könnte ein Fehler sein, der nach der magischen 0 beurteilt wird. Im Moment des Zugriffs auf die Auftragsstruktur werden dort Daten der falschen Reihenfolge geschrieben. In der Auswahlschleife kann es vorkommen, dass die nächste Nummer im letzten Auftragssatz steht und nicht die, die Sie benötigen. Die Daten der letzten Auftragsselektion werden aus der Auftragsstruktur zurückgegeben.

 
Mikhail:
ganz oben in meinem Code stehen die Zeilen

Ist dies eine Initialisierung? Beim Kompilieren erhalte ich die folgenden Informationen

'Trade panel.mq5' Trade panel.mq5 1 1

Handel.mqh' Handel.mqh 1 1

Object.mqh' Object.mqh 1 1

'StdLibErr.mqh' StdLibErr.mqh 1 1

'OrderInfo.mqh' OrderInfo.mqh 1 1

HistoryOrderInfo.mqh' HistoryOrderInfo.mqh 1 1

PositionInfo.mqh' PositionInfo.mqh 1 1

'DealInfo.mqh' DealInfo.mqh 1 1

'SymbolInfo.mqh' SymbolInfo.mqh 1 1

erzeugter Code 1 1

0 Fehler, 0 Warnungen, 3192 msec verstrichen 1 1

Nachdem ich einen Kauf-Stopp-Auftrag eröffnet habe, berechne ich alle Aufträge neu, wähle einen offenen Auftrag aus und prüfe, ob das Symbol und die Majdic-Nummer übereinstimmen:

In diesem Stadium passiert nichts, wie ich oben geschrieben habe. asymbol.Name() gibt aus irgendeinem Grund nicht das Symbol der offenen Order zurück, aorder.Magic() gibt den Wert 0 zurück (obwohl meine magische Zahl 121345 ist), asymbol.TickSize() gibt den Wert 0 zurück. Mit anderen Worten: Die Prüfung schlägt fehl und die weitere Bearbeitung des Auftrags wird gestoppt. Bitte klären Sie"debug in function Name(string symbol) what's going on", ich verstehe diese Formulierung nicht ganz. Was sollte ich hinzufügen und wo?

Mensch, warum benutzt du etwas, das du nicht verstehst (was, wenn es ein Koffer ist?). )

Und Sie machen sich nicht einmal die Mühe zu lesen, was geschrieben steht

Wenn Sie asymbol.Name(Symbol()) nicht haben, fügen Sie es hinzu.

s.w. Ich wollte mehr über die Initialisierung erklären, aber das wäre wohl auch sinnlos
 
Valeriy Yastremskiy:

Es kann ein Fehler im Auftragsindex / Ticket nach magic 0 vorliegen. Im Moment des Verweises auf die Auftragsstruktur sind dort die Daten des falschen Auftrags gespeichert. Im Selektionszyklus kann es vorkommen, dass die nächste Nummer zum letzten Auftragssatz geht, aber nicht zu dem, den Sie benötigen. Die Daten der letzten Auftragsselektion werden aus der Auftragsstruktur zurückgegeben.

Ich habe immer noch nicht herausgefunden, warum diese Störung auftritt. Schließlich nahm ich den Code, der für die Erstellung des Panels mit Schaltflächen verantwortlich ist, und schrieb ihn in den EA um, wo derselbe Code ordnungsgemäß funktioniert und alles funktionierte. Wie auch immer, vielen Dank!
 

Guten Tag!

Helfen Sie mir, ein einfaches Problem zu lösen.

Lückenzähler. Ich möchte Lücken zählen, die mehr als 10 Punkte betragen.

int start()
{
int gap=0;
int r=MathAbs(Close[2]-Open[1])/Point;
if (r>=10)
{
gap=gap+1;
}
Comment("ГЭП!========: ",gap,"\n",
        "ВЕЛИЧИНА ГЭПА==: ",r,"\n");
return(0);

Die Variable "Lücke" wird auf Null zurückgesetzt. Ich verstehe nicht, warum. Ich habe schon alles versucht. Ich habe es mit Schleifen und Statik versucht - es funktioniert nicht. Ich vermute, ich habe die Schleifen falsch geschrieben.

 
Alexey Belyakov:

Guten Tag!

Helfen Sie mir, ein einfaches Problem zu lösen.

Lückenzähler. Ich möchte Lücken zählen, die mehr als 10 Punkte betragen.

Die Variable "Lücke" wird auf Null zurückgesetzt. Ich verstehe nicht, warum. Ich habe schon alles versucht. Ich habe es mit Schleifen und Statik versucht - es funktioniert nicht. Ich vermute, ich habe die Schleifen falsch geschrieben.

Die Variable gap liegt im Bereich der Funktion start - und wird bei jedem neuen Tick mit Null neu initialisiert

 
Alexey Belyakov:

Guten Tag!

Helfen Sie mir, ein einfaches Problem zu lösen.

Lückenzähler. Ich möchte Lücken zählen, die mehr als 10 Punkte betragen.

Die Variable "Lücke" wird auf Null zurückgesetzt. Ich verstehe nicht, warum. Ich habe schon alles versucht. Ich habe es mit Schleifen und Statik versucht - es funktioniert nicht. Ich vermute, ich habe die Schleifen falsch geschrieben.

int gap=0;
int start()
{
int r=MathAbs(Close[2]-Open[1])/Point;
if (r>=10)
{
gap++;
}
Comment("ГЭП!========: ",gap,"\n",
        "ВЕЛИЧИНА ГЭПА==: ",r,"\n");
return(0);
int start()
{
static int gap=0;
int r=MathAbs(Close[2]-Open[1])/Point;
if (r>=10)
{
gap=gap+1;
}
Comment("ГЭП!========: ",gap,"\n",
        "ВЕЛИЧИНА ГЭПА==: ",r,"\n");
return(0);