Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1331

 

Ayuda a arreglar el indicador, no se muestra en la terminal MT5, da errores durante la compilación.

 //--- 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();
     }

  }
//+------------------------------------------------------------------+
Archivos adjuntos:
 
Green handsome:

Ayuda para arreglar el indicador, no se muestra en la terminal MT5, da errores al compilar.

La forma más fácil es establecer ArraySetAsSeries(Open,true) ; ArraySetAsSeries(Close,true) ; y así sucesivamente en OnCalculate al principio de todas las matrices.

esta es la sorpresa tradicional a primera vista: en 5 las direcciones de indexación por defecto son diferentes que en 4.

El indicador no utiliza buffers, sólo construye objetos gráficos - después de iniciar presione Ctrl+B y vea donde los pone

 

Escarbando en la documentación y en el foro...
Cómo hacer globales las variables de tipo puntero [en el ejemplo var], si se crean en OnInit() por cadena:

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

y el número de objetos y los parámetros del constructor no se conocen de antemano y se calculan en OnInit() ?

 
Mikhail Tkachev:

Escarbando en la documentación y en el foro...
Cómo hacer globales las variables de tipo puntero, si se crean en OnInit():

y el número de objetos y los parámetros del constructor no se conocen de antemano y se calculan en OnInit() ?

No entiendo nada, pero pasa un array de punteros CArrayObj a los objetos creados en OnInit()

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

No se entiende nada, pero pasa un array de punteros CArrayObj a los objetos creados en OnInit()

Artem, gracias por su respuesta.
Me disculpo por la pregunta poco clara)
Hay tres variables globales de tipo puntero a un objeto en Expert Advisor: var1, var2, var3.

Antes de ejecutar OnInit(), se desconoce si todas estas variables serán necesarias (esto está relacionado con los plazos), también se desconocen los parámetros para los constructores, que inicializarán los objetos.
¿Cómo crear esas variables en OnInit() para que sean globales?

 
Mikhail Tkachev:

Artem, gracias por su respuesta.
Me disculpo por la pregunta poco clara)
En EA se pueden utilizar tres variables globales de tipo puntero: var1, var2, var3.

Antes de ejecutar OnInit(), se desconoce si todas estas variables serán necesarias (esto está relacionado con los plazos), también se desconocen los parámetros de los constructores que inicializarán los objetos.
¿Cómo crear dichas variables en OnInit(), para que sean globales?

No sé qué constructor mágico tienes ahí, que sólo contiene incógnitas :)

No es necesario declarar los objetos como instancias de antemano.

Es necesario declarar un array CArrayObj. Sus objetos deben ser descendientes de CObject.

Crea tu objeto mediante new y añade un puntero a él a la lista.

Crea el siguiente objeto y lo añade a la lista, y así sucesivamente.

Esta lista - un puntero a ella (y la lista se declara globalmente) - se pasa a sus constructores.

Pero así es como ibas a hacer constructores con argumentos desconocidos de antemano - no lo entiendo ni un poco. Intenta aclararlo

 
Artyom Trishkin:


Pero así es como vas a hacer constructores con argumentos desconocidos de antemano - estoy un poco confundido aquí. Intenta explicarlo

Creación de objetos de tipo CIsNewBar para cada marco temporal utilizado para cada símbolo.
Los caracteres se especifican en una línea con separadores en el parámetro de entrada, por lo que no se pueden crear todos los objetos de antemano antes de OnInit().
Es decir, el primer parámetro desconocido del constructor es un símbolo.
El segundo parámetro desconocido del constructor es un marco temporal, ya que cada símbolo tendrá su propio conjunto de marcos temporales, pasados igualmente por una cadena con delimitadores en el parámetro de entrada.

HH.Había un problema con la claseCArrayObj: al acceder a elementos de tipoCArrayObj* ArrayObj. At(0), los miembros de la clase del objeto que es At(0) son inaccesibles, aunque estos miembros de la clase son exactamente públicos, es decir, una construcción de tipo ArrayObj.At(0).method(parameter) no funciona.
Y
también me da miedo usar estas librerías, quizás algo cambie en ellas al actualizar el terminal, y mi Expert Advisor deje de funcionar de repente...
 
Mikhail Tkachev:

Crear objetos de tipo CIsNewBar para cada marco temporal utilizado para cada símbolo.
Los caracteres se especifican en una línea con delimitadores en el parámetro de entrada, por lo que es imposible crear todos los objetos antes de OnInit() por adelantado.
Es decir, el primer parámetro desconocido del constructor es un símbolo.
El segundo parámetro desconocido del constructor es un marco temporal, ya que cada símbolo tendrá su propio conjunto de marcos temporales, pasados igualmente por una cadena con delimitadores en el parámetro de entrada.

P.D.Había un problema con la claseCArrayObj: al acceder a elementos de tipoCArrayObj* ArrayObj. At(0), los miembros de la clase objeto que At(0) no está disponible, aunque estos miembros de la clase son exactamente públicos, es decir, una construcción de tipo ArrayObj.At(0).method(parameter) no funciona.
Y
también me da miedo usar estas librerías, quizás algo cambie en ellas al actualizar el terminal, y mi Expert Advisor deje de funcionar de repente...

Todo está mal de alguna manera...

Escribe con palabras sencillas lo que quieres hacer. Sin ninguna referencia a sus intentos de codificar todo.

 
Artyom Trishkin:

Simplemente no se siente bien...

Escribe con palabras sencillas lo que quieres hacer. Sin ninguna mención a sus intentos de codificar todo.

Asesor experto multidivisa.
La lista de símbolos se especifica mediante el parámetro de entrada, la cadena con el delimitador "AUDUSD,EURUSD,GBPUSD...", el número de símbolos no está predefinido.
Para cada símbolo, hay dos marcos temporales, en los que funciona su "propio" sistema de negociación.
En consecuencia, hay dos parámetros de entrada, cadenas delimitadas por : un plazo corto para un símbolo respectivo "M1,M30,M5..."
un marco temporal largo para el símbolo respectivo "H1,D1,H4.."
Es decir, para el AUDUSD los plazos son M1 y H1, para el EURUSD M30 y D1, etc.
En OnTick(), para cada símbolo, es necesario seguir la aparición de una nueva barra en ambos plazos (corto y largo) para tomar decisiones de negociación.
He intentado escribirlo de la forma más sencilla posible)

 
Mikhail Tkachev:

Asesor experto multidivisa.
La lista de símbolos se establece mediante el parámetro de entrada, una cadena con el separador "AUDUSD,EURUSD,GBPUSD...", el número de símbolos no está predefinido.
Para cada símbolo, hay dos marcos temporales, en los que funciona su "propio" sistema de negociación.
En consecuencia, hay dos parámetros de entrada, cadenas delimitadas por : un plazo corto para un símbolo respectivo "M1,M30,M5..."
un marco temporal largo para el símbolo respectivo "H1,D1,H4.."
Es decir, para el AUDUSD los plazos son M1 y H1, para el EURUSD M30 y D1, etc.
En OnTick(), para cada símbolo, es necesario seguir la aparición de una nueva barra en ambos plazos (corto y largo) para tomar decisiones de negociación.
He intentado escribirlo de la forma más sencilla posible).

¿Ya tiene una clase para un nuevo bar?

¿Y cómo son exactamente los parámetros de entrada?