Discussão do artigo "Biblioteca para criação simples e rápida de programas para MetaTrader (Parte XXXIV): exclusão de ordens, modificação de ordens/posições por condições"
Boa tarde!
Obrigado pela série de artigos e obrigado pelo código adaptado para MQL4!
Com relação aos exemplos práticos.
A tarefa é,
- Quando ocorrerem determinadas condições de mercado, abrir várias posições na mesma direção com os mesmos níveis de fechamento para perdas e níveis diferentes para lucros.
- Quando condições semelhantes ocorrerem abaixo/acima, abrir várias outras posições na mesma direção, novamente com os mesmos níveis de fechamento de perda e diferentes níveis de lucro + alterar o nível de perda das posições abertas para zero.
- o tamanho agregado do primeiro conjunto de posições deve ser determinado levando-se em conta uma perda de 2% do balanço patrimonial
- o tamanho cumulativo do segundo conjunto de posições deve ser determinado levando-se em conta uma perda de 2% nos fundos
- não é esperado trabalhar com ordens pendentes.
Meu Expert Advisor MQL4 já implementou um algoritmo para encontrar pontos de entrada, mas ainda não há operações de negociação.
Atenção, pergunta ))
Qual das bibliotecas, classes e métodos da primeira série me ajudaria a acelerar o desenvolvimento?
- www.mql5.com
Boa tarde!
Obrigado pela série de artigos e obrigado pelo código adaptado para MQL4!
Com relação aos exemplos práticos.
Há uma tarefa,
- quando ocorrerem determinadas condições de mercado, abrir várias posições na mesma direção com os mesmos níveis de fechamento de perda e diferentes níveis de lucro.
- Quando ocorrerem condições semelhantes abaixo/acima, abrir várias outras posições na mesma direção, novamente com os mesmos níveis de fechamento de perda e diferentes níveis de lucro + alterar o nível de perda das posições abertas para zero.
- o tamanho agregado do primeiro conjunto de posições deve ser determinado levando-se em conta uma perda de 2% do balanço patrimonial
- o tamanho cumulativo do segundo conjunto de posições deve ser determinado levando-se em conta uma perda de 2% nos fundos
- não se pressupõe o trabalho com ordens pendentes
Meu Expert Advisor MQL4 já implementou um algoritmo para encontrar pontos de entrada, mas ainda não há operações de negociação.
Atenção, pergunta ))
Qual das bibliotecas, classes e métodos da primeira série me ajudaria a acelerar o desenvolvimento?
Não é uma descrição completa.
1) Abrimos posições definindo imediatamente o identificador do primeiro grupo no número mágico para que seja o mesmo para elas. Agora, todo o primeiro grupo pode ser pesquisado pelo identificador 1.
2) Abrimos posições, definindo-as imediatamente para o identificador do segundo grupo no número mágico que é o mesmo para elas. Agora, todo o segundo grupo pode ser pesquisado pelo identificador 2.
2.1 Depois de abrir o segundo grupo de posições, selecione todas as posições do grupo 1 na lista e modifique seus níveis de Stop Loss para o nível de Breakeven calculado para elas. O nível deve ser calculado independentemente. A lista de posições do primeiro grupo está disponível - seu lucro/perda acumulado é facilmente calculado.
3. Esse item é o volume acumulado? Se sim, calcule-o antes de abrir o primeiro grupo de posições.
4. esse item é o volume total? Se sim, calcule-o antes de abrir o segundo grupo de posições. Mas os fundos dependerão da margem ocupada pelo primeiro grupo e de seu lucro/perda - lucro/perda flutuante em fundos livres.
5. É conveniente usar as solicitações pendentes apenas para definir todas as condições necessárias para a abertura de grupos. Planeje com antecedência e defina a expectativa. Não insisto - é um meio de planejar táticas e técnicas de negociação.
A resposta - tudo isso está na primeira parte, para perceber o que se pretende. Não entendo a pergunta - não há tentativa de tentar algo. Portanto, só posso usar palavras.
Artem, boa tarde
Trabalho irreal em termos de capacidade, muito obrigado
Tenho uma observação a fazer: na maioria dos casos, meus terminais de teste MT4 estão conectados a uma conta de negociação real no modo investidor.
A ideia é maximizar as condições da conta de negociação no testador (swaps, comissões, níveis de parada - qualquer coisa que não seja trocada no RTD)
No entanto, a biblioteca detecta que a negociação na conta é proibida e se recusa a negociar. No testador.
Talvez faça sentido relaxar explicitamente algumas das restrições para trabalhar no testador?
Aparentemente, bem aqui:
//--- Verificar a permissão de negociação para essa conta (se houver uma conexão com o servidor de negociação) else if(!this.m_account.TradeAllowed() && !::MQLInfoInteger(MQL_TESTER)) { //--- Escreva o código de erro na lista e retorne false - não vale a pena fazer mais verificações this.m_error_reason_flags=TRADE_REQUEST_ERR_FLAG_ERROR_IN_LIST; this.AddErrorCodeToList(MSG_LIB_TEXT_ACCOUNT_NOT_TRADE_ENABLED); return false; }
Eu adicionei a minha, mas essa pode não ser a única verificação que faz sentido ignorar no testador?
- www.mql5.com
Artem, boa tarde
Trabalho irreal em termos de capacidade, muito obrigado
Tenho uma observação a fazer: na maioria dos casos, meus terminais de teste MT4 estão conectados a uma conta de negociação real no modo investidor.
A ideia é maximizar o uso das condições da conta de negociação no testador (swaps, comissões, níveis de parada - qualquer coisa que não seja trocada no RTD)
No entanto, a biblioteca detecta que a negociação na conta é proibida e se recusa a negociar. No testador.
Talvez faça sentido relaxar explicitamente algumas das restrições para trabalhar no testador?
Aparentemente, aqui:
Eu adicionei a minha, mas essa pode não ser a única verificação que faz sentido ignorar no testador?
Obrigado, vou corrigir isso.
Olá @Artyom Trishkin, obrigado por esse código.
Tentei executar a versão modificada no MT4 sem botões de teste para ouvir os eventos de conta/negociação, mas vejo um resultado errado quando abro e fecho três negociações:
01:17:13.849 removed
01:17:13.733 uninit reason 4
01:15:36.860 OnDoEasyEvent: Posição fechada
01:15:36.860 - Posição fechada: 2020.08.20 23:45:29.000 -EURUSD Fechado Venda #573015195 ao preço 1.18610, Lucro -0.13 USD
01:15:35.489 CEventsCollection::CreateNewEvent, Linha 768: Este evento já está na lista
01:15:35.019 OnDoEasyEvent: Posição fechada
01:15:35.019 - Posição fechada: 2020.08.20 23:45:27.000 -EURUSD Fechado Comprar #573015193 ao preço 1.18623, Lucro -0.13 USD
01:15:30.144 OnDoEasyEvent: Posição aberta
01:15:30.144 - Posição aberta: 2020.08.20 23:45:29.000 -EURUSD Opened 0.01 Sell #573015195 [0.01 Market-order Sell #573015195] a preço 1.18610
01:15:28.724 OnDoEasyEvent: Posição aberta
01:15:28.724 - Posição aberta: 2020.08.20 23:45:28.000 -EURUSD Opened 0.01 Buy #573015194 [0.01 Market-order Buy #573015194] a preço 1.18623
01:15:28.263 OnDoEasyEvent: Posição aberta
01:15:28.257 - Posição aberta: 2020.08.20 23:45:27.000 -EURUSD Opened 0.01 Buy #573015193 [0.01 Market-order Buy #573015193] at price 1.18623
01:14:49.639 inicializado
01:14:22.120 CAccount::Load: Não foi possível criar uma estrutura de objeto a partir de uma matriz uchar
01:14:22.120 CAccount::Load: Não foi possível criar uma estrutura de objeto a partir de uma matriz uchar
01:14:22.120 CAccount::Load: Não foi possível criar a estrutura de objeto da matriz uchar
01:14:22.120 Conta ****: **** (****) **** USD, 1:100, Hedge, Conta de demonstração MetaTrader 4
01:14:20.357 carregado com sucesso
O que provavelmente está errado em meu código de teste?
Olá @Artyom Trishkin, obrigado por esse código.
Tentei executar a versão modificada no MT4 sem botões de teste para ouvir os eventos de conta/negociação, mas vejo um resultado errado quando abro e fecho três negociações:
01:17:13.849 removed
01:17:13.733 uninit reason 4
01:15:36.860 OnDoEasyEvent: Posição fechada
01:15:36.860 - Posição fechada: 2020.08.20 23:45:29.000 -EURUSD Fechado Venda #573015195 ao preço 1.18610, Lucro -0.13 USD
01:15:35.489 CEventsCollection::CreateNewEvent, Linha 768: Este evento já está na lista
01:15:35.019 OnDoEasyEvent: Posição fechada
01:15:35.019 - Posição fechada: 2020.08.20 23:45:27.000 -EURUSD Fechado Comprar #573015193 ao preço 1.18623, Lucro -0.13 USD
01:15:30.144 OnDoEasyEvent: Posição aberta
01:15:30.144 - Posição aberta: 2020.08.20 23:45:29.000 -EURUSD Opened 0.01 Sell #573015195 [0.01 Market-order Sell #573015195] a preço 1.18610
01:15:28.724 OnDoEasyEvent: Posição aberta
01:15:28.724 - Posição aberta: 2020.08.20 23:45:28.000 -EURUSD Opened 0.01 Buy #573015194 [0.01 Market-order Buy #573015194] a preço 1.18623
01:15:28.263 OnDoEasyEvent: Posição aberta
01:15:28.257 - Posição aberta: 2020.08.20 23:45:27.000 -EURUSD Opened 0.01 Buy #573015193 [0.01 Market-order Buy #573015193] at price 1.18623
01:14:49.639 inicializado
01:14:22.120 CAccount::Load: Não foi possível criar uma estrutura de objeto a partir de uma matriz uchar
01:14:22.120 CAccount::Load: Não foi possível criar uma estrutura de objeto a partir de uma matriz uchar
01:14:22.120 CAccount::Load: Não foi possível criar a estrutura de objeto da matriz uchar
01:14:22.120 Conta ****: **** (****) **** USD, 1:100, Hedge, Conta de demonstração MetaTrader 4
01:14:20.357 carregado com sucesso
O que provavelmente está errado em meu código de teste?
Não sei o que você alterou lá...
Cortei alguns códigos relacionados aos botões, mas é possível remover alguns códigos necessários. Eu o anexei agora.
Mas, você concorda que o erro por não capturar a SEGUNDA posição de compra de fechamento não deve estar relacionado às minhas alterações?
Cortei alguns códigos relacionados aos botões, mas é possível remover alguns códigos necessários. Eu o anexei agora.
Mas, você concorda que o erro por não capturar a SEGUNDA posição de compra de fechamento não deve estar relacionado às minhas alterações?
O consultor de teste funciona sem erros?
O consultor de teste funciona sem erros?
Esses erros de `CAccount` aparecem no arquivo padrão TestDoEasyPart34.ex4
Executo o EA modificado para observar meus eventos, depois coloco manualmente algumas negociações e as fecho o mais rápido possível.
Esses erros de `CAccount` aparecem no arquivo padrão TestDoEasyPart34.ex4
-----
Para sua informação:
Como alteramos a estrutura do objeto de conta (alteramos o tamanho das matrizes uchar para armazenar as propriedades de cadeia de caracteres da conta e adicionamos mais uma propriedade inteira), todos os arquivos salvos anteriormente dos objetos de conta não serão mais carregados corretamente. Se eles estiverem na pasta comum dos terminais no diretório \Files\DoEasy\Accounts\, todos eles deverão ser excluídos antes de iniciar este consultor de teste - eles serão recriados ao alternar de uma conta para outra com um novo tamanho da estrutura do objeto.
-----
- 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 criação simples e rápida de programas para MetaTrader (Parte XXXIV): ordens de negociação pendentes - exclusão de ordens, modificação de ordens/posições por condições foi publicado:
Neste artigo, concluiremos a descrição do conceito de solicitações de negociação pendentes e criaremos uma funcionalidade para excluir ordens pendentes e modificar ordens/posições de acordo com as condições definidas. Assim, teremos toda uma funcionalidade com a qual poderemos criar estratégias personalizadas simples, mais precisamente alguma lógica para o EA se comportar quando ocorrerem as condições especificadas pelo usuário.
Compilamos o EA e o executamos no modo visual do testador. Para verificar a remoção de ordens e a modificação de ordens/posições, primeiro abrimos duas posições de venda e definimos uma ordem de venda pendente sem StopLoss e TakeProfit. Em seguida, criamos solicitações pendentes para modificar os níveis de stop de ordens e posições de acordo com a condição do valor do preço. Aguardamos a ativação das solicitações pendentes e a colocação dos níveis de stop especificados, e excluímos ordens e posições.
Em seguida, abrimos duas posições para a compra e definimos uma ordem pendente de compra. Depois disso, criamos solicitações pendentes para excluir ordens e fechar posições de acordo como o tempo.
Como se pode ver, as ordens de stop foram colocadas na interseção do nível de preço definido para ativar solicitações pendentes, as posições foram fechadas após o tempo especificado e a ordem foi excluída.
Autor: Artyom Trishkin