Discussão do artigo "Biblioteca para desenvolvimento fácil e rápido de programas para a MetaTrader (parte I). Conceito, gerenciamento de dados e primeiros resultados" - página 4
Obrigado, a explicação está clara. Mas ainda há uma pergunta - está claro que é mais rápido no MT4, mas se estivermos falando de 5 - é mais rápido executar todos os métodos separadamente do que chamar um CopyRates? Se sim, então faz sentido criar uma estrutura/classe de barra em vez de MQLRates, que escreveria não todos os campos, mas apenas os necessários em nosso caso, por máscara, por exemplo.
Obrigado, a explicação está clara. Mas ainda há uma pergunta - está claro que é mais rápido no MT4, mas se estivermos falando de 5 - é mais rápido executar todos os métodos separadamente do que chamar um CopyRates? Se sim, faz sentido criar sua própria estrutura/classe de barra em vez de MQLRates, que escreveria não todos os campos, mas apenas os necessários em nosso caso, por máscara, por exemplo.
Como se trata de uma biblioteca em desenvolvimento, aguardarei mais artigos antes de fazer qualquer comentário global.
No entanto, notei duas situações problemáticas em potencial nessa primeira parte:
Em primeiro lugar.
Sometimes, you may want to get the number of decimal places in a symbol lot. Let's enter this function to our file of service functions:
//+------------------------------------------------------------------+
//| Retorna o número de casas decimais em um lote de símbolos
//+------------------------------------------------------------------+
uint DigitsLots(conststring symbol_name)
{
return (int)ceil(fabs(log(SymbolInfoDouble(symbol_name,SYMBOL_VOLUME_STEP))/log(10)));
}
1.a A solução proposta usando log não é universal. Em alguns símbolos, você pode perfeitamente ter uma etapa de volume de 0,25, por exemplo, e o DigitsLots() retornará uma resposta errada nesse caso.
1.b Por que você quer o "número de casas decimais em um lote de símbolo"? Não vejo nenhum caso de uso real para isso.
1.c Se você realmente quiser usar a função log e for lidar com casos especiais em outro lugar, deverá usar log10, em vez de logaritmo natural.
1.d Fornecer essa função na interface pública pode levar a resultados ineficientes, pois ela usa 5 chamadas de função e pode ser chamada várias vezes em cada tick.
Em segundo lugar.
intOnInit()
{
//---
list_all_orders.Sort();
list_all_orders.Clear();
if(!HistorySelect(0,TimeCurrent()))
{
Print(DFUN,TextByLanguage(": Не удалось получить историю сделок и ордеров",": Failed to get history of deals and orders"));
returnINIT_FAILED;
}
...
2.a Essa não é a maneira correta de chamar HistorySelect(), pois você pode perder algumas informações do histórico, já que TimeCurrent() retorna a última data de tick conhecida do servidor do corretor. Justificativa aqui e por experiência própria.
2.b É um mau exemplo usar TimeCurrent() na função OnInit() quando não há garantia de conexão com o corretor. Em geral, é uma má ideia fazer qualquer solicitação de dados em OnInit().
Obrigado pelos comentários, mas este é apenas um teste.
Considerarei a possibilidade de alterar a função para outra - completamente universal
O número de casas decimais para o lote de cada símbolo individual é necessário para o envio inequívoco de ordens de negociação
Sua função com log10 não tem o problema mencionado por você com uma etapa de lote de 0,25?
Os dados sobre o número de casas decimais são gravados uma vez no objeto da classe-símbolo. Isso será aprofundado em artigos posteriores.
Uma verificação de teste em OnInit () é necessária apenas para verificação. E somente lá eu obtenho o histórico de ordens dessa forma. Em coleções de ordens, negócios e posições - caso contrário.
Tudo isso em artigos posteriores.
-------------
Спасибо за комментарии, но это всего лишь тест.
я рассмотрю возможность изменения функции на иную - полностью универсальную
количество знаков после запятой для лота каждого отдельного символа нужно для безошибочной отправки торговых приказов
ваша функция с log10 не имеет озвученной вами проблемы с шагом лота 0.25 ?
данные о количестве знаков после запятой записываются единожды в объект класса-символ. Это будет далее - в последующих статьях
Тестовая проверка в OnInit() нужна всего лишь именно для проверки. И только там историю ордеров получаю таким образом. В коллекциях ордеров, сделок и позиций - иначе.
Obrigado pelos comentários, mas este é apenas um teste.
Considerarei a possibilidade de alterar a função para outra - completamente universal
O número de casas decimais para o lote de cada símbolo individual é necessário para o envio inequívoco de ordens de negociação
Sua função com log10 não tem o problema mencionado por você com uma etapa de lote de 0,25?
Os dados sobre o número de casas decimais são gravados uma vez no objeto da classe-símbolo. Isso será abordado em artigos posteriores.
Uma verificação de teste em OnInit () é necessária apenas para verificação. E somente lá eu obtenho o histórico de ordens dessa forma. Em coleções de ordens, negócios e posições - caso contrário.
Tudo isso em artigos posteriores.
1. Bom.
2. Isso não é necessário se você normalizar seu lote corretamente, algo como :
Usar os dígitos do lote só pode levar a problemas.
3. log10 tem o mesmo problema, não é universal. Foi apenas para evitar a chamada inútil para log(10).
4. Bom.
Sei que é apenas para verificar, mas mesmo com o código de teste disponível publicamente, acho que temos a responsabilidade de mostrar e usar boas práticas.
2. Não é necessário se você normalizar seu lote corretamente, algo como :
Usar os dígitos do lote só pode causar problemas.
3. log10 tem o mesmo problema, não é universal. Foi apenas para evitar a chamada inútil para log(10).
4. Bom.
Sei que é apenas para verificar, mas mesmo com o código de teste disponível publicamente, acho que temos a responsabilidade de mostrar e usar boas práticas.
trabalhando passo a passo de acordo com o artigo. Você pode estar errado e não entender.
Há duas maneiras de criar um método de classe - diretamente no corpo da classe:
class CMyClass
{
bool Flag(void) { returnfalse; }
}
e fora do corpo da classe:
class CMyClass
{
bool Flag(void);
}
//--- método implementado fora do corpo da classebool CMyClass::Flag(void) { returnfalse; }
No primeiro caso, o método é definido e implementado diretamente no corpo da classe - é conveniente fazer isso para métodos curtos que não ocupam muitas linhas. Mas se o método for grande, é mais conveniente declará-lo no corpo da classe e colocar a implementação fora do corpo da classe, como no segundo exemplo.
Está claro que é mais conveniente escrever o método dentro do corpo da classe. Mas o método sobre o qual você está perguntando é mais conveniente escrevê-lo separadamente do corpo da classe.
No entanto, você pode fazer download de todos os arquivos anexados ao artigo - eles já contêm tudo, estão prontos para uso - e usá-los para estudar o que está descrito no artigo.
Obrigado, a explicação está clara. Mas ainda há uma pergunta - está claro que é mais rápido no MT4, mas se estivermos falando de 5 - é mais rápido executar todos os métodos separadamente do que chamar um CopyRates? Se sim, então faz sentido criar uma estrutura/classe de barra em vez de MQLRates, que escreveria não todos os campos, mas apenas os necessários em nosso caso, por máscara, por exemplo.
Obrigado, a explicação está clara. Mas ainda há uma pergunta - está claro que é mais rápido no MT4, mas se estivermos falando de 5 - é mais rápido executar todos os métodos separadamente do que chamar um CopyRates? Se sim, faz sentido criar sua própria estrutura/classe de barra em vez de MQLRates, que escreveria não todos os campos, mas apenas os necessários em nosso caso, por máscara, por exemplo.
Tente fazer isso.
Você não vai atualizar?
Не понял вопроса.
Não estou entendendo a pergunta.
Como se trata de uma biblioteca em desenvolvimento, aguardarei mais artigos antes de fazer qualquer comentário global.
No entanto, notei duas situações problemáticas em potencial nessa primeira parte:
Em primeiro lugar.
Sometimes, you may want to get the number of decimal places in a symbol lot. Let's enter this function to our file of service functions:
Em segundo lugar.
Obrigado pelos comentários, mas este é apenas um teste.
Uma verificação de teste em OnInit () é necessária apenas para verificação. E somente lá eu obtenho o histórico de ordens dessa forma. Em coleções de ordens, negócios e posições - caso contrário.
Tudo isso em artigos posteriores.
-------------
Спасибо за комментарии, но это всего лишь тест.
Тестовая проверка в OnInit() нужна всего лишь именно для проверки. И только там историю ордеров получаю таким образом. В коллекциях ордеров, сделок и позиций - иначе.
Всё это в последующих статьях.Obrigado pelos comentários, mas este é apenas um teste.
Uma verificação de teste em OnInit () é necessária apenas para verificação. E somente lá eu obtenho o histórico de ordens dessa forma. Em coleções de ordens, negócios e posições - caso contrário.
Tudo isso em artigos posteriores.
1. Bom.
2. Isso não é necessário se você normalizar seu lote corretamente, algo como :
Usar os dígitos do lote só pode levar a problemas.
3. log10 tem o mesmo problema, não é universal. Foi apenas para evitar a chamada inútil para log(10).
4. Bom.
Sei que é apenas para verificar, mas mesmo com o código de teste disponível publicamente, acho que temos a responsabilidade de mostrar e usar boas práticas.
Lerei outros artigos.
1. Bom.
2. Não é necessário se você normalizar seu lote corretamente, algo como :
Usar os dígitos do lote só pode causar problemas.
3. log10 tem o mesmo problema, não é universal. Foi apenas para evitar a chamada inútil para log(10).
4. Bom.
Sei que é apenas para verificar, mas mesmo com o código de teste disponível publicamente, acho que temos a responsabilidade de mostrar e usar boas práticas.
Lerei outros artigos.
Olá
Você pode me considerar seu participante ou aluno, por assim dizer.
Decidi estudar sua biblioteca, mas é difícil para mim, embora eu saiba algumas coisas em MQL, mas tropecei na primeira etapa.
Cheguei ao ponto Implementação do método de comparação de duas ordens entre si por uma determinada propriedade:
Este é o código na biblioteca, onde escrevê-lo
depois de
ou na classe protegida da ordem abstrata.
Entenda que não sou mais jovem, os jovens conseguem entender isso na hora.
E também abri um tópico no fórum em Artigos e biblioteca técnica sobre negociação automatizada (12560), sou um estudante lá e vou duplicar este tópico,
trabalhando passo a passo de acordo com o artigo. Você pode estar errado e não entender.
Olá
Você pode me considerar seu candidato ou aluno, por assim dizer.
Decidi estudar sua biblioteca, mas é difícil para mim, embora eu saiba alguma coisa sobre MQL, mas tropecei na primeira etapa.
Cheguei ao ponto Realização do método de comparação de duas ordens entre si por uma determinada propriedade:
Este é o código na biblioteca, onde escrevê-lo
depois de
ou na classe protegida da ordem abstrata
Entenda que não sou mais jovem, mas os jovens conseguem entender isso rapidamente.
E também abri um tópico no fórum em Artigos e biblioteca técnica sobre negociação automatizada (12560) Sou um estudante lá e vou duplicar este tópico Gostaria de uma resposta detalhada de vocês sobre a estrutura,
trabalhando passo a passo de acordo com o artigo. Você pode estar errado e não entender.
Há duas maneiras de criar um método de classe - diretamente no corpo da classe:
e fora do corpo da classe:
No primeiro caso, o método é definido e implementado diretamente no corpo da classe - é conveniente fazer isso para métodos curtos que não ocupam muitas linhas. Mas se o método for grande, é mais conveniente declará-lo no corpo da classe e colocar a implementação fora do corpo da classe, como no segundo exemplo.
Está claro que é mais conveniente escrever o método dentro do corpo da classe. Mas o método sobre o qual você está perguntando é mais conveniente escrevê-lo separadamente do corpo da classe.
No entanto, você pode fazer download de todos os arquivos anexados ao artigo - eles já contêm tudo, estão prontos para uso - e usá-los para estudar o que está descrito no artigo.