Erreurs, bugs, questions - page 1930

 
Les fonctions PositionGet sont très lentes dans le testeur. À des fins de démonstration, le conseiller expert suivant a été écrit
// #include <TesterBench.mqh> // https://www.mql5.com/ru/code/18804/

input int Interval = 3600;
input double Lots = 1;

void OnTick()
{
  if (!PositionSelect(_Symbol))
  {
    if (HistorySelect(0, TimeCurrent()))
    {
      const int Total = HistoryDealsTotal() - 1;

      MqlTradeRequest Request = {0};
      MqlTradeCheckResult CheckResult;
  
      Request.action = TRADE_ACTION_DEAL;
  
      Request.symbol = _Symbol;
      Request.type = ((Total >= 0) && ((ENUM_DEAL_TYPE)HistoryDealGetInteger(HistoryDealGetTicket(Total), DEAL_TYPE) == DEAL_TYPE_SELL)) ?
                     ORDER_TYPE_SELL : ORDER_TYPE_BUY;;
  
      Request.volume = Lots;
      Request.price = SymbolInfoDouble(Request.symbol, (Request.type == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID);

      if (OrderCheck(Request, CheckResult))
      {
        MqlTradeResult Result;

        const bool AntiWarning = OrderSend(Request, Result);            
      }
    }
  }
  else
  {
    // Если раскоментировать эти строки, одиночный прогон станет на 20% медленнее.
//    string Symbol = ::PositionGetString(POSITION_SYMBOL);
//    string Comment = ::PositionGetString(POSITION_COMMENT);

    if (TimeCurrent() - PositionGetInteger(POSITION_TIME) >= Interval)      
    {
      MqlTradeRequest Request = {0};
      MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_DEAL;
      Request.position = PositionGetInteger(POSITION_TICKET);
  
      Request.symbol = PositionGetString(POSITION_SYMBOL);
      Request.type = (ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE));
  
      Request.volume = PositionGetDouble(POSITION_VOLUME);
      Request.price = PositionGetDouble(POSITION_PRICE_CURRENT);
          
      const bool AntiWarning = OrderSend(Request, Result);
    }
  }
}


Résultat d'un seul passage avec les lignes jaunes commentées

Core 1  2017.07.17 23:59:58   Interval = 7.09 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.857. Test passed in 0:00:09.720 (including ticks preprocessing 0:00:01.950).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:10.577 (including 0:00:00.857 for history data synchronization)


Résultat d'un seul passage avec des lignes jaunes NON commentées

Core 1  2017.07.17 23:59:58   Interval = 9.336 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.062. Test passed in 0:00:11.997 (including ticks preprocessing 0:00:01.934).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:12.059 (including 0:00:00.062 for history data synchronization)


Labibliothèque TesterBench présente la même baisse du temps d'exécution.


HH Non seulement PositionGet, mais aussi OrderGet, HistoryDealGet, HistoryOrderGet sont lents.

 

Dans le testeur (1629), les transactions sont ouvertes à des prix nuls.

Exécution du conseiller expert dans le testeur en utilisant les ticks réels du serveur FIBOGroup-MT5


 

Question pour les développeurs et les collègues intéressés.

Dans Tester en mode visualisation il y a un objet de la classe CiMA - muwings.

Mode = "Every tick based on real ticks". La vitesse dans le Visualiseur est proche du maximum.

Le problème est le suivant. Lorsqu'une nouvelle barre apparaît, vous devez attendre un tas de nouveaux ticks pour rafraîchir les valeurs des muwings CiMA, ou plutôt les valeurs dans le tampon des muwings.

Et à chaque tick, la mise à jour est accélérée par la méthode CiMA::Refresh(-1).

Pourquoi le Testeur fonctionne-t-il si mal ?

Pas de tels problèmes dans le commerce réel.

 

Pusha est étrange ces jours-ci :

uest/302788

demande/302788

Comme je peux le deviner, c'est moi qui ai été rabaissé comme candidat et commenté sur le même ordre.

Mais les messages sont les mêmes que pour les codeurs).

 

Extrait de la documentation

ENUM_BASE_CORNER

Identifiant

Description

COIN_GAUCHE_SUPÉRIEUR

Centre des coordonnées dans le coin supérieur gauche du graphique

COIN_GAUCHE_INFÉRIEUR

Centre des coordonnées dans le coin inférieur gauche du graphique

COIN_DROIT_INFÉRIEUR

Centre des coordonnées dans le coin inférieur droit du graphique

COIN_DROIT_SUPÉRIEUR

centre des coordonnées dans le coin supérieur droit du graphique

Question : Pourquoi le tableau ne pourrait-il pas être dessiné dans l'ordre numérique ? Vous mettez 1 - et au lieu de l'attendu"Centre de coordonnées dans le coin supérieur gauche du graphique" vous obtenez"Centre de coordonnées dans le coin inférieur droit du graphique".

Maintenant, cela ressemble à ceci

1 - Centre de coordonnées dans le coin inférieur gauche de la carte.
2 - Centre de coordonnées dans le coin inférieur droit du graphique
3 - Centre de coordonnées dans le coin supérieur droit du graphique
4 - Centre de coordonnées dans le coin supérieur gauche du graphique

 
Aleksey Vyazmikin:

Extrait de la documentation

ENUM_BASE_CORNER

Identifiant

Description

COIN_GAUCHE_SUPÉRIEUR

Centre des coordonnées dans le coin supérieur gauche du graphique

COIN_GAUCHE_INFÉRIEUR

Centre des coordonnées dans le coin inférieur gauche du graphique

COIN_DROIT_INFÉRIEUR

Centre des coordonnées dans le coin inférieur droit du graphique

COIN_DROIT_SUPÉRIEUR

centre des coordonnées dans le coin supérieur droit du graphique

Question : Pourquoi le tableau ne pourrait-il pas être dans l'ordre numérique ? Vous mettez 1 - et au lieu de l'attendu"Centre de coordonnées dans le coin supérieur gauche du graphique" vous obtenez"Centre de coordonnées dans le coin inférieur droit du graphique".

Cela ressemble à ceci

1 - Centre de coordonnées dans le coin inférieur gauche de la carte.
2 - Centre de coordonnées dans le coin inférieur droit du graphique
3 - Centre de coordonnées dans le coin supérieur droit du graphique
4 - Centre de coordonnées dans le coin supérieur gauche du graphique

Le comptage commence à zéro.

Qu'est-ce qui vous empêche d'entrer CORNER_LEFT_UPPER au lieu d'un nombre ? C'est à cela que sert l'énumération, pour que vous n'ayez pas à penser aux chiffres.

 

Dans le service d'assistance

MT4 :

Pour les objets de taille fixe : les propriétés OBJ_BUTTON, OBJ_RECTANGLE_LABEL et OBJ_EDIT OBJPROP_XDISTANCE et OBJPROP_YDISTANCE définissent la position du point supérieur gauche de l'objet par rapport au coin du graphique (OBJPROP_CORNER), à partir duquel les coordonnées X et Y en pixels seront comptées.


MT5 :

Pour les objets de taille fixe : OBJ_BUTTON, OBJ_RECTANGLE_LABEL, OBJ_EDIT et OBJ_CHART, les propriétés OBJPROP_XDISTANCE et OBJPROP_YDISTANCE définissent la position du point supérieur gauche de l'objet par rapport au coin du graphique (OBJPROP_CORNER), à partir duquel les coordonnées X et Y en pixels seront mesurées.

Le problème est que l'ancien code de MT4 utilisant ObjectSet permet de positionner les objets par rapport à leurs bords (coins) - pour les objets dans la partie gauche le calcul des pixels est effectué à partir du premier symbole, pour les objets dans la partie droite - à partir du dernier symbole, tandis que la nouvelle version calcule toujours l'indentation à partir du premier symbole, ce qui rend le positionnement des étiquettes avec du texte difficile, parce que vous ne savez pas toujours combien de symboles de texte seront. Je demande aux développeurs d'ajouter un choix de méthode d'alignement du texte !

//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Старый вариант              |
//+------------------------------------------------------------------+

void Label_MQL4(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner)
  {
   ObjectDelete(_name);
   ObjectCreate(_name,OBJ_LABEL,_window,0,0);
   ObjectSet(_name,OBJPROP_CORNER,corner);
   ObjectSet(_name,OBJPROP_XDISTANCE,_x);
   ObjectSet(_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
  }
  
//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Новый вариант               |
//+------------------------------------------------------------------+
void Label_MQL5(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner)
  {
   //corner=4;
   ObjectDelete(0,_name);
   ObjectCreate(0,_name,OBJ_LABEL,_window,0,0);
   ObjectSetInteger(0,_name,OBJPROP_CORNER,corner);
   ObjectSetInteger(0,_name,OBJPROP_XDISTANCE,_x);
   ObjectSetInteger(0,_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
  }  


Si quelqu'un sait comment obtenir un alignement à gauche et à droite dans MT5, merci de partager la fonctionnalité appropriée !

 
Artyom Trishkin:

Le comptage commence à zéro.

Qu'est-ce qui vous empêche d'entrer CORNER_LEFT_UPPER au lieu d'un nombre ? C'est à cela que sert l'énumération, pour que vous n'ayez pas à penser aux chiffres.

De zéro ? Bon, d'accord - laissez-le partir de zéro - je ne l'ai pas pris en compte - mais ça ne marche toujours pas !

Parce que c'est plus logique pour moi et que je l'ai déjà utilisé auparavant.

 
Aleksey Vyazmikin:

À partir de zéro ? Bon, OK - même si c'est à partir de zéro - je n'en ai pas tenu compte - mais ça ne marche toujours pas !

Parce que c'est plus logique pour moi et que je l'ai déjà utilisé auparavant...

Dois-je avancer le point de la liste que vous essayez d'identifier avec le numéro 4, qui n'est pas là ? Il devient zéro - et tout est en place.

 

C'est toujours mieux le matin... :)