Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1331

 

Ajude a corrigir o indicador, ele não é exibido no terminal MT5, dá erros durante a compilação.

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

  }
//+------------------------------------------------------------------+
Arquivos anexados:
 
Green handsome:

Ajuda a corrigir o indicador, não é exibido no terminal MT5, dá erros na compilação.

A maneira mais fácil é definir o ArraySetAsSeries(Aberto,verdadeiro) ; ArraySetAsSeries(Fechado,verdadeiro) ; e assim por diante no OnCalculate logo no início de todos os arrays.

esta é a surpresa tradicional à primeira vista: em 5 as direcções de indexação por defeito são diferentes de em 4.

o indicador não utiliza buffers, apenas constrói objectos gráficos - depois de começar a pressionar Ctrl+B e ver onde os coloca lá

 

Escavação da documentação e do fórum ...
Como tornar globais variáveis de tipo ponteiro [no exemplo var], se são criadas em OnInit() por string:

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

e o número de objectos e parâmetros do construtor não são conhecidos antecipadamente e são calculados no OnInit() ?

 
Mikhail Tkachev:

Escavação da documentação e do fórum ...
Como tornar globais variáveis de tipo ponteiro, se forem criadas no OnInit():

e o número de objectos e parâmetros do construtor não são conhecidos antecipadamente e são calculados no OnInit() ?

Não entendo nada, mas passo um conjunto de indicadores CArrayObj aos objectos criados no OnInit()

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

Não entendo nada, mas passo uma série de apontadores CArrayObj para os objectos criados no OnInit()

Artem, obrigado pela sua resposta.
Peço desculpa pela pergunta pouco clara)
Há três variáveis globais de tipo ponteiro para um objecto no Expert Advisor: var1, var2, var3.

Antes de executar o OnInit(), desconhece-se se todas estas variáveis serão necessárias (isto está relacionado com os prazos), também desconhecidos são os parâmetros para os construtores, que inicializarão os objectos.
Como criar tais variáveis no OnInit() para que sejam globais?

 
Mikhail Tkachev:

Artem, obrigado pela sua resposta.
Peço desculpa pela pergunta pouco clara)
Três variáveis globais do tipo ponteiro podem ser usadas em EA: var1, var2, var3.

Antes de executar o OnInit(), não se sabe se todas estas variáveis serão necessárias (está relacionado com prazos), também os parâmetros para os construtores, que inicializarão os objectos, são desconhecidos.
Como criar tais variáveis no OnInit(), para que sejam globais?

Não sei que construtor mágico tem aí, que contém apenas incógnitas :)

Não é necessário declarar previamente os objectos como instâncias.

É necessário declarar um conjunto CArrayObj. Os seus próprios objectos devem ser descendentes de CObject.

Crie o seu objecto por novo e acrescente-lhe um ponteiro à lista.

Criar o próximo objecto e adicioná-lo à lista, e assim por diante.

Esta lista - um ponteiro para ela (e a lista é declarada globalmente) - é transmitida aos seus construtores.

Mas eis como iam fazer construtores com argumentos desconhecidos de antemão - não o compreendo nem um pouco. Tente clarificá-lo

 
Artyom Trishkin:


Mas eis como se vão fazer construtores com argumentos desconhecidos antecipadamente - estou um pouco confuso aqui. Tente explicar

Criação de objectos do tipo CIsNewBar para cada período de tempo utilizado para cada símbolo.
Os caracteres são especificados por uma linha com separadores no parâmetro de entrada, pelo que não se pode criar todos os objectos antes do OnInit().
Ou seja, o primeiro parâmetro de construtor desconhecido é um símbolo.
O segundo parâmetro de construtor desconhecido é um período de tempo, uma vez que cada símbolo terá o seu próprio conjunto de períodos de tempo, igualmente passados por um fio com delimitadores no parâmetro de entrada.

HH.Houve um problema com a classeCArrayObj: ao aceder a elementos do tipoCArrayObj* ArrayObj. At(0), os membros da classe do objecto que é At(0) são inacessíveis, embora estes membros da classe sejam exactamente públicos, ou seja, uma construção do tipo ArrayObj.At(0).method(parâmetro) não funciona.
E
também tenho medo de usar estas bibliotecas, talvez algo mude nelas ao actualizar o terminal, e o meu Conselheiro Especialista deixará subitamente de funcionar...
 
Mikhail Tkachev:

Criar objectos do tipo CIsNewBar para cada período de tempo utilizado para cada símbolo.
Os caracteres são especificados por uma linha com separadores no parâmetro de entrada, pelo que é impossível criar todos os objectos antes do OnInit() com antecedência.
Ou seja, o primeiro parâmetro de construtor desconhecido é um símbolo.
O segundo parâmetro desconhecido do construtor é um período de tempo, uma vez que cada símbolo terá o seu próprio conjunto de períodos de tempo, igualmente passados por um fio com delimitadores no parâmetro de entrada.

P.S.Houve um problema com a classeCArrayObj: ao aceder a elementos do tipoCArrayObj* ArrayObj. At(0), os membros da classe objecto que At(0) não está disponível, embora estes membros da classe sejam exactamente públicos, ou seja, uma construção do tipo ArrayObj.At(0).method(parâmetro) não funciona.
E
também tenho medo de usar estas bibliotecas, talvez algo mude nelas ao actualizar o terminal, e o meu Conselheiro Especialista deixará subitamente de funcionar...

Está tudo errado de alguma forma...

Escreva em palavras simples o que pretende fazer. Sem qualquer referência às suas tentativas de codificar tudo.

 
Artyom Trishkin:

Só não me parece correcto...

Escreva em palavras simples o que pretende fazer. Sem qualquer menção às suas tentativas de codificar tudo.

Consultor Especialista Multimoedas.
A lista de símbolos é especificada através do parâmetro de entrada, a cadeia com o delimitador "AUDUSD,EURUSD,GBPUSD...", o número de símbolos não está pré-definido.
Para cada símbolo, existem dois períodos de tempo, nos quais o seu "próprio" sistema de comércio funciona.
Correspondentemente, há dois parâmetros de entrada, cadeias delimitadas por : curto prazo para um respectivo símbolo "M1,M30,M5..."
um longo período para o respectivo símbolo "H1,D1,H4".."
Isto é, para AUDUSD os prazos são M1 e H1, para EURUSD M30 e D1, etc.
Em OnTick(), para cada símbolo, é necessário acompanhar o aparecimento de uma nova barra em ambos os períodos de tempo (curto e longo) para tomar decisões comerciais.
Tentei escrevê-lo da forma mais simples possível)

 
Mikhail Tkachev:

Consultor Especialista Multimoedas.
A lista de símbolos é definida através do parâmetro de entrada, uma cadeia com separador "AUDUSD,EURUSD,GBPUSD...", o número de símbolos não está pré-definido.
Para cada símbolo, existem dois períodos de tempo, nos quais o seu "próprio" sistema de comércio funciona.
Correspondentemente, há dois parâmetros de entrada, cadeias delimitadas por : curto prazo para um respectivo símbolo "M1,M30,M5..."
um longo período para o respectivo símbolo "H1,D1,H4".."
Isto é, para AUDUSD os prazos são M1 e H1, para EURUSD M30 e D1, etc.
Em OnTick(), para cada símbolo, é necessário acompanhar o aparecimento de uma nova barra em ambos os períodos de tempo (curto e longo) para tomar decisões comerciais.
Tentei escrevê-lo da forma mais fácil possível).

Já tem uma aula para um novo bar?

E como são exactamente os parâmetros de entrada?