Bibliotecas: MT4Orders - página 20

 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Recursos da linguagem mql5, sutilezas e técnicas de trabalho

fxsaber, 2018.02.19 08:39 AM

Na compensação, ao mesmo tempo, no mesmo símbolo, pode haver uma posição aberta e várias ordens de mercado de qualquer direção. Por exemplo, uma posição de COMPRA e uma ordem de COMPRA.

Na biblioteca MT5, as ordens MT5 e as posições MT5 são uma entidade - ordens MT4. Por esse motivo, nessa situação, é possível obter várias ordens de COMPRA/VENDA-MT4 em um símbolo em uma conta de compensação. Isso não é um erro e não pode levar a nada de ruim. Mas estou escrevendo sobre isso para o caso de alguém se surpreender com essa situação.

É verdade que não consegui encontrar uma conta de demonstração desse tipo.

Trata-se mais de um aviso teórico. Não encontrei isso na prática.

 
Esses são os tipos de pedidos (muito raros) que a biblioteca deliberadamente não vê no histórico de lances. As versões anteriores da bibla as viam. Se você acha que o comportamento atual deve ser o mesmo, entre em contato comigo.
 
// Lista de modificações:
// 06.03.2018
// Adicionar: adicionados TICKET_TYPE e MAGIC_TYPE para que você possa escrever código unificado entre plataformas
// sem avisos do compilador (incluindo MQL4 strict-mode).

Abaixo está o código que compila sem avisos na MQL4/5

#property strict

#include <MT4Orders.mqh>

void OnStart()
{
// long Ticket = 0;
// long Magic = 0;
  TICKET_TYPE Ticket = 0;
  MAGIC_TYPE  Magic = 0;
  
  long Tmp = OrderSelect(Ticket, SELECT_BY_TICKET) + 
             OrderDelete(Ticket) +
             OrderCloseBy(Ticket, Ticket) +
             OrderClose(Ticket, 1, 0, 0) +    
             OrderSend(_Symbol, OP_BUY, 1, 0, 0, 0, 0, NULL, Magic);
}

Agradecemos a @Andrey Voytenko por sugerir essa solução!

 
fxsaber:

Abaixo está o código que compila sem avisos na MQL4/5

Agradecemos a @Andrey Voytenko por sugerir essa solução!

Para que serve esse hack?

 
Rashid Umarov:

Para que serve esse hack?

Os tipos longos são comentados no exemplo. Se eles forem deixados, não haverá avisos em MQL5 e NoStrict-MQL4. Mas no strict-MQL4 eles ocorrerão.

Para poder escrever bibliotecas entre plataformas sem os avisos correspondentes, essa funcionalidade foi adicionada.

Você não precisa usá-la de forma alguma. Trata-se de uma conveniência adicional para aqueles que podem enfrentar uma tarefa de plataforma cruzada desse tipo.

 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Robô do MT4 para o MT5

fxsaber, 2018.03.08 09:27 pm.

// https://www.mql5.com/pt/code/16006
#define   MT4_TICKET_TYPE // Obrigar o OrderSend e o OrderTicket a retornar um valor do mesmo tipo que no MT4 - int.
#include <MT4Orders.mqh>
#include <MQL4_To_MQL5.mqh>

int Hour( void )
{
  return((int)((TimeCurrent() % (24 * 3600)) / 3600));
}

int Minute( void )
{
  return((int)((TimeCurrent() % 3600) / 60));
}

#include "super-signals-channel.mq4" // https://www.mql5.com/ru/forum/231135#comment_6751304
 

Estou tentando implementar uma estratégia (que obviamente funciona bem no MT4), mas me deparei com um obstáculo.

O EA inicia uma nova sequência de negociações sempre que um novo sinal é gerado, de modo que cada par negociado geralmente tem várias sequências em execução.

Cada negociação tem um SL e TP, e o EA precisa rastrear o que aconteceu (SL ou TP) com a negociação mais recente em cada sequência, verificando o histórico de ordens.

Infelizmente, isso não parece ser possível com base nas notas da biblioteca (abaixo) e em várias tentativas de fazer o sistema funcionar:

// No MT4, o OrderSelect no modo SELECT_BY_TICKET seleciona um tíquete independentemente de MODE_TRADES / MODE_HISTORY,
// já que o "número do tíquete é um ID de ordem exclusivo".
// No MT5, o número do tíquete NÃO é único,
// portanto, o OrderSelect no modo SELECT_BY_TICKET tem as seguintes prioridades de seleção para tíquetes correspondentes:
// MODE_TRADES: existing position> existing order> transaction> canceled order
// MODE_HISTORY: transaction> canceled order> existing position> existing order

Com base em experimentos, confirmei que o número do tíquete sempre muda após um evento de SL/TP e que a única informação comum é o número mágico - nem mesmo o comentário do pedido é mantido.

Nos testes, a colocação de um pedido inicial com um SL, TP, número mágico e comentário de negociação retorna o tíquete nº 2 e exibe todas as informações esperadas.

Entretanto, quando o SL ou TP é atingido, o tíquete nº 2 desaparece e não pode ser recuperado usando SELECT_BY_POS ou SELECT_BY_TICKET.

Em vez disso, (supondo que não haja outra atividade de negociação) haverá agora o bilhete nº 3, que não tem nenhum comentário de ordem definido.

Sem consistência em relação ao número do tíquete e sem comentário de ordem para referência, parece não haver uma maneira simples de identificar a última ordem em uma determinada sequência :(

Esperamos que @fxsaber possa encontrar uma solução ou sugerir uma solução alternativa :)

 
SysFX:

Infelizmente, não entendi o problema.

 

Desculpe-me pela resposta tardia :(

A questão é que as informações de negociação do 'MODE_HISTORY' são basicamente inutilizáveis porque:

1) quando uma negociação é fechada, o número do tíquete muda ... você pode testar isso facilmente abrindo uma negociação de compra/venda com um TP e SL - se a negociação for aberta como tíquete nº 2, essa negociação se tornará o tíquete nº 3 no histórico depois que o SL ou TP for acionado

2) o número mágico é perdido

3) o comentário do tíquete é perdido

Portanto, se o código do EA precisar verificar se uma negociação foi fechada com lucro ou prejuízo, isso será impossível porque não há informações disponíveis para identificar a negociação.

Espero que você possa ajustar as coisas para manter o número mágico e fazer com que o comentário da negociação se comporte como no MT4 - talvez você possa encontrar uma maneira de manter o número do tíquete também.

 
SysFX:

Desculpe-me pela resposta tardia :(

O problema é que as informações comerciais de 'MODE_HISTORY' são basicamente inutilizáveis porque:

1) quando uma negociação é fechada, o número do tíquete muda ... você pode testar isso facilmente abrindo uma negociação de compra/venda com um TP e SL - se a negociação for aberta como tíquete nº 2, essa negociação se tornará o tíquete nº 3 no histórico depois que o SL ou TP for acionado

2) o número mágico é perdido

3) o comentário do tíquete é perdido

Portanto, se o código do EA precisar verificar se uma negociação foi fechada com lucro ou prejuízo, isso é impossível porque não há informações disponíveis para identificar a negociação.

Espero que você possa ajustar as coisas para manter o número mágico e fazer com que o comentário da negociação se comporte como no MT4 - talvez você possa encontrar uma maneira de manter o número do tíquete também.

Exemplo

#include <MT4Orders.mqh>

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnInit()
{
  long Ticket;
  
  PRINT((Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Bid - 100 * _Point, Bid + 100 * _Point, "Hello World!", 12345)));
  
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
    PRINT(OrderClose(OrderTicket(), 0.3, OrderClosePrice(), 0));
}

void OnDeinit( const int )
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 1; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      OrderPrint();
      
      PRINT(OrderTicket());
      PRINT(OrderMagicNumber());
      PRINT(OrderComment());
      PRINT(OrderTicketOpen());
    }
}


Resultado

2018.03.25 00:00:00   instant buy 1.00 EURUSD at 1.23527 sl: 1.23414 tp: 1.23614 (1.23514 / 1.23527)
2018.03.25 00:00:00   deal #2  buy 1.00 EURUSD at 1.23527 done (based on order #2)
2018.03.25 00:00:00   deal performed [#2  buy 1.00 EURUSD at 1.23527]
2018.03.25 00:00:00   order performed buy 1.00 at 1.23527 [#2  buy 1.00 EURUSD at 1.23527]
2018.03.25 00:00:00   (Ticket=OrderSend(_Symbol,OP_BUY,1,Ask,0,Bid-100*_Point,Bid+100*_Point,Hello World!,12345)) = 2
2018.03.25 00:00:00   instant sell 0.30 EURUSD at 1.23514, close #2 (1.23514 / 1.23527)
2018.03.25 00:00:00   deal #3  sell 0.30 EURUSD at 1.23514 done (based on order #3)
2018.03.25 00:00:00   deal performed [#3  sell 0.30 EURUSD at 1.23514]
2018.03.25 00:00:00   order performed sell 0.30 at 1.23514 [#3  sell 0.30 EURUSD at 1.23514]
2018.03.25 00:00:00   OrderClose(OrderTicket(),0.3,OrderClosePrice(),0) = true
2018.03.26 01:04:40   take profit triggered #2  buy 0.70 EURUSD 1.23527 sl: 1.23414 tp: 1.23614 [#4  sell 0.70 EURUSD at 1.23614]
2018.03.26 01:04:40   deal #4  sell 0.70 EURUSD at 1.23614 done (based on order #4)
2018.03.26 01:04:40   deal performed [#4  sell 0.70 EURUSD at 1.23614]
2018.03.26 01:04:40   order performed sell 0.70 at 1.23614 [#4  sell 0.70 EURUSD at 1.23614]
final balance 10000046.11 EUR
2018.03.26 23:59:59   #3 2018.03.25 00:00:00 buy 0.30 EURUSD 1.23527 1.23414 1.23614 2018.03.25 00:00:00 1.23514 0.00 0.00 -3.16 Hello World! 12345
2018.03.26 23:59:59   OrderTicket() = 3
2018.03.26 23:59:59   OrderMagicNumber() = 12345
2018.03.26 23:59:59   OrderComment() = Hello World!
2018.03.26 23:59:59   OrderTicketOpen() = 2
2018.03.26 23:59:59   #4 2018.03.25 00:00:00 buy 0.70 EURUSD 1.23527 0.00000 1.23614 2018.03.26 01:04:40 1.23614 0.00 0.00 49.27 tp 1.23614 12345
2018.03.26 23:59:59   OrderTicket() = 4
2018.03.26 23:59:59   OrderMagicNumber() = 12345
2018.03.26 23:59:59   OrderComment() = tp 1.23614
2018.03.26 23:59:59   OrderTicketOpen() = 2

stop loss!!!


PS Tópico de discussão russo.