Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Variável estática, será a mesma para todas as instâncias sem herança.
Checado, bem sim! acabou sendo mais simples do que isso!
2019.08.29 15:14:09.847 tst__ EURUSD,M15: inicializado
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: MyTerminalInfoString
Vejo que a variável Idioma só foi inicializada uma vez, ou seja, esta é uma solução mais simples
Obrigado!
Por favor, diga-me, qual é a diferença?
Criar um objeto, ou ponteiro, desta forma
da criação clássica
A diferença é que, no primeiro caso, não é necessário especificar o identificador de classeCClass em C++.
Eu esbocei minha classe, que deveria inicializar os campos uma vez com valores constantes, e parece funcionar como pretendido:
Eu não gosto de 2 coisas:
1. repito a chamada SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) - porque a ordem de inicialização não está definida, ou seja, não é certo que o VolumeSTEP será inicializado primeiro e só entãoGetDigitsInVolumeStep() será chamado
2. quero me livrar do método estático no GetDigitsInVolumeStep() - Vi um vídeo no youtube dizendo que no OOP puro não se deve usar métodos estáticos, e agora estou lutando contra moinhos de vento
o link para o vídeo, é essencialmente o mesmohttps://youtu.be/lfdAwl3-X_c ehttps://youtu.be/zME4SOCHT0I
como posso reescrever estes 2 pontos que não me agradam de maneira diferente?
1. repito a chamada para SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) - porque a ordem de inicialização não está especificada, ou seja, não é certo que eu terei o VolumeSTEP inicializado primeiro, e só então GetDigitsInVolumeStep() será chamado
1. Ou seja, você tem medo de que a ordem de inicialização estática seja indefinida? Na verdade não é, as vantagens se inicializam em ordem de definição no código. Portanto, não se preocupe, primeiro VolumeSTEP e depois VolumeDIGITS.
1) Então você teme que a ordem de inicialização estática seja indefinida? Na verdade, não é assim, em plus inicialização está em ordem de definição em código. Portanto, não se preocupe, primeiro VolumeSTEP e depois VolumeDIGITS.
Sim, não que eu tenha medo, digamos que estou protegido, acredito que o código deve ter pelo menos alguma garantia contra mudanças no comportamento de compilação - em geral SIM
ZS: Aqui em geral, por que o tópico para o uma vez apaed por dia - eu quero ver como realista para fazer algo como no vídeo que Egor diz, enquanto eu duvido que consigamos algo efetivo - agora eu estou usando métodos estáticos, e com a inicialização já surgiram algumas dúvidas
1. Ou seja, você tem medo de que a ordem de inicialização da estática seja indefinida? Na verdade não é, as vantagens se inicializam em ordem de definição no código. Portanto, não se preocupe, primeiro VolumeSTEP e depois VolumeDIGITS.
Também na MQL.
https://www.mql5.com/ru/docs/basis/oop/staticmembers
Sim, não que eu tenha medo, digamos que estou protegido, acredito que o código deve ter pelo menos alguma garantia contra mudanças no comportamento de compilação - em geral SIM
ZS: aqui em geral, porque o tema pela primeira vez por dia - quero ver como é realista fazer algo como no vídeo que Egor diz, enquanto duvido que consigamos algo efetivo - agora estou usando métodos estáticos, e com a inicialização já surgiram algumas dúvidas
Para utilizá-lo desta forma:
E em código como este:
Use da seguinte forma:
E no código como este:
oops, um pouco mal dirigido, é o que eu posso fazer
Eis o que eu quero alcançar em geral:
1. a classe CDeal é autônoma, ela abre/fecha/controla sua ordem por uma estratégia - as estratégias são enumeradas, então o otimizador percorre a mistura de estratégias
2. De acordo com o passo 1, eu não preciso de nenhum outro lugar para ter as variáveis de ambiente terminal SYMBOL_VOLUME_MAX, SYMBOL_VOLUME_MIN,SYMBOL_VOLUME_STEP e quantidade de caracteres em SYMBOL_VOLUME_STEP - não muda durante a operação do programa MQL
3. A partir dos itens 1 e 2, posso encapsular os métodos de abertura/fecho/trading de uma ordem e as próprias propriedades da ordem em uma classe CDeal - não vou usar tudo isso em nenhum lugar depois, vou? - ou seja, posso usar todos eles em uma classe
pp 1-3 tudo é solvível, mas... OK, agora você me ajudou com a estática, que assim seja, porque eu tenho uma referência, pelo menos eu posso fundamentar minha decisão de alguma forma, agora o código é assim
criou 3 instâncias do Cdeal, conseguiu-o no log:
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Inicializado
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::CdealVolumeMAX = 100000.0 , VolumeMIN = 0.01 , VolumeSTEP = 0.01 , VolumeDIGITS = 2
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::CdealVolumeMAX = 100000.0 , VolumeMIN = 0.01 , VolumeSTEP = 0.01 , VolumeDIGITS = 2
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::CdealVolumeMAX = 100000.0 , VolumeMIN = 0.01 , VolumeSTEP = 0.01 , VolumeDIGITS = 2
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::GetDigitsInVolumeStep
Até agora, tudo tem funcionado como planejado!
Isto é, agora não há seções de código repetido (chamadas) - é um código eficiente, mas como fugir do uso de funções estáticas int Cdeal::GetDigitsInVolumeStep() - no vídeo, o autor acredita que é possível escrever código OOP sem funções estáticas, vejo que não só é inconveniente, mas nem sempre é possível usar tudo, sobre os métodos Get and Set - muito provavelmente farei sem eles, verei mais tarde
A opção de campo estático tem uma enorme desvantagem. Você não pode ter valores diferentes deste campo em diferentes instâncias da classe.
Sim, obrigado, eu sei que o objetivo é apenas obter um código eficiente sem variáveis excessivas e uso desnecessário de memória.
Ainda não resolvi a questão:como evitar o uso da função estática int Cdeal::GetDigitsInVolumeStep()
Aqui está um esboço da minha aula, que deve inicializar os campos uma vez com valores constantes, parece funcionar como pretendido: