Discussão do artigo "Biblioteca para o desenvolvimento fácil e rápido de programas para a MetaTrader (parte IV): eventos de negociação"
Artyom Trishkin, obrigado por seu trabalho, parece uma biblioteca poderosa. Por favor, se não for difícil, indique brevemente qual funcionalidade planeja cobrir (já coberta e em preparação para publicação), exceto o trabalho com ordens/histórico. Acabei de começar a escrever uma biblioteca semelhante com base em uma biblioteca padrão, mas comecei pelo lado da funcionalidade como ferramentas de análise técnica. A ideia é escrever todas as ferramentas de análise usadas em TA e RA clássicas na biblioteca e torná-las interoperáveis com ferramentas de indicadores e outras. CExpertSignal.
Talvez, se a sua funcionalidade abranger o que planejei, eu deva considerar a opção de continuar desenvolvendo o que você já escreveu.
Artyom Trishkin, obrigado por seu trabalho, parece uma biblioteca poderosa. Por favor, se não for difícil, indique brevemente qual funcionalidade planeja cobrir (já coberta e em preparação para publicação), exceto o trabalho com ordens/histórico. Acabei de começar a escrever uma biblioteca semelhante com base em uma biblioteca padrão, mas comecei pelo lado da funcionalidade como ferramentas de análise técnica. A ideia é escrever todas as ferramentas de análise usadas em TA e RA clássicas na biblioteca e torná-las interoperáveis com ferramentas de indicadores e outras. CExpertSignal.
Talvez, se a sua funcionalidade abranger o que planejei, eu deva considerar a opção de continuar desenvolvendo o que você já escreveu.
Tudo o que está descrito atualmente nos artigos é apenas o começo. Trabalhar com sistemas de ordens de terminal será muito simples. Fornecer ao programa, sob demanda, quase todos os dados sobre qualquer ordem, negociação, posição, evento que já tenha ocorrido, etc. Essa é a questão dos sistemas de ordens. Até que o trabalho e a publicação de artigos sobre o trabalho com sistemas de ordens de ambos os terminais sejam concluídos e publicados, outras funcionalidades não serão publicadas - tudo em ordem.
Mas, de acordo com a estrutura estabelecida, o trabalho com dados de preços, o trabalho com indicadores, com objetos gráficos será preparado e publicado, haverá um shell gráfico completo na tela, integrado à estrutura da biblioteca de acordo com o paradigma estabelecido inicialmente. Ou seja, será possível usar totalmente apenas uma biblioteca sem a necessidade de acoplá-la a outras bibliotecas. Por exemplo: obter dados clicando no ícone de uma posição aberta, uma ordem estabelecida, obter dados clicando em uma barra de preços, pesquisar alguns dados nas coleções existentes, processá-los etc.
Pretendo organizar o acesso rápido e conveniente de modo que o usuário não tenha que pensar em como obter os dados necessários, mas apenas solicitá-los e obtê-los com uma das inúmeras funções que serão preparadas, cuja lista completa será compilada e publicada nos artigos finais desta série.
Há muitos planos e muitos desenvolvimentos. Estou preparando o material. Incluindo solicitações (das quais ainda não há nenhuma
)
Tudo o que está descrito nos artigos agora é apenas o começo. Trabalhar com os sistemas de ordens dos terminais será muito simples. Fornecer ao programa, sob demanda, quase todos os dados sobre qualquer ordem, negociação, posição, evento que já tenha ocorrido, etc. Essa é a questão dos sistemas de ordens. Até que o trabalho e a publicação de artigos sobre o trabalho com sistemas de ordens de ambos os terminais sejam concluídos e publicados, outras funcionalidades não serão publicadas - tudo em ordem.
Mas, de acordo com a estrutura estabelecida, o trabalho com dados de preços, o trabalho com indicadores, com objetos gráficos será preparado e publicado, haverá um shell gráfico completo na tela, integrado à estrutura da biblioteca de acordo com o paradigma estabelecido inicialmente. Ou seja, será possível usar totalmente apenas uma biblioteca sem a necessidade de acoplá-la a outras bibliotecas. Como exemplo, obter dados clicando no ícone de uma posição aberta, uma ordem estabelecida, obter dados clicando em uma barra de preços, pesquisar alguns dados nas coleções existentes, processá-los etc.
Pretendo organizar o acesso rápido e conveniente de tal forma que o usuário não precise pensar em como obter os dados necessários, mas apenas solicitá-los e obtê-los com uma das inúmeras funções que serão preparadas, cuja lista completa será compilada e publicada nos artigos finais desta série.
Há muitos planos e muitos desenvolvimentos. Estou preparando o material. Incluindo solicitações (que ainda não estão disponíveis).
Muito interessante. Já vi duas versões semelhantes da biblioteca aqui. Universal Expert Advisor e biblioteca multiplataforma. A primeira não é exatamente multiplataforma. E a segunda tem muitas desvantagens, em particular, não possui muitas funções que seriam multiplataforma. Por exemplo, horário de abertura ou preço de abertura de uma posição/ordem. Você precisa usar as macros da versão MQL e escrever o código separadamente. Mas há muitas coisas interessantes, em particular, gosto da presença de vários stops, o trailing é muito poderoso e personalizável. MM opções interessantes. Esta é uma série de artigos aqui de algum italiano, acho que você entendeu a ideia. De qualquer forma, é interessante ver o que você consegue e seria ótimo se você utilizasse a experiência de desenvolvimentos semelhantes anteriores e aproveitasse o melhor. Obrigado.
Muito interessante. Já vi duas versões semelhantes da biblioteca aqui. Universal Expert Advisor e Cross-platform Library. A primeira não é realmente multiplataforma. E a segunda tem muitas desvantagens, em particular, a falta de muitas funções que seriam multiplataforma. Por exemplo, horário de abertura ou preço de abertura de uma posição/ordem. Você precisa usar as macros da versão MQL e escrever o código separadamente. Mas há muitas coisas interessantes lá, em particular, gosto da presença de vários stops, o trailing é muito poderoso e personalizável. MM opções interessantes. Esta é uma série de artigos aqui de algum italiano, acho que você entendeu a ideia. De qualquer forma, é interessante ver o que você consegue e seria ótimo se você utilizasse a experiência de desenvolvimentos semelhantes anteriores e aproveitasse o melhor. Muito obrigado.
Obrigado pela opinião. Mas não posso ler artigos e pesquisar o que preciso porque não tenho tempo para isso, mas receber solicitações de funcionalidades futuras, planejá-las e incluí-las na lista para implementação é sempre bem-vindo. Haveria sugestões. Até o momento, estou fazendo o que foi originalmente planejado para implementação.
Essa biblioteca funcionará com instrumentos de câmbio no Moex?
Na minha opinião, você não deve sobrecarregar a biblioteca para trabalhar com ordens com outras funcionalidades não relacionadas ao gerenciamento de dinheiro; é melhor criar bibliotecas separadas.
E sim, está faltando uma descrição detalhada do manual da biblioteca.
Essa biblioteca funcionará com instrumentos de estoque no Moex?
Na minha opinião, você não deve sobrecarregar a biblioteca para trabalhar com ordens com outras funcionalidades não relacionadas ao gerenciamento de dinheiro; é melhor criar bibliotecas separadas.
E sim, está faltando uma descrição detalhada do manual da biblioteca.
Os testes mostrarão. O que for notado - será corrigido. Haverá documentação para a biblioteca. Não imediatamente.
Artem, sobre os desejos - acho que sim - se você tiver alguma ideia em termos de escolher o caminho a seguir nesta ou naquela decisão, o que é importante e o que descartar, etc...,
então você pode publicar sua formulação na forma de uma enquete, etc., os membros do fórum terão prazer em dar feedback sobre o que pensam a respeito.
Mas para alguém desejar algo específico, sem conhecer todas as ideias do projeto, parece-me uma falha, porque você sabe, como sempre - mesmo em uma biblioteca já pronta e documentada, todos a leem de forma diferente e tiram dela algo próprio que é relevante para ele no momento.
Portanto, desejo-lhe sucesso e determinação em sua empreitada! :)
Lido, compilado, funcionando!
Se eu pudesse dar 5 de 5 estrelas
Top Artyom
Lido, compilado e em execução!
Se eu pudesse avaliar 5 de 5 estrelas
Top Artyom
Artem, antes de mais nada. Antes de mais nada. Gostaria de dizer muito obrigado pela série de artigos e pela biblioteca. Entendi tudo sobre OOP lendo seus artigos! Seus artigos realmente ensinam e ajudam aqueles que precisam, eles me ajudaram. Seu uso de algoritmos diferentes nos mesmos lugares em que você poderia simplesmente se repetir também é muito bem-sucedido.
Agora, se eu puder ir direto ao ponto: ::GetListByTime - nesse método, você seleciona as ordens por intervalo de tempo para passar a lista para o programa de chamada; na Parte 3, você escreve que:
"A propriedade desejada para pesquisa e comparação é definida nas propriedades da ordem, dependendo do horário pelo qual a lista é classificada: se for pelo horário de abertura, a propriedade para pesquisa será horário de abertura, se for pelo horário de fechamento, as ordens serão comparadas pelo horário de fechamento etc."
Mas como? - No próprio método, não há possibilidade de alterar a classificação da lista de ordens com a qual estamos trabalhando.
Entendo, mas posso estar errado, que quaisquer que sejam os intervalos de tempo que passarmos (horário de fechamento, por exemplo), os métodos SearchGreatOrEqual() e SearchLessOrEqual() pesquisarão a lista ordenada pelo horário de abertura do MT5 e pelo horário de fechamento do MT4? Como, por padrão, a inicialização da lista de ordens no construtor da classe COrder collections é especificada principalmente pelo horário de abertura ou ticket da ordem.
//+------------------------------------------------------------------+ //| Construtor| //+------------------------------------------------------------------+ CHistoryCollection::CHistoryCollection(void) : m_index_deal(0),m_delta_deal(0),m_index_order(0),m_delta_order(0),m_is_trade_event(false) { this.m_list_all_orders.Sort(#ifdef __MQL5__ SORT_BY_ORDER_TIME_OPEN #else SORT_BY_ORDER_TIME_CLOSE #endif ); this.m_list_all_orders.Clear(); this.m_list_all_orders.Type(COLLECTION_HISTORY_ID); }
//+------------------------------------------------------------------+ //| Construtor| //+------------------------------------------------------------------+ CMarketCollection::CMarketCollection(void) : m_is_trade_event(false),m_is_change_volume(false),m_change_volume_value(0) { this.m_list_all_orders.Sort(SORT_BY_ORDER_TIME_OPEN); this.m_list_all_orders.Clear(); this.m_list_all_orders.Type(COLLECTION_MARKET_ID); ::ZeroMemory(this.m_struct_prev_market); this.m_struct_prev_market.hash_sum=WRONG_VALUE; this.m_list_control.Clear(); this.m_list_control.Sort(); this.m_list_changed.Clear(); this.m_list_changed.Sort(); this.m_k_pow=(ulong)pow(10,6); }
Portanto, o método acima (::GetListByTime) funcionará assim, sempre pesquisando pelo horário de abertura do MT5 ou pelo horário de fechamento do MT4.
//--- Compara objetos COrder entre si por todas as propriedades possíveis (para classificar listas pela propriedade especificada do objeto COrder
virtual int Compare(const CObject *node,const int mode=0) const;
você escreveu de forma muito restrita(restrita - não significa que estejaerrado) e usará o modo de classificação selecionado no construtor da classe de coleções de pedidos da biblioteca MQL padrão ao pesquisar pedidos de acordo com o modelo. Portanto: (na Parte 3)
//+------------------------------------------------------------------+ //| Seleciona ordens da coleção ao longo do tempo //| no intervalo de begin_time a end_time | //+------------------------------------------------------------------+ CArrayObj *CHistoryCollection::GetListByTime(const datetime begin_time=0,const datetime end_time=0, const ENUM_SELECT_BY_TIME select_time_mode=SELECT_BY_TIME_CLOSE) { ENUM_ORDER_PROP_INTEGER property=(select_time_mode==SELECT_BY_TIME_CLOSE ? ORDER_PROP_TIME_CLOSE : ORDER_PROP_TIME_OPEN); CArrayObj *list=new CArrayObj(); if(list==NULL) { ::Print(DFUN+TextByLanguage("Erro de criação de lista temporária","Error creating temporary list")); return NULL; } datetime begin=begin_time,end=(end_time==0 ? END_TIME : end_time); if(begin_time>end_time) begin=0; list.FreeMode(false); ListStorage.Add(list); //--- this.m_order_instance.SetProperty(property,begin); int index_begin=this.m_list_all_orders.SearchGreatOrEqual(&m_order_instance); if(index_begin==WRONG_VALUE) return list; this.m_order_instance.SetProperty(property,end); int index_end=this.m_list_all_orders.SearchLessOrEqual(&m_order_instance); if(index_end==WRONG_VALUE) return list; for(int i=index_begin; i<=index_end; i++) list.Add(this.m_list_all_orders.At(i)); return list; }
não são necessários, pois a biblioteca padrão (métodos SearchGreatOrEqual() e SearchLessOrEqual()) ainda fará a busca pelo código de classificação passado no construtor.
Você pode simplesmente remover essas linhas destacadas em vermelho e adicionar linhas de compilação condicional para definir a propriedade do objeto:
COrder m_order_instance; // Objeto de pedido para pesquisa por propriedade Ainda assim, a lista pode ser classificada de apenas duas maneiras: abrindo o MT5 ou fechando o MT4?
RIGHT?
P.S.: isso é necessário apenas para entender a lógica da OOP!!!?
- www.mql5.com
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Novo artigo Biblioteca para o desenvolvimento fácil e rápido de programas para a MetaTrader (parte IV): eventos de negociação foi publicado:
Nos artigos anteriores, nós começamos a criar uma grande biblioteca multi-plataforma, simplificando o desenvolvimento de programas para as plataformas MetaTrader 5 e MetaTrader 4. Nós já temos as coleções do histórico de ordens e negócios, ordens e posições de mercado, bem como a classe para a seleção conveniente e ordenação das ordens. Nesta parte, nós continuaremos com o desenvolvimento do objeto base e ensinaremos a Biblioteca Engine a monitorar os eventos de negociação na conta.
Vamos iniciar o EA no testador e experimentar os botões:
Tudo está ativado corretamente e o diário recebe as mensagens sobre os eventos ocorridos.
Atualmente, o último evento é sempre fixo. Em outras palavras, se nós fecharmos várias posições simultaneamente, apenas a última posição dentre as várias fechadas se encontrará no evento. O fechamento em massa pode ser monitorado pelo número de novos negócios ou ordens do histórico. É possível, então, obter a lista de todas as posições encerradas recentemente por seu número e definir o seu conjunto inteiro. Vamos desenvolver uma classe de coleção de eventos separada para isso. Isso nos permitirá ter acesso constante a todos os eventos ocorridos no programa.
Autor: Artyom Trishkin