Bibliotecas: MT4Orders - página 56

 
SysFX:

Tenho um EA MT4 que estou tentando portar para o MT5 usando o MT4Orders para que eu possa manter uma única fonte, mas me deparei com alguns problemas...

1) quando uma ordem atinge SL ou TP, os textos usuais [sl] ou [tp] não são anexados ao comentário da ordem se o EA adicionou um comentário durante OrderSend().

Esse é um comportamento normal do MT5? Em caso afirmativo, existe uma maneira confiável de determinar se uma ordem realmente atingiu a SL/TP ou foi fechada manualmente?

(tentar decidir verificando o preço de abertura / preço de fechamento / SL / TP não é confiável devido à derrapagem - especialmente se o SL foi movido muito perto do TP).

https://www.mql5.com/ru/forum/93352/page20#comment_7112531

https://www.mql5.com/ru/forum/93352/page18#comment_6246123

2) quando ocorre um fechamento parcial, os comentários sobre a ordem de partes abertas e fechadas não mostram "to #xxxxxxxxxxx" e "from #xxxxxxxxx"

novamente, existe uma maneira confiável (e, espera-se, simples) de determinar o que aconteceu com uma determinada ordem?

Não entendi, com base nessa descrição, qual problema você precisa resolver.

3) o número do ticket de uma negociação aberta muda quando ela é fechada, portanto, não posso usar OrderTicket() para seguir uma ordem, mas OrderTicketID() parece funcionar como OrderTicket() no MT4 e mantém o mesmo ID para uma negociação fechada.

Esse valor é constante ou pode mudar entre as reinicializações da plataforma?Se for constante, qual é a melhor maneira de usar OrderTicketID() e manter a compatibilidade com o MT4 (já que OrderTicketID() não é uma função do MT4)?

** O OrderTicketID() parece ignorar a diretiva MT4_TICKET_TYPE e é sempre "long"

SELECT_BY_TICKET funciona corretamente com OrderTicket/OrderTicketID/OrderTicketOpen. Todas as funções do MT4Orders não alteram seus valores depois de recarregar o Terminal.

O mesmo OrderTicketID no MT5 pode ter várias posições fechadas (no caso de fechamentos parciais). Pelo mesmo motivo, uma posição aberta e uma posição fechada podem ter o mesmo OrderTicketID. Devido a essa ambiguidade, o MT5 usa o OrderTicket - um ticket exclusivo para cada posição fechada/aberta.


Essa atualização da biblioteca foi feita para ser multiplataforma (compatibilidade com o MT4).


** OrderTicketID() parece ignorar a diretiva MT4_TICKET_TYPE e é sempre "long"
Obrigado, corrigi o problema.
// Lista de modificações:
// 11.11.2020
// Correção: OrderTicketID() e OrderTicketOpen() retornam o tipo de valor especificado em TICKET_TYPE.
 
2) quando ocorre um fechamento parcial, os comentários sobre a ordem de partes abertas e fechadas não mostram "para #xxxxxxxxxxx" e "de #xxxxxxxxxxx"

Mais uma vez, existe uma maneira confiável (e, esperamos, simples) de determinar o que aconteceu com uma determinada ordem?

O que eu quis dizer foi o seguinte:

Se você tiver uma negociação de 1,00 lote no MT4 com um número de tíquete 123456 e fechar parcialmente 0,40 lote, o número de tíquete 123456 será exibido na guia Histórico como 0,40 lote e seu comentário de negociação mostrará "to #NewTicket".

Na guia Trades (Negociações), uma nova negociação de 0,60 lote aparece com o número de tíquete "NewTicket" e seu comentário de negociação mostra "from #123456".

 
SysFX:

O que eu quis dizer foi o seguinte:

Se você tiver uma negociação de 1,00 lote no MT4 com um número de tíquete 123456 e fechar parcialmente 0,40 lote, o número de tíquete 123456 será exibido na guia Histórico como 0,40 lote e seu comentário de negociação mostrará "para #NewTicket".

Na guia Trades (Negociações), uma nova negociação de 0,60 lote aparece com o número de tíquete "NewTicket" e seu comentário de negociação mostra "from #123456".

#include <MT4Orders.mqh> // https://www.mql5.com/pt/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  const TICKET_TYPE Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);
  
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
    OrderClose(OrderTicket(), 0.4, OrderClosePrice(), 0);
}

Esse script cria sua situação. Escreva claramente o que você deseja obter nessa situação?

 
fxsaber:

Esse roteiro cria sua situação. Escreva claramente o que você precisa obter nessa situação?

Portanto, no testador, a linha a seguir criaria o tíquete nº 2 (o depósito de abertura é o nº 1)

const TICKET_TYPE Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);

Então, quando a próxima linha for executada, um novo tíquete (nº 3) deverá ser aberto para 0,6 lote e o tíquete nº 2 deverá aparecer no histórico de ordens como uma negociação de 0,4 lote.

OrderClose(OrderTicket(), 0.4, OrderClosePrice(), 0);

No MT4, o comentário da ordem #2 seria "to #3" e o comentário da ordem #3 seria "from #2".

Isso não acontece no MT5 - o comentário não é exibido nas guias Trades/History, e OrdersToString() mostra apenas "0" para o comentário da negociação.

A mesma funcionalidade deve existir para o testador e para a negociação real - mencionei apenas o testador porque os números dos tíquetes podem ser antecipados.

 
SysFX:

No MT4, o comentário da ordem #2 seria "to #3" e o comentário da ordem #3 seria "from #2".

Isso não acontece no MT5 - o comentário não é exibido nas guias Trades/History, e OrdersToString() mostra apenas "0" para o comentário da negociação.

Como você já percebeu, o MT5 não cria comentários específicos quando executado parcialmente, como acontece no MT4.


O MT4Orders nunca emulará nenhum comportamento do MT4. Essa biblioteca foi projetada para utilizar a API de negociação no estilo do MT4 no MT5. Nada mais e nada menos.

Isso significa que, se você conhece o MT4, pode escrever facilmente a lógica de negociação no MT5.


Se precisar levar em conta algumas peculiaridades sutis de cada plataforma, há macros para isso.

#ifdef __MQL5__
  // O código MQL5 está aqui.
#else // #ifdef __MQL5__
  // O código MQL4 está aqui.
#endif // #ifdef __MQL5__ #else


Se houver alguma tarefa que você não consiga resolver no MT5, há pessoas aqui para ajudar. Muitas coisas podem ser feitas por meio do MT4Orders.

 
fxsaber:

Como você já percebeu, o MT5 não cria determinados comentários durante a execução parcial, como acontece no MT4.


O MT4Orders nunca emulará nenhum comportamento do MT4. Essa biblioteca foi projetada para utilizar a API de negociação no estilo do MT4 no MT5. Nada mais e nada menos.

Isso significa que, se você conhece o MT4, pode escrever facilmente a lógica de negociação no MT5.


Se precisar levar em conta algumas peculiaridades sutis de cada plataforma, há macros para isso.


Se houver alguma tarefa que você não consiga resolver no MT5, há pessoas aqui para ajudar. Muitas coisas podem ser feitas por meio do MT4Orders.

Sim ... Percebi que isso era causado pelo comportamento do MT5 e encontrei uma solução para esse problema. Para mim, era mais importante resolver o problema [sl] / [tp] e agora está funcionando bem - obrigado pela informação :)

 
Eu o copio e recebo um arquivo vazio
 
grin4k:
Eu o copio e recebo um arquivo vazio

Sim, ele está vazio. É uma falha no site.

Mas não carregue o arquivo se o código tiver sido atualizado. O zip não foi atualizado. Faça o download por arquivo.

 
fxsaber :

Caso interessante do MT5.


A tomada foi parcialmente executada e, depois disso, foi excluída. Nesse caso, temos uma situação em que DEAL_ORDER tem o status ORDER_STATE_CANCELED, e não FILLED/PARTIAL.

Nesse caso, DEAL_TIME_MSC não é igual a ORDER_TIME_DONE_MSC.

Qual foi o ORDER_TYPE_FILLING nesse caso?

Estou negociando por meio do censor url broker. Ao definir o Take Profit, o valor padrão é ORDER_TYPE_FILLING == ORDER_FILLING_IOC. Seu caso não deve estar ocorrendo com IOC, certo?

 
Como lidar com erros - GetLastError e ERR_INVALID_PRICE, ERR_PRICE_CHANGED, ERR_REQUOTE, ERR_OFF_QUOTES, ERR_TRADE_CONTEXT_BUSY - as constantes não estão definidas.