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

 
Mikhail Tkachev:

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:

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

Isso é fácil.

CObj* var1 = NULL;
CObj* var2 = NULL;
CObj* var3 = NULL;

int OnInit()
{
   var1 = new CObj( p1, p2, p3 );
   var2 = new CObj( p1, p2, p3 );
   var3 = new CObj( p1, p2, p3 );
}
 

Olá

mt5 tem um botão de cristais

Quando se pressiona no gráfico, mostra quantas barras, quantas pips e percentagem

Ajude-me a calcular correctamente este valor para que possa ligá-lo ao meu robô

Obrigado

 
Artyom Trishkin:

A nova classe de bares já está a funcionar?

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

A turma é emprestada de:https://www.mql5.com/ru/code/768, pequenas alterações feitas

//+------------------------------------------------------------------+
//|                                                     IsNewBar.mqh |
//|                               Copyright © 2011, Nikolay Kositsin |
//|                              Khabarovsk,   farria@mail.redcom.ru | 
//+------------------------------------------------------------------+ 
#property copyright "2011,   Nikolay Kositsin"
#property link      "farria@mail.redcom.ru"
#property version   "1.00"
//+------------------------------------------------------------------+
//|  Алгоритм определения момента появления нового бара              |
//| Для каждого таймфрейма каждого символа нужно создавать объект    |
//+------------------------------------------------------------------+  
#include <Object.mqh>

class CIsNewBar : public CObject // Сделан наследником класса для возможности работы с классом CArrayObj (из библиотеки)
// class CIsNewBar   // Первоначальная редакция
  {
   //----
public:

      //---- функция определения момента появления нового бара
   bool IsNewBar()
     {
      //---- получим время появления текущего бара
      datetime TNew=datetime(SeriesInfoInteger(m_Symbol,m_TimeFrame,SERIES_LASTBAR_DATE));

      if(TNew!=m_TOld && TNew) // проверка на появление нового бара
        {
         m_TOld=TNew;
         return(true); // появился новый бар!
        }
      //----
      return(false); // новых баров пока нет!
     };

   //---- конструктор класса    
                     CIsNewBar(const string &pSymbol, const ENUM_TIMEFRAMES pTimeFrame){
                        m_Symbol=pSymbol; m_TimeFrame=pTimeFrame;
                        m_TOld=-1;};

protected:
   datetime          m_TOld;        // Время хранится 
   ENUM_TIMEFRAMES   m_TimeFrame;   //    для каждого таймфрейма
   string            m_Symbol;      //    каждого символа

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

Destina-se a ser aplicado da seguinte forma:

int OnInit()
{
    // Переменная NB_M1 - объект для контроля нового бара по символу currSymbol для таймфрейма M1

    CIsNewBar* NB_M1=new CIsNewBar(currSymbol,PERIOD_M1);
}

void OnTick()
{
    if (NB_M1.IsNewBar())  // (1) Если появился новый бар M1
        {....}
    ......
}
 
Koldun Zloy:

Fácil.

Obrigado pela resposta)
No início fi-lo.
Assim, o objecto é criado duas vezes, primeiro vazio, depois como deve ser por um construtor com parâmetros.
Mas ... Neste caso, o compilador imprime um aviso na linha no OnInit():

declaração de 'var1' esconde variável global -> na linha no OnInit()
ver declaração anterior de 'var1'.

Assim, uma variável local esconde uma variável global ... Então o que acontece?
Que variável será então vista por outra função, OnTick(), por exemplo? A variável global é =NULL, a variável local é inicializada correctamente mas não pode ser vista por outra função ...

 
Mikhail Tkachev:

A turma é emprestada de:https://www.mql5.com/ru/code/768, com pequenas modificações

É suposto ser aplicado da seguinte forma:

Extrair todos os substratos dos parâmetros de entrada e utilizá-los para criar nomes de símbolos e prazos correspondentes.

Em seguida, criar novos objectos de barra a partir destas listas e colocar ponteiro para cada objecto a ser criado - "Nova Barra" - no CArrayObj que é declarado globalmente.

A seguir, recebe um ponteiro para o próximo objecto da lista no laço OnTimer() e verifica a existência de uma nova barra. Se não houver nenhum objecto novo, deve ir para o próximo, se houver, deve fazer o que tem de fazer quando um novo bar abre.

O temporizador deve ser ajustado de acordo com as suas necessidades - milissegundo, segundo, minuto - em geral, com a frequência que considerar suficiente para reagir a uma nova barra sobre um símbolo não corrente.

 
Mikhail Tkachev:

Obrigado pela resposta)
No início fi-lo.
Assim, o objecto é criado duas vezes, primeiro vazio, depois como deve ser por um construtor com parâmetros.
Mas ... Neste caso, o compilador imprime um aviso na linha no OnInit():

declaração de 'var1' esconde variável global -> na linha no OnInit()
ver declaração anterior de 'var1'.

Assim, uma variável local esconde uma variável global ... Então o que acontece?
Que variável será então vista por outra função, OnTick(), por exemplo? A variável global é =NULL e a variável local é inicializada correctamente, mas não pode ser vista por outra função.

Veja com atenção. Não foi isso que fez.

 
Artyom Trishkin:

A partir dos parâmetros de entrada devem ser extraídos todos os substratos, dos quais devem ser compilados os nomes dos símbolos e os seus prazos correspondentes.

Depois criar novos objectos de barra a partir destas listas e colocar um ponteiro para cada novo objecto no CArrayObj que é declarado a nível global.

A seguir, recebe um ponteiro para o próximo objecto da lista no laço OnTimer() e verifica a existência de uma nova barra. Se não houver nenhum objecto novo, deve ir para o próximo, se houver, deve fazer o que tem de fazer quando um novo bar abre.

Faça um temporizador de acordo com as suas necessidades - milissegundo, segundo, minuto - em geral, com a frequência que achar suficiente para responder a uma nova barra sobre um símbolo não corrente.

Era isto que estava a fazer, mas ArrObj.At(0) não chama as funções de membro daclasse...

 
Koldun Zloy:

Dê uma vista de olhos mais atenta. Não era isso que estava a fazer.

Já notado)
Portanto, a solução é declarar globalmente objectos vazios
E se não souber de antemão quantos deles haverá? Basta declarar "com reserva" ? :)
P.S. Não encontrei esta forma de declarar objectos na ajuda integrada

CObj* var1 = NULL;
 
Mikhail Tkachev:

Já notado)
Portanto, a solução é declarar globalmente objectos vazios....
E se não souber de antemão quantos deles haverá? Basta declará-los "com reserva" ? :)

Colocar emCArrayObj.

A funçãoArrObj.At(0) devolve um ponteiro a uma classe base que nada sabe sobre os membros da classe derivada.

A fim de se referir a eles, basta fazer uma conversão de tipo.

CIsNewBar* newBar = (CIsNewBar*)ArrayObj.At(0);
newBar.method( parameter );
 
Koldun Zloy:

Colocar emCArrayObj.

FunçãoArrObj.At(0) devolve o ponteiro à classe base, que nada sabe sobre os membros da classe derivada.

Basta fazer uma conversão de tipo para se referir a eles.

Obrigado pela resposta, não é nada mau)
Agora tudo está claro)
UPD
Esta é a construção que também funciona

CIsNewBar* newBar = ArrayObj.At(0);
newBar.method( parameter )