Questions d'un "mannequin - page 262

 
agvozdezkiy:

Je viens de commencer à apprendre MQL, et ici j'ai écrit un EA qui dessine un iMA et dessine une tangente (très proche) au graphique dans le iMA au point où le pointeur de la souris est sur l'axe du temps.

Premier problème. Le conseiller expert est TRÈS lent. Cela signifie que la tangente est redessinée pendant un long moment et qu'elle ne suit pas le mouvement de la souris...

Regardez ma version :

//+------------------------------------------------------------------+
//|                                                Antonio_Mouse.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
int Handle_iMA;
double Buffer_iMA[];
string Name_iMA;
datetime TimeArray[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---Устанавливаем свойство графика посылать события при движении мышы     
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---Рисуем индикатор iMA
   Handle_iMA=iMA(NULL,0,10,0,MODE_SMA,PRICE_CLOSE);
   if(Handle_iMA!=INVALID_HANDLE)
     {
      ChartIndicatorAdd(0,0,Handle_iMA);
      Print("iMA скопировано в буффер.");
     }
//---
   string name="Line";
   ObjectCreate(0,name,OBJ_TREND,0,0,0);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clrRed);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,10);
   ObjectSetInteger(0,name,OBJPROP_BACK,true);
   ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,false);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(Handle_iMA);
  }
datetime CarrentBarTime[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
  }
double PriceCoord,Angle;
datetime TimeCoord;
int SubWindow,BarPos,X1,Y1,X2,Y2;
int prevX=-1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &XCoord,
                  const double &YCoord,
                  const string &SParam)
  {
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      int x=(int)XCoord;
      int y=(int)YCoord;
      if(x==prevX) return;
      CopyTime(NULL,0,0,1,CarrentBarTime);
      //---
      ChartXYToTimePrice(NULL,x,y,SubWindow,TimeCoord,PriceCoord);
      if(TimeCoord>CarrentBarTime[0]) return;
      CopyBuffer(Handle_iMA,0,TimeCoord+PeriodSeconds(),2,Buffer_iMA);
      //---
      string name="Line";
      ObjectSetDouble(0,name,OBJPROP_PRICE,0,Buffer_iMA[0]);
      ObjectSetInteger(0,name,OBJPROP_TIME,0,TimeCoord);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,Buffer_iMA[1]);
      ObjectSetInteger(0,name,OBJPROP_TIME,1,TimeCoord+PeriodSeconds());
      //---
      ChartRedraw();
      prevX=x;
     }
  }

Sur mon ordinateur portable - tout vole !

 

J'obtiens l'erreur 5040 (Corrupted parameter of type string) la première fois que j'appelle la fonction de création d'objet.

void  CreateTL(string name,datetime time1,double price1,datetime time2,double price2,bool ray_left,bool ray_right,color color_TL)
  {
//------------ nTL,nTLh,nTLl,nTLe
   nTL="nTL_"+IntegerToString(MathRand());
   nTLh="nTLh_"+IntegerToString(MathRand());
   nTLl="nTLl_"+IntegerToString(MathRand());
   nTLe="nTLe_"+IntegerToString(MathRand());
//------------
   ObjectCreate(0,name,OBJ_TREND,0,time1,price1,time2,price2);
   ObjectSetInteger(0,name,OBJPROP_COLOR,color_TL);
   ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray_left);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray_right);
   ObjectSetInteger(0,name,OBJPROP_BACK,true);
  };

Si avant un appel fixé

nTL="";

erreur 4002 (paramètre non valide lors de l'appel interne de la fonction du terminal client)

Si elle est définie avant l'appel

nTL="a";

le premier objet sera nommé a.

Je l'appelle comme ça

if(hlp_var==high_low)
     {
      //CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color);
      CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color);
      CreateTL(nTLe,dt[1],pr[0],dt[1],pr[1],false,false,nTL_color);
      CreateTL(nTLh,dt[0],pr[0],dt[1],pr[0],false,true,nTL_color);
      CreateTL(nTLl,dt[0],pr[1],dt[1],pr[1],false,true,nTL_color);
      CreateTL(nTL,dt[0],pr[0],dt[1],pr[1],false,true,nTL_color);
      CreateTL(nTL,dt[0],pr[1],dt[1],pr[0],false,true,nTL_color);
      Print("CreateTL GetLastError "+IntegerToString(GetLastError()));
     };

Pouvez-vous me dire où se trouve l'erreur ?

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 

Dans l'ancienne version.

ObjectCreate(0,nTL="nTL_"+IntegerToString(MathRand()),OBJ_TREND,0,time1,price1,time2,price2);

jamais eu de défaillances.

S'agit-il d'un bug dans le code ou dans le terminal ?

 
Silent:

Pouvez-vous me dire où se trouve l'erreur ?

Je ne sais pas où se trouve l'erreur, mais la gestion des noms d'objets est pour le moins discutable.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
La raison pour laquelle vous voulez un nombre aléatoire dans le nom de l'objet n'est pas claire, cela peut également conduire à une erreur.
 
Silent:

J'obtiens l'erreur 5040 (Corrupted parameter of type string) la première fois que j'appelle la fonction de création d'objet.

Si avant un appel fixé

erreur 4002 (paramètre invalide lors de l'appel interne de la fonction du terminal client)

Si elle est définie avant l'appel

le premier objet sera nommé a.

J'appelle comme ça

Pouvez-vous me dire où se trouve l'erreur ?

Vous êtes inquiet parce que Get LastError imprime quelque chose d'autre que zéro ? Dans ce cas, vous ne devez appeler une erreur que si la fonction signale un échec. Et vous ne devriez pas demander une erreur à la fin du tracé, vous risquez d'obtenir une valeur erronée. C'est ainsi que cela se passe dans MT4, peut-être est-ce différent ici.

Pseudocode :

if( ! ObjectCreate(...) )
    Print( GetLastError() );
 
Silent:

J'obtiens l'erreur 5040 (Corrupted parameter of type string) la première fois que j'appelle la fonction de création d'objet.

Si avant un appel fixé

erreur 4002 (paramètre invalide lors de l'appel interne de la fonction du terminal client)

Si elle est définie avant l'appel

le premier objet sera nommé a.

Je l'appelle comme ça

Pouvez-vous me dire où se trouve l'erreur ?

Essayez de "coller" des chaînes de caractères grâce à StringConcatenate()

 
TheXpert:
Je ne sais pas où se trouve l'erreur, mais la gestion des noms d'objets est très discutable, pour ne pas dire plus.
Je vais me creuser les méninges pendant encore une semaine. Pouvez-vous la décrire plus en détail ? (vous pouvez être grossier :))
zfs:
La raison pour laquelle vous avez besoin d'un nombre aléatoire dans le nom de l'objet n'est pas claire, cela pourrait conduire à une erreur.

Existe-t-il une autre option pour quelques centaines d'objets avec des noms uniques ?

(Un groupe d'objets doit avoir la même partie de la chaîne dans le nom, pour supprimer le groupe).

 
220Volt:

Vous êtes inquiet parce que Get Last Errors imprime quelque chose d'autre que zéro ? Dans ce cas, vous ne devez demander une erreur que si la fonction signale un échec. Et vous ne devriez pas demander une erreur à la fin du tracé, vous risquez d'obtenir une valeur erronée. C'est comme ça dans MT4, peut-être que c'est différent ici.

Non, car le premier appel ne crée pas d'objet à cause d'une erreur. Je duplique (pour l'instant) la ligne du premier appel, puis à partir de la deuxième course il crée.
 
220Volt:

Vous êtes inquiet parce que Get Last Errors imprime quelque chose d'autre que zéro ?

Eh bien, logiquement, si la fonction définit la dernière erreur du tout, alors à la fin de la fonction, il devrait y avoir une erreur nulle ou la valeur décrite dans la documentation. Il n'y a pas d'autre moyen.

C'est-à-dire que si l'appel a réussi et que l'erreur est non nulle, ce cas doit être décrit dans la documentation.

Silencieux:

Je vais me creuser les méninges de cette façon pendant encore une semaine. Puis-je vous donner quelques détails supplémentaires ? (Vous pouvez être grossier :))

En général, les noms des objets du même type sont formés à partir d'une partie commune, pour faciliter l'élimination ("nTL_" dans votre cas) et les différences. J'utilise également l'identificateur de module, s'il peut y avoir plus d'un de ces mêmes modules à la fois sur le graphique.

La différence peut être n'importe quoi, même un compteur, que vous augmentez chaque fois que vous créez un objet. Mais il est préférable de faire des distinctions par logique : temps objet, coordonnées objet, l'objectif est d'obtenir une unicité garantie. L'effet secondaire est qu'en construisant à nouveau un nom, vous pouvez modifier les propriétés d'un objet déjà créé.

Le hasard ne fournit pas cette "garantie d'unicité".

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
Raison: