Interesting: Höchstwahrscheinlich sind sie das. Ich habe die Hälfte meines Codes auch an einen Timer gebunden, jetzt muss ich auf ein neues Build warten oder mir Krücken einfallen lassen :(
Genau, änderte gerade OnTimer zu OnTick und alles ging wie zuvor, aber die Optimierung durch Kerne wird einer nach dem anderen durchgeführt, nicht gleichzeitig. Ich habe den Eindruck, dass die Entwickler solche offensichtlichen Fehler schnell beheben werden (hoffe ich).
Genau, änderte gerade OnTimer zu OnTick und alles ging wie zuvor, aber die Optimierung durch Kerne wird einer nach dem anderen durchgeführt, nicht gleichzeitig. Ich habe den Eindruck, dass die Entwickler solche offensichtlichen Fehler schnell beheben werden (hoffe ich).
Ich dachte auch, dass offensichtliche Fehler (Arbeit der Tester) bei benutzerdefinierten Ereignissen schnell behoben werden würden. Muss immer noch Krücken benutzen... :(
Valmars: In meinem Fall hat es nicht geholfen.
Es muss einige Besonderheiten geben.
Ich habe es auf Win 2003 Server SP2 x32 (AMD 2600+, ein Kern) ausprobiert. Und ich kann sagen, dass es mit einem "leeren" Expert Advisor gemacht wurde. Es wurden nur zwei Variablen und einige Funktionen hinzugefügt (die den Status des Timers definieren und den ersten Start abfangen).
In der Championship 2010-Diskussion https://championship.mql5.com/2010/ru/users/capr hat ein Teilnehmer seinen EA-Code gepostet. Ich habe versucht, es zu kompilieren (Build 355). Die Kompilierungsergebnisse enthalten mehrere Warnungen. Ich interessiere mich für das folgende Fragment. Es gibt ein solches Fragment im Code:
void CountOrderStop(string symbol)
{
datetime from=0;
datetime to=TimeCurrent();
//--- запросить всю историюHistorySelect(from,to);
//--- переменные для получения значений из свойств ордераulong ticket;
double open_price;
double initial_volume;
datetime time_setup;
// string symbol;string type;
long order_magic;
count_sell_stop=0;
count_buy_stop=0;
//--- количество текущих отложенных ордеровuint total=OrdersTotal();
//--- пройдем в цикле по всем ордерамfor(uint i=0;i<total;i++)
{
//--- получим тикет ордера по его позиции в спискеif(ticket=OrderGetTicket(i) && (GetOrderType(OrderGetInteger(ORDER_TYPE))=="buy stop limit" || GetOrderType(OrderGetInteger(ORDER_TYPE))=="buy stop" || GetOrderType(OrderGetInteger(ORDER_TYPE))=="buy limit") && OrderGetString(ORDER_SYMBOL)==symbol)
{
//--- получим свойства ордера
open_price= OrderGetDouble(ORDER_PRICE_OPEN);
time_setup= OrderGetInteger(ORDER_TIME_SETUP);
symbol= OrderGetString(ORDER_SYMBOL);
order_magic= OrderGetInteger(ORDER_MAGIC);
int positionID = OrderGetInteger(ORDER_POSITION_ID);
initial_volume= OrderGetDouble(ORDER_VOLUME_INITIAL);
type=GetOrderType(OrderGetInteger(ORDER_TYPE));
count_buy_stop=count_buy_stop+1;
}
if(ticket=OrderGetTicket(i) && (GetOrderType(OrderGetInteger(ORDER_TYPE))=="sell stop limit" || GetOrderType(OrderGetInteger(ORDER_TYPE))=="sell limit" || GetOrderType(OrderGetInteger(ORDER_TYPE))=="sell stop") && OrderGetString(ORDER_SYMBOL)==symbol)
{
//--- получим свойства ордера
open_price= OrderGetDouble(ORDER_PRICE_OPEN);
time_setup= OrderGetInteger(ORDER_TIME_SETUP);
symbol= OrderGetString(ORDER_SYMBOL);
order_magic= OrderGetInteger(ORDER_MAGIC);
int positionID = OrderGetInteger(ORDER_POSITION_ID);
initial_volume= OrderGetDouble(ORDER_VOLUME_INITIAL);
type=GetOrderType(OrderGetInteger(ORDER_TYPE));
count_sell_stop=count_sell_stop+1;
}
count_order = count_buy_stop + count_sell_stop;
}
//---
}
Von zwei Konstruktionen desselben Typs if(ticket= ... der Compiler erzeugt die Warnung "Ausdruck ist nicht boolesch" nur für die letzte (d.h. er "maskiert" eine vorherige ähnliche Warnung). Wenn Sie die if-Anweisung in der Warnung auskommentieren (zur Überprüfung des Compilers!), wird die Warnung für ein ähnliches Konstrukt erzeugt, das nicht geändert wurde, aber bei der vorherigen Kompilierung im Protokoll fehlte.
class tick{
public:
MqlTick data; //новые тиковые данныеbool refresh(); //метод обновления тиковых данных с проверкой на поступление новых данныхvoid write(); //запись тиковых данных в файл
.........
void tick::write(void){
if (file_handle>0)FileWrite(file_handle,data.bid);
}
Alles scheint klar zu sein, über die nicht-normalisierten Preis: Ich habe nicht gesehen, es für die wichtigsten Ereignisse (so weit), für Kreuze - für einige Ereignisse selten, und für andere mehr oft - es bedeutet, dass das Terminal gibt mir solche Daten
Schreibt Arrays beliebigen Typs in eine Datei des Typs BIN, mit Ausnahme von String-Arrays (kann ein Array von Strukturen sein, die keine Strings enthalten, sowie dynamische Arrays).
intFileWriteArray( intfile_handle,//Datei-Handle voidarray[],// array intstart_item=0,// Anfangsindex im Array intitems_count=WHOLE_ARRAY// Anzahl der Elemente );
Zum Beispiel (der Code sollte aktualisiert werden, um das Überschreiben bestehender Datensätze zu vermeiden):
//+------------------------------------------------------------------+//| Test_FileWriteStruct.mq5 |//| Copyright 2010, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright "Copyright 2010, MetaQuotes Software Corp."#property link "http://www.mql5.com"#property version "1.00"//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+class Tick
{
private:
int m_file_handle;
public:
MqlTick data; //новые тиковые данныеvoid Tick(){m_file_handle=FileOpen("tickrecords.dat",FILE_READ|FILE_WRITE|FILE_BIN);};
void ~Tick(){if(m_file_handle!=INVALID_HANDLE) FileClose(m_file_handle);};
bool refresh(); //метод обновления тиковых данных с проверкой на поступление новых данныхvoid write(); //запись тиковых данных в файл
};
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+bool Tick::refresh(void)
{
bool res=SymbolInfoTick(Symbol(),data);
if(!res) Print("Неудачный вызов SymbolInfoTick(), ошибка ",GetLastError());
return(res);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+void Tick::write(void)
{
if(m_file_handle!=INVALID_HANDLE)FileWriteStruct(m_file_handle,data,size);
elsePrint("Не удалось записать данные в файл. Ошибка ",GetLastError());
}
Tick tick;
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---if(tick.refresh()) tick.write();
}
//+------------------------------------------------------------------+
Zum Beispiel (der Code muss verbessert werden, damit er nicht bereits vorhandene Datensätze überschreibt):
OK, vielen Dank, ich war gerade in eine Textdatei zum Testen schreiben, ich war Anfang zu bezweifeln, wie MqlTick ist im Wesentlichen eine Struktur :)
ZS: nicht schlecht - habe im Grunde meine Klasse und meinen Code wiederhergestellt ;) - es tut mir leid, dass Sie keine eigenen Offline-Charts in MT5 erstellen wollen - ich schreibe für MT4+MT5, ich bin süchtig nach nicht standardisierten TF
Höchstwahrscheinlich sind sie das. Ich habe die Hälfte meines Codes auch an einen Timer gebunden, jetzt muss ich auf ein neues Build warten oder mir Krücken einfallen lassen :(
Genau, änderte gerade OnTimer zu OnTick und alles ging wie zuvor, aber die Optimierung durch Kerne wird einer nach dem anderen durchgeführt, nicht gleichzeitig. Ich habe den Eindruck, dass die Entwickler solche offensichtlichen Fehler schnell beheben werden (hoffe ich).
Dieser Code löst den Timer nicht aus
Aber dieser hier schon.
Genau, änderte gerade OnTimer zu OnTick und alles ging wie zuvor, aber die Optimierung durch Kerne wird einer nach dem anderen durchgeführt, nicht gleichzeitig. Ich habe den Eindruck, dass die Entwickler solche offensichtlichen Fehler schnell beheben werden (hoffe ich).
In meinem Fall hat es nicht geholfen.
Es muss einige Besonderheiten geben.
Ich habe es auf Win 2003 Server SP2 x32 (AMD 2600+, ein Kern) ausprobiert. Und ich kann sagen, dass es mit einem "leeren" Expert Advisor gemacht wurde. Es wurden nur zwei Variablen und einige Funktionen hinzugefügt (die den Status des Timers definieren und den ersten Start abfangen).
Wo ist der Code 10005 geblieben und was bedeutet er?
Etwas zwischen einer Rückmeldung (10004) und "Anfrage abgelehnt" (10006)?
In der Championship 2010-Diskussion https://championship.mql5.com/2010/ru/users/capr hat ein Teilnehmer seinen EA-Code gepostet. Ich habe versucht, es zu kompilieren (Build 355). Die Kompilierungsergebnisse enthalten mehrere Warnungen. Ich interessiere mich für das folgende Fragment. Es gibt ein solches Fragment im Code:
Von zwei Konstruktionen desselben Typs if(ticket= ... der Compiler erzeugt die Warnung "Ausdruck ist nicht boolesch" nur für die letzte (d.h. er "maskiert" eine vorherige ähnliche Warnung). Wenn Sie die if-Anweisung in der Warnung auskommentieren (zur Überprüfung des Compilers!), wird die Warnung für ein ähnliches Konstrukt erzeugt, das nicht geändert wurde, aber bei der vorherigen Kompilierung im Protokoll fehlte.
Ist dies eine Funktion oder ein Fehler?
Fehler, MetaTrader 5 MQL, Eröffnet, Gestartet: 2010.11.06 11:32, #25823
Geben Sie mir eine Antwort
Ich weiß nicht, ob das so gewollt ist, aber beim Schreiben in eine Datei
Ich erhalte manchmal nicht normalisierte Preise:
81.42
81.41
81.41
81.40000000000001
81.40000000000001
81.40000000000001
81.40000000000001
81.41
81.40000000000001
81.41
81.41
Warum?
und konnte aus irgendeinem Grund nicht mit FileWriteStruct( file_handle,data, sizeof(data)) in die Datei schreiben;
und konnte aus irgendeinem Grund nicht mit FileWriteStruct( file_handle,data, sizeof(data)) in die Datei schreiben;
Ich muss in eine Binärdatei schreiben - https://www.mql5.com/ru/docs/files/filewritearray
FileWriteArray
Schreibt Arrays beliebigen Typs in eine Datei des Typs BIN, mit Ausnahme von String-Arrays (kann ein Array von Strukturen sein, die keine Strings enthalten, sowie dynamische Arrays).
intFileWriteArray(
intfile_handle,//Datei-Handle
voidarray[],// array
intstart_item=0,// Anfangsindex im Array
intitems_count=WHOLE_ARRAY// Anzahl der Elemente
);
Zum Beispiel (der Code sollte aktualisiert werden, um das Überschreiben bestehender Datensätze zu vermeiden):
Sie müssen in eine Binärdatei schreiben - https://www.mql5.com/ru/docs/files/filewritearray
Zum Beispiel (der Code muss verbessert werden, damit er nicht bereits vorhandene Datensätze überschreibt):
OK, vielen Dank, ich war gerade in eine Textdatei zum Testen schreiben, ich war Anfang zu bezweifeln, wie MqlTick ist im Wesentlichen eine Struktur :)
ZS: nicht schlecht - habe im Grunde meine Klasse und meinen Code wiederhergestellt ;) - es tut mir leid, dass Sie keine eigenen Offline-Charts in MT5 erstellen wollen - ich schreibe für MT4+MT5, ich bin süchtig nach nicht standardisierten TF