Inglês (original): Gostaria de fazer uma solicitação de recurso de idioma MQL. Se este não for o tópico correto, informe-me. A solicitação original está no fórum em inglês ...
Russo (tradução do Google): Gostaria de fazer uma solicitação de recurso de idioma MQL.Se este não for o tópico correto, por favor, me avise.A solicitação original está no fórum em inglês ...
Mais um lifehack para direitos de acesso: Se você tiver um desejo irresistível de conceder acesso a campos/funções privados de uma classe para outra classe, poderá fazer o seguinte usando ferramentas MQL padrão:
Precisamos: fazer o acesso a A::f1() de B
//--------- как былоclass A
{
int m;
int f1() {return m;} // нужно дать к нему доступ классу Bpublic:
A(int a): m(a) {}
};
class B {};
Vamos reescrever dessa forma:
class A;
class B
{
private:
class AB
{
public:
virtualint CallAf1(A&) const = 0;
AB() {ABptr = &this;}
} static *ABptr;
// внутри B используем этот метод для получения доступа к A::f1()staticint CallAf1(A & obj)
{
return ABptr.CallAf1(obj);
}
public:
class AB2: AB {};
// вспомогательный метод - только для проверкиstaticvoid _f1_test(A & obj)
{
Print("test ", CallAf1(obj));
}
};
B::AB *B::ABptr = NULL;
class A
{
int m;
int f1() {return m;}
public:
A(int a): m(a) {}
//-- добавленоprivate:
class AB3: B::AB2
{
int CallAf1(A &obj) const {return obj.f1();}
} staticconst ABlink;
};
const A::AB3 A::ABlink;
Para chamar (A)a.f1() dentro de B, chame CallAf1(a). Se f1() tiver parâmetros, nós os adicionaremos a CallAf1().
Teste:
voidOnStart()
{
A f(2);
B::_f1_test(f);
}
Você pode tornar CallAf1() protegida, mas isso será um grande buraco nos direitos de acesso - em qualquer lugar do código, você pode criar um descendente da classe B e, nele, um método público para chamar CallAf1() - ou seja, todos terão acesso a A::f1().
P.S. A construção é muito complicada (se você quiser, pode colocá-la em macros), mas tem uma vantagem sobre o friend C++: ela não dá acesso a todos os membros da classe, mas apenas aos selecionados.
Mais uma dica de vida para direitos de acesso: Se você tiver um desejo irresistível de conceder acesso a campos/funções privados de uma classe para outra classe, poderá fazer isso usando as ferramentas MQL padrão
Demorei muito tempo para entender isso... boa jogada com a virtualização, obrigado!
fxsaber #: Demorou muito tempo para entrar no assunto... boa jogada com a virtualização, obrigado!
A única coisa que não escrevi no início é que você não pode criar mais nenhum objeto da classe B::AB2 (e seus descendentes), caso contrário, tudo vai desmoronar :-)
A execução desse Expert Advisor no Testador no modo de todos os símbolos
inputint inTmp = 0; // https://www.mql5.com/ru/forum/321656/page90#comment_44727856bool Res = true;
// Проверяет, нормализована ли цена по алгоритму NormalizeDouble.bool IsNDPrice( constdouble &Price )
{
return(Price == NormalizeDouble(Price, 5));
}
// Проверяет, нормализована ли цена, как при парсинге или ручном вводе.bool IsNDPrice2( constdouble &Price )
{
return(Price == (double)DoubleToString(Price, 5));
}
voidOnTick()
{
MqlTick Tick;
if (SymbolInfoTick(_Symbol, Tick))
// Res &= IsNDPrice(Tick.bid) && IsNDPrice(Tick.ask); // OnTester == 1.
Res &= IsNDPrice2(Tick.bid) && IsNDPrice2(Tick.ask); // OnTester == 0.
}
doubleOnTester()
{
return(Res);
}
mostra que todos os preços são normalizados usando o algoritmo NormalizeDouble. E que, se você trabalhar com preços obtidos não do Terminal, mas por análise ou entrada manual, eles exigirão normalização para a operação correta. Não há necessidade de se enganar.
REASON_ACCOUNT (mesmo que a conta não seja alterada, mas apenas o login seja feito novamente), o Expert Advisor é completamente descarregado e uma nova cópia é carregada.
Por esse motivo, o ExpertRemove no OnDeinit não afeta a nova cópia, pois toca a cópia descarregada.
Após o Deinit, a nova cópia do EA aguarda mais de um segundo (até dois segundos) para iniciar. Quais são os motivos de uma espera tão longa e é possível acelerá-la?
SymbolInfoTick retornará o tick mais recente em cada uma dessas três chamadas. Ou seja, a chamada coleta de ticks sem pular os indicadores é questionável, para dizer o mínimo.
Prova da impossibilidade de coletar ticks por um indicador (sem pulos).
Inglês (original): Gostaria de fazer uma solicitação de recurso de idioma MQL. Se este não for o tópico correto, informe-me. A solicitação original está no fórum em inglês ...
Russo (tradução do Google): Gostaria de fazer uma solicitação de recurso de idioma MQL. Se este não for o tópico correto, por favor, me avise. A solicitação original está no fórum em inglês ...
Como preencher uma matriz com uma linha?
clr_struct clr[] = {{0x999999}, {0x999999}};Mais um lifehack para direitos de acesso: Se você tiver um desejo irresistível de conceder acesso a campos/funções privados de uma classe para outra classe, poderá fazer o seguinte usando ferramentas MQL padrão:
Precisamos: fazer o acesso a A::f1() de B
Vamos reescrever dessa forma:
Para chamar (A)a.f1() dentro de B, chame CallAf1(a). Se f1() tiver parâmetros, nós os adicionaremos a CallAf1().
Teste:
Você pode tornar CallAf1() protegida, mas isso será um grande buraco nos direitos de acesso - em qualquer lugar do código, você pode criar um descendente da classe B e, nele, um método público para chamar CallAf1() - ou seja, todos terão acesso a A::f1().
P.S. A construção é muito complicada (se você quiser, pode colocá-la em macros), mas tem uma vantagem sobre o friend C++: ela não dá acesso a todos os membros da classe, mas apenas aos selecionados.
Mais uma dica de vida para direitos de acesso: Se você tiver um desejo irresistível de conceder acesso a campos/funções privados de uma classe para outra classe, poderá fazer isso usando as ferramentas MQL padrão
Demorou muito tempo para entrar no assunto... boa jogada com a virtualização, obrigado!
REASON_ACCOUNT (mesmo que a conta não seja alterada, mas apenas o login seja feito novamente), o Expert Advisor é completamente descarregado e uma nova cópia é carregada.
Por esse motivo, o ExpertRemove no OnDeinit não afeta a nova cópia, pois toca a cópia descarregada.
Resultado após o relogin.
Após o Deinit, a nova cópia do EA aguarda mais de um segundo (até dois segundos) para iniciar. Quais são os motivos de uma espera tão longa e é possível acelerá-la?
SymbolInfoTick retornará o tick mais recente em cada uma dessas três chamadas. Ou seja, a chamada coleta de ticks sem pular os indicadores é questionável, para dizer o mínimo.
Prova da impossibilidade de coletar ticks por um indicador (sem pulos).
Resultado.
Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação
Erros, bugs, perguntas
fxsaber, 2023.02.14 13:11
Infelizmente, a MQL4 ainda não faz esse tipo de trabalho.