Fehler, Irrtümer, Fragen - Seite 195

 
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).

 
Interesting:

Dieser Code löst den Timer nicht aus

Aber dieser hier schon.

In meinem Fall hat es nicht funktioniert.
 
Erm955:

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).

 

Wo ist der Code 10005 geblieben und was bedeutet er?

Etwas zwischen einer Rückmeldung (10004) und "Anfrage abgelehnt" (10006)?

2010.11.13 23:44:14     Core 1  2010.11.11 22:00:30   CTrade::PositionOpen: instant sell 0.10 #IBM at 145.38 [unknown retcode 10005]
2010.11.13 23:44:14     Core 1  2010.11.11 22:00:30   prices for #IBM 0.10 (145.38 / 145.41 / 145.38)
2010.11.13 23:44:14     Core 1  2010.11.11 22:00:30   CTrade::PositionOpen: instant buy 0.10 #IBM at 145.41 [unknown retcode 10005]
2010.11.13 23:44:14     Core 1  2010.11.11 22:00:30   prices for #IBM 0.10 (145.38 / 145.41 / 145.38)
 

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.

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

class tick{
   public:
      MqlTick  data;             //новые тиковые данные
      bool     refresh();        //метод обновления тиковых данных с проверкой на поступление новых данных
      void     write();          //запись тиковых данных в файл
.........

void tick::write(void){
   if (file_handle>0)FileWrite(file_handle,data.bid);
}

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;

 
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
 
IgorM:

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):

//+------------------------------------------------------------------+
//|                                         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);
   else Print("Не удалось записать данные в файл. Ошибка ",GetLastError());
  }

Tick tick;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(tick.refresh()) tick.write();

  }
//+------------------------------------------------------------------+

 

Документация по MQL5: Файловые операции / FileWriteArray
Документация по MQL5: Файловые операции / FileWriteArray
  • www.mql5.com
Файловые операции / FileWriteArray - Документация по MQL5
 
Rosh:

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

Dateien: