Bibliotecas: MT4Orders - página 13

 
fxsaber:

Atualização

// Lista de modificações:
// 14.06.2017:
// Adicionar: a implementação inicial da detecção de posições fechadas de SL/TP está ativada (закрытых через OrderClose).

Um exemplo de como funciona

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

Telas do terminal MT5 versus MT4 - Decepcionado com as mudanças no MT 5

fxsaber, 2017.07.07 08:46 AM

Primeiro, execute este script

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

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define  SLIPPAGE 100
#define  OFFSET (SLIPPAGE * _Point)

void OnStart()
{
  if (OrderSelect(OrderSend(_Symbol, OP_BUY, 1, Ask, SLIPPAGE, 0, 0), SELECT_BY_TICKET))
  {
    OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - OFFSET, OrderOpenPrice() + OFFSET, 0);
    
    if (OrderSelect(OrderTicket(), SELECT_BY_TICKET))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), SLIPPAGE);
  }
}

Resultado:

'6145767': instant buy 1.00 EURUSD at 1.14156 (deviation: 100)
'6145767': accepted instant buy 1.00 EURUSD at 1.14156 (deviation: 100)
'6145767': deal #140159795 buy 1.00 EURUSD at 1.14156 done (based on order #156755661)
'6145767': order #156755661 buy 1.00 / 1.00 EURUSD at 1.14156 done in 252.283 ms
'6145767': modify #156755661 buy 1.00 EURUSD sl: 0.00000, tp: 0.00000 -> sl: 1.14056, tp: 1.14256
'6145767': accepted modify #156755661 buy 1.00 EURUSD sl: 0.00000, tp: 0.00000 -> sl: 1.14056, tp: 1.14256
'6145767': modify #156755661 buy 1.00 EURUSD -> sl: 1.14056, tp: 1.14256 done in 109.586 ms
'6145767': instant sell 1.00 EURUSD at 1.14147, close #156755661 buy 1.00 EURUSD 1.14156 (deviation: 100)
'6145767': accepted instant sell 1.00 EURUSD at 1.14147, close #156755661 buy 1.00 EURUSD 1.14156 (deviation: 100)
'6145767': deal #140159796 sell 1.00 EURUSD at 1.14147 done (based on order #156755662)
'6145767': order #156755662 sell 1.00 / 1.00 EURUSD at 1.14147 done in 219.817 ms


Em seguida, execute este

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

void OnStart()
{
  if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
    OrderPrint();
}

Resultado

#140159796 2017.07.07 09:38:31 buy 1.00 EURUSD 1.14156 1.14056 1.14256 2017.07.07 09:38:32 1.14147 0.00 0.00 -7.88 0


Dessa forma, é possível saber o SL/TP das posições fechadas.

 

O MT4 contém menos informações do que o MT5. Mas nada impede que você use as APIs de negociação do MT4/5 ao mesmo tempo

// O script mostra o campo Reason de todas as posições fechadas
#include <MT4Orders.mqh>

void OnStart()
{
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      OrderPrint();
      
      Print(EnumToString((ENUM_DEAL_REASON)HistoryDealGetInteger(OrderTicket(), DEAL_REASON)));
    }      
}


Resultados

#141705115 2017.07.18 15:02:37 sell 0.01 EURUSD 1.15508 0.00000 0.00000 2017.07.19 13:04:05 1.15309 0.00 -0.01 1.99 0
DEAL_REASON_CLIENT

#140517682 2017.07.11 12:06:48 buy 0.01 EURUSD 1.13941 1.13926 0.00000 2017.07.11 12:07:10 1.13926 0.00 0.00 -0.15 [sl 1.13926] 0 DEAL_REASON_SL

#137746488 2017.06.20 01:22:26 sell 2.00 EURUSD 1.11474 0.00000 0.00000 2017.06.20 01:22:41 1.11484 0.00 0.00 -20.00 0 DEAL_REASON_EXPERT
 

Quando o OrderSend não estava sincronizado com o ambiente de negociação do terminal, a sincronização automática foi incorporada ao MT4Orders.

Depois de algum tempo, os desenvolvedores incorporaram a sincronização e o antigo código de sincronização foi deixado na biblioteca com uma pequena exceção - ele começou não apenas a sincronizar, mas também a verificar se a sincronização do OrderSend dos desenvolvedores estava funcionando corretamente. Em caso de erro, um alerta deve ser exibido

    if (MT4ORDERS::OrderSendBug)
    {
      Alert("BUG!!!!!!");


Há relatos de que esse alerta é acionado em casos raros (parece ser quando a CPU está ocupada), sinalizando que o OrderSend dos desenvolvedores está com erros quando se trata de sincronização com o ambiente de negociação. Não sei como informar isso aos desenvolvedores do SD, pois não consigo reproduzir o problema. Mas o fato permanece.


Portanto, há duas opções.

  1. Deixar como está - o alerta informará sobre o bug dos desenvolvedores.
  2. Recusar o alerta.
Em ambos os casos, a biblioteca sincroniza forçosamente o OrderSend em um tempo mínimo.
 
// Lista de modificações:
// 03.08.2016:
// Versão - escrita e testada somente em um testador off-line.
// ....
// 03.08.2017:
// Adicionar: adicionado OrderCloseBy.
// Adição: a operação OrderSelect no modo MODE_TRADES foi acelerada. Agora é possível receber dados do pedido selecionado por meio de
// funções MT4-Order correspondentes, mesmo que a posição/ordem MT5 (não no histórico) não seja selecionada via MT4Orders.
// Por exemplo, por meio das funções MT5-PositionSelect* ou MT5-OrderSelect.
// Adição: Adicionadas OrderOpenPriceRequest() e OrderClosePriceRequest() - retornam o preço de uma solicitação de negociação ao abrir/fechar uma posição.
// Com a ajuda dessas funções, é possível calcular as derrapagens correspondentes das ordens.

A biblioteca tem um ano de existência...

 
fxsaber:

A biblioteca completou um ano...

Parabéns! É um invólucro maravilhoso.

 
fxsaber:

A biblioteca completou um ano...


Parabéns!

É verdade, eu tentei dois EAs e a experiência foi negativa, na primeira tentativa a compilação não passou - eu não a entendi por causa da má compreensão das funções de negociação, na segunda variante o EA se tornou terrivelmente lento - ele usa todos os recursos do kernel, mas a compilação foi bem-sucedida.

É difícil dizer qual é a razão para a segunda variante, talvez não seja por causa da classe - há uma negociação semiautomática na quebra de nível - os níveis são construídos à mão.

 

Obrigado pelos parabéns, agradeço os comentários de todos! Eles são sempre levados em consideração.

Aleksey Vyazmikin:

O EA ficou terrivelmente lento - ele consome todos os recursos do kernel, mas a compilação foi bem-sucedida.

Gostaria de ver o código. Você pode enviá-lo por PM.

 
fxsaber:

Obrigado pelos parabéns, agradeço os comentários de todos! Eles são sempre levados em consideração.

Gostaria de ver o código. Você pode me enviar um PM.


Enviei o código para sua PM.

 
Aleksey Vyazmikin:

Enviei o código para a PM.

Infelizmente, originalmente a biblioteca não era responsável por todas as traduções MT4->MT5, onde não são usadas apenas funções de negociação MQL4.

No seu caso, a lentidão do trabalho do Expert Advisor não é causada por essa biblioteca, mas por uma implementação privada da tradução MT4->MT5, afetando o trabalho com séries temporais, indicadores, etc.

 
fxsaber:

Infelizmente, inicialmente a biblioteca não era responsável por todas as traduções MT4->MT5, onde não são usadas apenas as funções de negociação MQL4.


Mas agora ela é responsável?

fxsaber:

No seu caso, a lentidão do trabalho do Expert Advisor não é causada por essa biblioteca, mas por uma implementação privada da tradução MT4->MT5, que afeta o trabalho com séries temporais, indicadores, etc.

Privada - é a minha biblioteca ou outra biblioteca?

Fiz tudo de acordo com o artigo conhecido por todos, e não há indicadores especiais lá....

Duvido que esse código possa causar sobrecarga no kernel:

double iMAMQL4(string symbol,
               int tf,
               int period,
               int ma_shift,
               int method,
               int price,
               int shift)
  {
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   ENUM_MA_METHOD ma_method=MethodMigrate(method);
   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);
   int handle=iMA(symbol,timeframe,period,ma_shift,
                  ma_method,applied_price);
   if(handle<0)
     {
      Print("Объект iMA не создан: Ошибка ",GetLastError());
      return(-1);
     }
   else
      return(CopyBufferMQL4(handle,0,shift));
  }

Ou é esse o motivo?