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"

 

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

 

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 é,

  1. 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.
  2. 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.
  3. o tamanho agregado do primeiro conjunto de posições deve ser determinado levando-se em conta uma perda de 2% do balanço patrimonial
  4. o tamanho cumulativo do segundo conjunto de posições deve ser determinado levando-se em conta uma perda de 2% nos fundos
  5. 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
Рынок — это место, где обычно происходит обмен товара на деньги или товара на товар. Если доступ на рынок свободный, то производители и потребители проводят обмен в условиях конкуренции. Существует
 
Nikolai Karetnikov:

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,

  1. 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.
  2. 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.
  3. o tamanho agregado do primeiro conjunto de posições deve ser determinado levando-se em conta uma perda de 2% do balanço patrimonial
  4. o tamanho cumulativo do segundo conjunto de posições deve ser determinado levando-se em conta uma perda de 2% nos fundos
  5. 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?

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
, то позиции по каждому символу разрешается закрывать только в том порядке, в котором они были открыты — сначала самую старую, затем более новую и т.д. При попытке закрыть позиции в ином порядке будет получена ошибка. Уровень залоговых средств, при достижении которого происходит принудительное закрытие самой убыточной позиции (Stop Out). В...
 
Igor Ryabchikov:

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?

 
Mohammad Bazrkar :

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?

Arquivos anexados:
mhdbzr-34.mq4  46 kb
 
Mohammad Bazrkar :

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?

 
Artyom Trishkin:

O consultor de teste funciona sem erros?

Executo o EA modificado para observar meus eventos e, em seguida, coloco manualmente algumas negociações e as fecho o mais rápido possível.
Não uso o EA de teste para abrir/fechar posições.


Esses erros de `CAccount` aparecem no arquivo padrão TestDoEasyPart34.ex4

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 CAccount::Load: Não foi possível criar a estrutura de objeto da matriz uchar

 
Mohammad Bazrkar:
Executo o EA modificado para observar meus eventos, depois coloco manualmente algumas negociações e as fecho o mais rápido possível.
Não uso o EA de teste para abrir/fechar posições.


Esses erros de `CAccount` aparecem no arquivo padrão TestDoEasyPart34.ex4

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 CAccount::Load: Não foi possível criar a estrutura de objeto da matriz uchar

Sim, eles vão. Porque a abordagem para armazenar os dados de sua conta foi alterada. Isso está escrito no final do artigo como um aviso:
-----
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.
-----