Erreurs, bugs, questions - page 195

 
Interesting:
Il est fort probable qu'ils le soient. J'ai aussi la moitié de mon code lié à un timer, maintenant je dois attendre une nouvelle construction ou trouver des béquilles :(

Exactement, je viens de remplacer OnTimer par OnTick et tout s'est passé comme avant, mais l'optimisation par les cœurs est effectuée un par un, et non simultanément. Il me semble que les développeurs corrigeront rapidement (je l'espère) des erreurs aussi évidentes.

 
Interesting:

Ce code ne déclenche pas la minuterie

Mais celui-là, oui.

Cela n'a pas fonctionné dans mon cas.
 
Erm955:

Exactement, je viens de remplacer OnTimer par OnTick et tout s'est passé comme avant, mais l'optimisation par les cœurs est effectuée un par un, et non simultanément. Il me semble que les développeurs corrigeront rapidement (je l'espère) des erreurs aussi évidentes.

Je pensais également que les bogues évidents (travail de testeur) sur les événements personnalisés seraient corrigés rapidement. Je dois toujours utiliser des béquilles... :(
Valmars:
Dans mon cas, ça n'a pas aidé.

Il doit y avoir des particularités.

Je l'ai essayé sur Win 2003 Server SP2 x32 (AMD 2600+, un cœur). Et je peux dire que cela a été fait sur un conseiller expert "vide". Seules deux variables et quelques fonctions ont été ajoutées (celles définissant l'état du timer et la capture du premier démarrage).

 

Où est passé le code 10005 et qu'est-ce qu'il signifie ?

Quelque chose entre une requote (10004) et une "demande rejetée" (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)
 

Dans la discussion sur le championnat 2010 https://championship.mql5.com/2010/ru/users/capr, un participant a posté son code EA. J'ai essayé de le compiler (build 355). Les résultats de la compilation font apparaître plusieurs avertissements. Je suis intéressé par le fragment suivant. Il y a un tel fragment dans le 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;
     }
//---
  }

De deux constructions de même type if(ticket= ... le compilateur génère l'avertissement "expression is not boolean" uniquement pour le dernier (c'est-à-dire qu'il "masque" un avertissement précédent similaire). Si vous commentez l'instruction if dans l'avertissement (dans le but de vérifier le compilateur !), l'avertissement est généré pour une construction similaire qui n'a pas été modifiée mais qui était absente du protocole lors de la compilation précédente.

Est-ce une fonctionnalité ou un bug ?

 

Erreurs, MetaTrader 5 MQL, Ouvert, Démarré : 2010.11.06 11:32, #25823

Donnez-moi une réponse

 

Je ne sais pas si c'est censé être comme ça, mais quand on écrit dans un fichier

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

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

J'obtiens parfois des prix non normalisés :

81.42
81.41
81.41
81.40000000000001
81.40000000000001
81.40000000000001
81.40000000000001
81.41
81.40000000000001
81.41
81.41

Pourquoi ?

et pour une raison quelconque, il n'a pas pu écrire dans le fichier en utilisant FileWriteStruct( file_handle,data, sizeof(data)) ;

 
Tout semble être clair au sujet du prix non normalisé : je ne l'ai pas vu pour les événements majeurs (jusqu'à présent), pour les croisements - pour certains événements rarement, et pour d'autres plus souvent - cela signifie que le terminal me donne de telles données
 
IgorM:

et, pour une raison quelconque, n'a pas pu écrire dans le fichier en utilisant FileWriteStruct( file_handle,data, sizeof(data)) ;

Je dois écrire dans un fichier binaire - https://www.mql5.com/ru/docs/files/filewritearray

FileWriteArray

Écrit des tableaux de tout type dans un fichier de type BIN, à l'exception des tableaux de chaînes de caractères (peut être un tableau de structures ne contenant pas de chaînes de caractères et des tableaux dynamiques).

intFileWriteArray(
intfile_handle,//manipulateur de fichier
voidarray[],// tableau
intstart_item=0,// indice initial dans le tableau
intitems_count=WHOLE_ARRAY// nombre d'éléments
) ;

Par exemple (le code doit être mis à jour pour éviter d'écraser les enregistrements existants) :

//+------------------------------------------------------------------+
//|                                         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:

Vous devez écrire dans un fichier binaire - https://www.mql5.com/ru/docs/files/filewritearray

Par exemple (le code doit être amélioré, afin qu'il n'écrase pas les enregistrements déjà existants) :

OK, merci beaucoup, j'écrivais juste dans un fichier texte pour tester, je commençais à douter que MqlTick soit essentiellement une structure :)

ZS : pas mal - j'ai essentiellement restauré ma classe et mon code ;) - Je suis désolé que vous ne souhaitiez pas créer vos propres graphiques hors ligne dans MT5 - j'écris pour MT4+MT5, je suis devenu accro aux délais non standard.

Dossiers :