Questions des débutants MQL5 MT5 MetaTrader 5 - page 1331

 

Aidez à corriger l'indicateur, il n'est pas affiché dans le terminal MT5, il donne des erreurs lors de la compilation.

 //--- descriзгo
#property description "Script cria objeto grбfico de \"Texto\"."
//--- janela de exibiзгo dos parвmetros de entrada durante inicializaзгo do script
#property script_show_inputs


//--- entrada de parвmetros do script
input int                IHistoryBars= 25 ;           // Check Historical Data
input string             InpFont= "Tahoma" ;       // Font Type
input int                InpFontSize= 7 ;           // Size of fonts
input color              UpColor= clrGold ;         // Cor Up
input color              DwColor= clrRoyalBlue ;         // Cor Dw
input color              HLColor= clrAqua ;         // Cor Center
input bool               InpBack= false ;           // Objeto de fundo
input bool               InpSelection= false ;       // Destaque para mover
input bool               InpHidden= true ;           // Ocultar na lista de objetos
input bool               WithDigit= true ;           // Ocultar na lista de objetos
input long               InpZOrder= 0 ;             // Prioridade para clique do mouse


int digits= 0 ,extradig= 0 ;

double             InpAngle= 0.0 ;           // Вngulo de inclinaзгo em graus
ENUM_ANCHOR_POINT InpAnchor= ANCHOR_CENTER ; // Tipo de ancoragem
double    gBars= 0 ;
double    gTotalRates= 0 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit ()
  {
   digits= MathPow ( 10 , _Digits -extradig);
   if (WithDigit) extradig= 1 ;

  }
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem                                         |
//+------------------------------------------------------------------+
bool TextMove( const long    chart_ID= 0 ,   // ID do grбfico
               const string name= "Text" , // nome do objeto
               datetime      time= 0 ,       // coordenada do ponto de ancoragem do tempo
               double        price= 0 )     // coordenada do ponto de ancoragem do preзo
  {
//--- se a posiзгo do ponto nгo estб definida, mover para a barra atual tendo o preзo Bid
   if (!time)
      time= TimeCurrent ();
   if (!price)
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- redefine o valor de erro
   ResetLastError ();
//--- mover o ponto de ancoragem
   if (! ObjectMove (chart_ID,name, 0 ,time,price))
     {
       Print ( __FUNCTION__ ,
             ": falha ao mover o ponto de ancoragem! Cуdigo de erro = " , GetLastError ());
       return ( false );
     }
//--- sucesso na execuзгo
   return ( true );
  }
//+------------------------------------------------------------------+
//| Verificar valores de ponto de ancoragem e definir valores padrгo |
//| para aqueles vazios                                              |
//+------------------------------------------------------------------+
void ChangeTextEmptyPoint( datetime &time, double &price)
  {
//--- se o tempo do ponto nгo estб definido, serб na barra atual
   if (!time)
      time= TimeCurrent ();
//--- se o preзo do ponto nгo estб definido, ele terб valor Bid
   if (!price)
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   ClearMyObjects();
   Print ( "Deinit Value Chart, reason = " + IntegerToString (reason));
  }
//+------------------------------------------------------------------+
//| Value Chart                                                      | 
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &Time[],
                 const double &Open[],
                 const double &High[],
                 const double &Low[],
                 const double &Close[],
                 const long &TickVolume[],
                 const long &Volume[],
                 const int &Spread[])
  {

//--- definir a forma como muitas vezes os textos serгo exibidos
   int scale=( int ) ChartGetInteger ( 0 , CHART_SCALE );
   int bars=( int ) ChartGetInteger ( 0 , CHART_VISIBLE_BARS )+ 3 ;
   double value;
   digits= MathPow ( 10 , _Digits -extradig);

//--- definir o passo
   int step= 1 ;
   switch (scale)
     {
       case 0 :
         step= 12 ;
         break ;
       case 1 :
         step= 6 ;
         break ;
       case 2 :
         step= 4 ;
         break ;
       case 3 :
         step= 2 ;
         break ;
     }
   gTotalRates=rates_total;
   gBars=bars;
   for ( int i=rates_total- 1 ;i>rates_total-bars;i-=step) 
     {
       if (Close[i]>Open[i])
        {
         // bullish candle
         value=(Close[i]-Open[i])*digits;
         //Print(Close[i]-Open[i], "->", Close[i]-Open[i]*digits);

         TextCreate( 0 , "Text_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],(Close[i]+Open[i])/ 2 , DoubleToString (value,extradig),InpFont,InpFontSize,
                    UpColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder);

         value=(Open[i]-Low[i]) *digits;
         if (!TextCreate( 0 , "TextL_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],Low[i], DoubleToString (value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;     }

         value=(High[i]-Close[i]) *digits;
         if (!TextCreate( ChartID (), "TextH_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],High[i], DoubleToString (value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;     }

           } else {

         value=(Open[i]-Close[i]) *digits;
         if (!TextCreate( ChartID (), "Text_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],(Close[i]+Open[i])/ 2 , DoubleToString (value,extradig),InpFont,InpFontSize,
            DwColor,-InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;      }

         value=(Close[i]-Low[i]) *digits;
         if (!TextCreate( ChartID (), "TextL_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],Low[i], DoubleToString (value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;     }

         value=(High[i]-Open[i]) *digits;
         if (!TextCreate( ChartID (), "TextH_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],High[i], DoubleToString (value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;     }
        }

     }
   ChartRedraw ();
   return 0 ;
  }
//+------------------------------------------------------------------+
//|  Trace Arrow Function                                            |
//+------------------------------------------------------------------+
void Trace( string name, int sens, double price, datetime time, color couleur)
  {
   ObjectCreate ( 0 ,name, OBJ_ARROW , 0 ,time,price);
   if (sens== 1 )
       ObjectSetInteger ( 0 ,name, OBJPROP_ARROWCODE , 233 );
   if (sens==- 1 )
       ObjectSetInteger ( 0 ,name, OBJPROP_ARROWCODE , 234 );
   ObjectSetInteger ( 0 ,name, OBJPROP_COLOR ,couleur);
   ObjectSetInteger ( 0 ,name, OBJPROP_WIDTH , 5 );
  }
//+------------------------------------------------------------------+
//|   Delete Arrow Function                                          |
//+------------------------------------------------------------------+  
void ClearMyObjects() 
  {
   string name;
   int scale=( int ) ChartGetInteger ( 0 , CHART_SCALE );
   int bars=( int ) ChartGetInteger ( 0 , CHART_VISIBLE_BARS )+ 3 ;
   double value;
   digits= MathPow ( 10 , _Digits -extradig);
   int step= 1 ;
   switch (scale)
     {
       case 0 :
         step= 12 ;
         break ;
       case 1 :
         step= 6 ;
         break ;
       case 2 :
         step= 4 ;
         break ;
       case 3 :
         step= 2 ;
         break ;
     }
   for ( int i=gTotalRates- 1 ;i>gTotalRates-bars;i-=step) 
     {
       if (!TextDelete( ChartID (), "Text_" +( string )i+( string ) PERIOD_CURRENT )){}
       if (!TextDelete( ChartID (), "TextH_" +( string )i+( string ) PERIOD_CURRENT )){}
       if (!TextDelete( ChartID (), "TextL_" +( string )i+( string ) PERIOD_CURRENT )){}
       //--- redesenhar o grбfico
     }
   ChartRedraw ();

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

//+------------------------------------------------------------------+
//| Alterar o texto do objeto                                        |
//+------------------------------------------------------------------+
bool TextChange( const long    chart_ID= 0 ,   // ID do Grбfico
                 const string name= "Text" , // nome do objeto
                 const string text= "Text" ) // texto
  {
//--- redefine o valor de erro
   ResetLastError ();
//--- alterar texto do objeto
   if (! ObjectSetString (chart_ID,name, OBJPROP_TEXT ,text))
     {
       Print ( __FUNCTION__ ,
             ": falha ao alterar texto! Cуdigo de erro = " , GetLastError ());
       return ( false );
     }
//--- sucesso na execuзгo
   return ( true );
  }
//+------------------------------------------------------------------+
//| Excluir objeto Texto                                             |
//+------------------------------------------------------------------+
bool TextDelete( const long    chart_ID= 0 ,   // Id do Grбfico
                 const string name= "Text" ) // nome do objeto
  {
//--- redefine o valor de erro
   ResetLastError ();
//--- excluir o objeto
   if (! ObjectDelete (chart_ID,name))
     {
       Print ( __FUNCTION__ ,
             ": falha ao excluir o objeto \"Texto\"! Cуdigo de erro = " , GetLastError ());
       return ( false );
     }
//--- sucesso na execuзгo
   return ( true );
  }
//+------------------------------------------------------------------+
//| Criando objeto Texto                                             |
//+------------------------------------------------------------------+
bool TextCreate( const long               chart_ID= 0 ,               // ID do grбfico
                 const string             name= "Text" ,               // nome do objeto
                 const int                sub_window= 0 ,             // нndice da sub-janela
                 datetime                 time= 0 ,                   // ponto de ancoragem do tempo
                 double                   price= 0 ,                   // ponto de ancoragem do preзo
                 const string             text= "Text" ,               // o prуprio texto
                 const string             font= "Arial" ,             // fonte
                 const int                font_size= 10 ,             // tamanho da fonte
                 const color              clr= clrRed ,               // cor
                 const double             angle= 0.0 ,                 // inclinaзгo do texto
                 const ENUM_ANCHOR_POINT anchor= ANCHOR_CENTER , // tipo de ancoragem
                 const bool               back= false ,               // no fundo
                 const bool               selection= false ,           // destaque para mover
                 const bool               hidden= true ,               // ocultar na lista de objetos
                 const long               z_order= 0 )                 // prioridade para clicar no mouse
  {

   if ( ObjectFind (chart_ID,name)==- 1 ) 
     {

       //--- definir as coordenadas de pontos de ancoragem, se eles nгo estгo definidos
       //--- redefine o valor de erro
       ResetLastError ();
       //--- criar objeto Texto
       if (! ObjectCreate (chart_ID,name, OBJ_TEXT ,sub_window,time,price)) 
        {
         Print ( __FUNCTION__ ,
               ": falha ao criar objeto \"Texto\"! Cуdigo de erro = " , GetLastError ());
         return ( false );
        }
       //--- definir o texto
       ObjectSetString (chart_ID,name, OBJPROP_TEXT ,text);
       //--- definir o texto fonte
       ObjectSetString (chart_ID,name, OBJPROP_FONT ,font);
       //--- definir tamanho da fonte
       ObjectSetInteger (chart_ID,name, OBJPROP_FONTSIZE ,font_size);
       //--- definir o вngulo de inclinaзгo do texto
       ObjectSetDouble (chart_ID,name, OBJPROP_ANGLE ,angle);
       //--- tipo de definiзгo de ancoragem
       ObjectSetInteger (chart_ID,name, OBJPROP_ANCHOR ,anchor);
       ObjectSetInteger (chart_ID,name, OBJPROP_ALIGN , ALIGN_CENTER );

       //--- definir cor
       ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
       //--- exibir em primeiro plano (false) ou fundo (true)
       ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
       //--- habilitar (true) ou desabilitar (false) o modo de mover o objeto com o mouse
       ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
       ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
       //--- ocultar (true) ou exibir (false) o nome do objeto grбfico na lista de objeto 
       ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
       //--- definir a prioridade para receber o evento com um clique do mouse no grбfico
       ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
       ObjectSetDouble (chart_ID,name, OBJPROP_PRICE ,price);
       ObjectSetInteger (chart_ID,name, OBJPROP_TIME ,time);

       //--- sucesso na execuзгo
       return ( true );
        } else {
      ChangeTextEmptyPoint(time,price);

       ObjectSetString (chart_ID,name, OBJPROP_TEXT ,text);
       ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
       ObjectSetInteger (chart_ID,name, OBJPROP_ANCHOR ,anchor);
       ObjectSetInteger (chart_ID,name, OBJPROP_ALIGN , ALIGN_CENTER );
       ObjectSetDouble (chart_ID,name, OBJPROP_ANGLE ,angle);
       ObjectSetDouble (chart_ID,name, OBJPROP_PRICE ,price);
       ObjectSetInteger (chart_ID,name, OBJPROP_TIME ,time);
       ObjectSetString (chart_ID,name, OBJPROP_FONT ,font);
       //--- definir tamanho da fonte
       ObjectSetInteger (chart_ID,name, OBJPROP_FONTSIZE ,font_size);
       ObjectSetInteger (chart_ID,name, OBJPROP_YDISTANCE , 100 );

/*ObjectSetString(chart_ID,name,OBJPROP_FONT,Font);
      ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,Size);*/
       return ( true );
     }

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,         // Event ID
                   const long & lparam,   // Parameter of type long event
                   const double & dparam, // Parameter of type double event
                   const string & sparam   // Parameter of type string events
                  )
  {
   if (id== CHARTEVENT_CHART_CHANGE )
     {
      ClearMyObjects();
     }

  }
//+------------------------------------------------------------------+
Dossiers :
 
Green handsome:

Aidez à réparer l'indicateur, il ne s'affiche pas dans le terminal MT5, il donne des erreurs lors de la compilation.

Le plus simple est de définir ArraySetAsSeries(Open,true) ; ArraySetAsSeries(Close,true) ; et ainsi de suite dans OnCalculate au tout début de tous les tableaux.

c'est la surprise traditionnelle sur un lieu plat : en 5 les directions d'indexation par défaut sont différentes de celles en 4.

L'indicateur n'utilise pas de tampons, il construit simplement des objets graphiques. Après le démarrage, appuyez sur Ctrl+B et voyez où il les a placés.

 

En fouillant dans la documentation et les forums ...
Comment rendre les variables de type pointeur globales [dans l'exemple var], si elles sont créées dans OnInit() par string :

CObj* var=new CObj(p1,p2,p3);

et le nombre d'objets et les paramètres du constructeur ne sont pas connus à l'avance et sont calculés dans OnInit() ?

 
Mikhail Tkachev:

En fouillant dans la documentation et les forums ...
Comment rendre globales les variables de type pointeur, si elles sont créées dans OnInit() :

et le nombre d'objets et les paramètres du constructeur ne sont pas connus à l'avance et sont calculés dans OnInit() ?

Je ne comprends rien, mais passe un tableau de pointeurs CArrayObj aux objets créés dans OnInit()

Документация по MQL5: Стандартная библиотека / Коллекции данных / CArrayObj
Документация по MQL5: Стандартная библиотека / Коллекции данных / CArrayObj
  • www.mql5.com
CArrayObj - Коллекции данных - Стандартная библиотека - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin:

Rien de compris, mais passer un tableau de pointeurs CArrayObj aux objets créés dans OnInit()

Artem, merci pour la réponse.
Je m'excuse pour le manque de clarté de la question)
Il existe trois variables globales de type pointeur vers un objet dans Expert Advisor : var1, var2, var3.

Avant d'exécuter OnInit(), on ne sait pas si toutes ces variables seront nécessaires (ceci est lié aux délais), on ne connaît pas non plus les paramètres des constructeurs, qui vont initialiser les objets.
Comment créer de telles variables dans OnInit() pour qu'elles soient globales ?

 
Mikhail Tkachev:

Artem, merci pour votre réponse.
Je m'excuse pour le manque de clarté de la question)
Trois variables globales de type pointeur peuvent être utilisées dans l'EA : var1, var2, var3.

Avant d'exécuter OnInit(), on ne sait pas si toutes ces variables seront nécessaires (ceci est lié aux délais), on ne connaît pas non plus les paramètres des constructeurs qui vont initialiser les objets.
Comment créer de telles variables dans OnInit(), afin qu'elles soient globales ?

Je ne sais pas quel constructeur magique vous avez là, qui ne contient que des inconnues :)

Il n'est pas nécessaire de déclarer au préalable les objets en tant qu'instances.

Vous devez déclarer un tableau CArrayObj. Vos objets eux-mêmes doivent être des descendants de CObject.

Créez votre objet par new et ajoutez un pointeur sur celui-ci à la liste.

Créez l'objet suivant et ajoutez-le à la liste, et ainsi de suite.

Cette liste - un pointeur vers elle (et la liste est déclarée globalement) - est passée à vos constructeurs.

Mais voici comment vous alliez faire les constructeurs avec des arguments inconnus à l'avance - je ne comprends pas du tout. Essayez de le clarifier

 
Artyom Trishkin:


Mais voici comment vous allez faire des constructeurs avec des arguments inconnus à l'avance - je suis un peu confus ici. Essayez de l'expliquer

Création d'objets de type CIsNewBar pour chaque horizon temporel utilisé pour chaque symbole.
Les caractères sont spécifiés par une ligne avec des séparateurs dans le paramètre d'entrée, donc vous ne pouvez pas créer tous les objets au préalable avant OnInit().
C'est-à-dire que le premier paramètre inconnu du constructeur est un symbole.
Le deuxième paramètre inconnu du constructeur est un délai, car chaque symbole aura son propre ensemble de délais, également transmis par une chaîne avec des délimiteurs dans le paramètre d'entrée.

HH. Il yavait un problème avec la classeCArrayObj: lors de l'accès aux éléments de typeCArrayObj* ArrayObj. At(0), les membres de classe de l'objet qui est At(0) sont inaccessibles, bien que ces membres de classe soient exactement publics, c'est-à-dire une construction de type ArrayObj.At(0).method(parameter) ne fonctionne pas.
Et
j'ai également peur d'utiliser ces bibliothèques, peut-être que quelque chose va changer dans celles-ci lors de la mise à jour du terminal, et mon Expert Advisor va soudainement cesser de fonctionner...
 
Mikhail Tkachev:

Créer des objets de type CIsNewBar pour chaque horizon temporel utilisé pour chaque symbole.
Les caractères sont spécifiés par une ligne avec des délimiteurs dans le paramètre d'entrée, il est donc impossible de créer tous les objets avant OnInit().
C'est-à-dire que le premier paramètre inconnu du constructeur est un symbole.
Le deuxième paramètre inconnu du constructeur est un délai, car chaque symbole aura son propre ensemble de délais, également transmis par une chaîne avec des délimiteurs dans le paramètre d'entrée.

P.S.Il y avait un problème avec la classeCArrayObj: lors de l'accès aux éléments de typeCArrayObj* ArrayObj. At(0), les membres de classe de l'objet que At(0) n'est pas disponible, bien que ces membres de classe soient exactement publics, c'est-à-dire une construction comme ArrayObj.At(0).method(parameter) ne fonctionne pas.
Et
j'ai également peur d'utiliser ces bibliothèques, peut-être que quelque chose va changer dans celles-ci lors de la mise à jour du terminal, et mon Expert Advisor va soudainement cesser de fonctionner...

C'est faux d'une certaine façon...

Écrivez en mots simples ce que vous voulez faire. Sans aucune référence à vos tentatives pour tout coder.

 
Artyom Trishkin:

C'est juste que ça ne semble pas juste...

Écrivez en mots simples ce que vous voulez faire. Sans aucune mention de vos tentatives pour tout coder.

Conseiller expert multi-devises.
La liste des symboles est spécifiée via le paramètre d'entrée, la chaîne avec le délimiteur "AUDUSD,EURUSD,GBPUSD...", le nombre de symboles n'est pas prédéfini.
Pour chaque symbole, il existe deux horizons temporels, sur lesquels fonctionne son "propre" système de trading.
En conséquence, il existe deux paramètres d'entrée, des chaînes de caractères délimitées par : une courte période de temps pour un symbole respectif "M1,M30,M5..."
une longue période de temps pour le symbole respectif "H1,D1,H4.."
Par exemple, pour AUDUSD, les horizons temporels sont M1 et H1, pour EURUSD M30 et D1, etc.
Dans OnTick(), pour chaque symbole, il est nécessaire de suivre l'apparition d'une nouvelle barre sur les deux horizons temporels (court et long) pour prendre des décisions de trading.
J'ai essayé de l'écrire aussi simplement que possible).

 
Mikhail Tkachev:

Conseiller expert multi-devises.
La liste des symboles est définie via un paramètre d'entrée, une chaîne de caractères avec le séparateur "AUDUSD,EURUSD,GBPUSD...", le nombre de symboles n'est pas prédéfini.
Pour chaque symbole, il existe deux horizons temporels, sur lesquels fonctionne son "propre" système de trading.
En conséquence, il existe deux paramètres d'entrée, des chaînes de caractères délimitées par : une courte période de temps pour un symbole respectif "M1,M30,M5..."
une longue période de temps pour le symbole respectif "H1,D1,H4.."
Par exemple, pour AUDUSD, les horizons temporels sont M1 et H1, pour EURUSD M30 et D1, etc.
Dans OnTick(), pour chaque symbole, il est nécessaire de suivre l'apparition d'une nouvelle barre sur les deux horizons temporels (court et long) pour prendre des décisions de trading.
J'ai essayé de l'écrire de la manière la plus simple possible).

Avez-vous déjà une classe pour un nouveau bar ?

Et à quoi ressemblent exactement les paramètres d'entrée ?