Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 508

 
Tenho todos os tipos de disparates como parâmetros indicadores, etc. como parâmetros em minha classe. Em geral, coisas que serão estáticas e as mesmas. Então por que eu deveria passar esses valores toda vez que eu crio um objeto?
 
STARIJ:

este é mais curto? bool barup=... WindowRedraw(); ainda executará - retirado de se

também pode ser mais curto ... ver meu arquivo

Obrigado. Como posso definir corretamente o intervalo em que os níveis de Fibo são puxados? Se for (hora) 9.00, deverá desenhar níveis das 8.00 às 8.59 em М1.
 
Juer:

É como se a afirmação da pergunta fosse clara, não é? O objetivo é rubricar a mesma coisa.

Como você vai rubricar algo que ainda não existe? Depois que o objeto é criado, ele começa a existir, e é quando ele pode ser inicializado.

Eu lhe disse imediatamente - faça de um objeto um construtor paramétrico, e passe a ele os parâmetros necessários, que serão usados para inicializar o objeto recém-criado.

Você pode passar parâmetros através de uma estrutura, que você preenche com os dados necessários (constantes para todos esses objetos) no OnInit() do programa. Então, em OnTick(), por exemplo, ou em qualquer outro manipulador padrão, você cria seus objetos, mas quando você os cria você escreve o seguinte:
CMyObject object = novo CMyObject(a_a_estrutura_a_aqui com_parâmetros_de_set);

Ou, se os dados do objeto não mudarem de programa para programa e sempre tiverem os mesmos valores, então inicialize-os explicitamente com os parâmetros necessários no construtor através da lista de inicialização, como Igor disse acima:

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Qualquer pergunta de novatos sobre MQL4, ajuda e discussão sobre algoritmos e códigos

Ihor Herasko, 2018.03.28 17:31

Isto é feito na lista de inicialização, que está localizada na construtora da classe:

class CCandle
{
   int      m_nA;
   double   m_fB;
   datetime m_dtC;


   void CCandle::CCandle(void);
};

CCandle::CCandle(void)
            : m_nA(0)
            , m_fB(0.0)
            , m_dtC(0)
{
}

 
Artyom Trishkin:

Como você vai rubricar algo que ainda não existe? Depois que o objeto é criado, ele começa a existir, e é quando ele pode ser inicializado.

Eu lhe disse imediatamente - faça de um objeto um construtor paramétrico, e passe os parâmetros necessários a ele, que serão usados para inicializar o objeto recém-criado.

Você pode passar parâmetros através de uma estrutura, que você preencherá com os dados necessários (constantes para todos esses objetos) no OnInit() do programa. Então, em OnTick(), por exemplo, ou em qualquer outro manipulador padrão, você cria seus objetos, mas na criação você escreve o seguinte:
CMyObject object = novo CMyObject(a_a_estrutura_a_aqui com_parâmetros_de_set);

Sim, estou vendo. Obrigado. Bem, de alguma forma apenas pensou que havia alguma solução para que quando um objeto é criado ele tenha alguns parâmetros pré-estabelecidos imediatamente, sem ter que passá-los para o construtor ou qualquer outra coisa. Através de alguma classe de pais ou algo assim.

 
Juer:
Na minha classe tenho todos os tipos de coisas como parâmetros indicadores, etc. como parâmetros. Em geral, coisas que serão estáticas e as mesmas. Então por que eu deveria passar esses valores toda vez que eu crio um objeto?

Portanto, não passe adiante. Inicializar na lista de inicialização, como eu já mostrei. No momento da criação de uma instância da classe, o construtor da classe será automaticamente chamado, o que inicializará todos os membros da classe, especificados na lista de inicialização. Coloque a função Imprimir no método CCandle e você verá como o construtor é chamado sem nenhuma referência a ele.

 
Juer:

Sim, estou vendo. Obrigado. Bem, de alguma forma apenas pensou que havia alguma solução, de modo que quando um objeto é criado ele tem alguns parâmetros pré-estabelecidos imediatamente, sem ter que passá-los para o construtor ou qualquer outra coisa. Através de alguma classe de pais ou algo assim.

Novamente. Você pode fazer isso sem transferir os dados para o construtor.

 
Ihor Herasko:

Portanto, não passe adiante. Inicializar na lista de inicialização, como eu já mostrei. No momento da criação de uma instância da classe, o construtor da classe será automaticamente chamado, o que inicializará todos os membros da classe, especificados na lista de inicialização. Coloque a função Imprimir no método CCandle e você verá como o construtor é chamado sem nenhuma referência a ele.

Eu não entendo, que diferença faz se os passa através do construtor ou através da função de inicialização?

 
Ihor Herasko:

Portanto, não passe adiante. Inicializar na lista de inicialização, como eu já mostrei. No momento da criação de uma instância da classe, o construtor da classe será automaticamente chamado, o que inicializará todos os membros da classe, especificados na lista de inicialização. Coloque a função Imprimir no método CCandle e veja como o construtor é chamado sem nenhuma referência a ele.

Com o que eles serão inicializados? Com que valores? Eu não entendo .

Suponha que eu tenha os valores iniciais nos parâmetros de entrada do Expert Advisor. Portanto, preciso passá-los para cada objeto da classe. Mas não para passá-los para cada objeto recém-criado.

 

como neste ciclo minha ordem de limite é excluída somente se após colocar uma ordem de limite na barra seguinte outra ordem de limite não foi colocada, ou seja, uma ordem de limite é excluída somente se for colocada e então seguida por duas barras sem ordens de limite

 int i;
   for(i=0;i<=OrderTicket();i++)
     {
      takelimit=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

      if(iBarShift(Symbol(),0,OrderOpenTime())==2)//здесь нужно что бы на 2-ом баре если есть ордер его удалить, но удаляется он только если после его установки небыло на след баре еще лимитника
        {
         deletelimit=OrderDelete(ticket);
         if(!deletelimit)
           {
            Comment(GetLastError());
           }
        }
     }
if(условие для байлимита)
{ордерсенд}
else if(условие для селлимита)
{ордерсенд}
 
Juer:

Com o que eles serão inicializados? Com que valores? Não está claro

Os que você escreve na lista de inicialização.

Suponha que eu tenha inicializado valores nos parâmetros de entrada do Expert Advisor. Portanto, preciso passá-los para cada objeto desta classe. Mas não para passá-los para cada objeto recém-criado.

Aqui está:

input int      i_nA     = 10;
input double   i_fB     = 20.0;
input datetime i_dtC    = D'2018.03.08 10:12:14';

class CCandle
{
   int         m_nA;
   double      m_fB;
   datetime    m_dtC;
   
public:
                     CCandle(void);
};

CCandle::CCandle(void)
         : m_nA(i_nA)
         , m_fB(i_fB)
         , m_dtC(i_dtC)
{
   Print("Создан объект со значениями: A = ", m_nA, ", B = ", m_fB, ", C = ", m_dtC);
}

int OnInit()
{
   CCandle arrclass[10];
     
   return(INIT_SUCCEEDED);
}

Se a executarmos, conseguimos:

0       22:09:36.706    Test EURUSD,M1 inputs: i_nA=10; i_fB=20.0; i_dtC=1520503934; 
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: initialized
0       22:09:36.995    Test EURUSD,M1: uninit reason 0
0       22:09:37.062    Script Test EURUSD,M1: removed
Razão: