Bibliotecas: MT4Orders - página 9

 
fxsaber:

Executar no testador mt4orders_exampleexpert.mq5

Ao escrever a biblioteca, eu estava longe de perceber a extensão total dos possíveis problemas com os usuários. Antes de você, todos eles funcionavam sem instruções.

Exemplos concisos de conversão de EA não estão apenas na descrição da biblioteca, mas também em sua discussão - nos comentários (ainda mais claros lá).

Graças ao ilan1_4_strict.mq4, tudo deu certo, mas meus EAs apresentaram 75 erros. Os erros são desse tipo:


 
Nauris Zukas:

Obrigado, com o ilan1_4_strict.mq4 tudo funcionou, mas o meu ea deu 75 erros. Os erros são desta natureza:


no mínimo, jogue fora toda a parte gráfica.

Por que você precisa dela no testador?

 
ivanivan_11:

No mínimo, jogue fora todos os gráficos.

Por que você ainda precisa deles no testador?

Você pode fazer isso, mas ainda há muitos bugs.
 
Nauris Zukas:

Obrigado, com o ilan1_4_strict.mq4 tudo funcionou, mas meu ea deu 75 erros. Os erros são desse tipo:

Na discussão mencionada e na descrição, há as seguintes palavras

Esse trabalho afeta apenas o sistema de ordens.

A questão da possibilidade de criar uma biblioteca tão completa, quando o código MQL4 pode funcionar no MetaTrader 5 sem alterações, não foi resolvida.

Atenção!

A biblioteca está contida em apenas um arquivo - MT4Orders.mqh. Todos os outros arquivos estão anexados como exemplos de uso da biblioteca. Esses arquivos não são necessários para trabalhar com a biblioteca.

Durante a transição MT4->MT5, o obstáculo mais difícil é o novo sistema de ordens. O MT4Orders elimina completamente essa dificuldade. As outras diferenças não são tão desanimadoras. Como elas são facilmente reescritas, há dados de referência convenientes sobre esse tópico. Bem, a correção do trabalho da biblioteca foi demonstrada da seguinte forma

Vários consultores MT4/5 de diferentes tipos foram retirados (do kodobase) como exemplo de uso: pips, news, martin, multicurrency, etc.

É assim que você pode escrever em MQL5

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

Erros, bugs, perguntas

fxsaber, 2016.10.20 15:54

#define SLTP (10 * _Point)

#include <Trade\Trade.mqh>;
#include <Trade\OrderInfo.mqh>

// Via MT5-Standard Library - somente MT5
// Define SellLimit e, em seguida, define seu SL/TP
void MT5Order( const double Price )
{
  CTrade Trade;
  
  if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
    Trade.SetTypeFilling(ORDER_FILLING_RETURN);

  Trade.OrderOpen(_Symbol, ORDER_TYPE_SELL_LIMIT, 1, 0, Price, 0, 0, ORDER_TIME_GTC, 0, __FUNCTION__);

  const ulong Ticket = Trade.ResultOrder();
  
  if (Ticket > 0)
  {
    COrderInfo Order;
    
    if (Order.Select(Ticket))
      Trade.OrderModify(Order.Ticket(), Order.PriceOpen(), Order.PriceOpen() + SLTP, Order.PriceOpen() - SLTP, Order.TypeTime(), Order.TimeExpiration());
  }      
}

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

// Via MT4-OSJS - variante entre plataformas (MT4/5)
// Define SellLimit e, em seguida, define seu SL/TP
void MT4Order( const double Price )
{
  const int Ticket = OrderSend(_Symbol, OP_SELLLIMIT, 1, Price, 0, 0, 0, __FUNCTION__);
  
  if ((Ticket > 0) && OrderSelect(Ticket, SELECT_BY_TICKET))
    OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + SLTP, OrderOpenPrice() - SLTP, OrderExpiration(), clrNONE);
}


void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    const double Price = SymbolInfoDouble(_Symbol, SYMBOL_BID) + 100 * _Point;
    
    MT5Order(Price); // Via MT5-Standard Library - somente MT5
    MT4Order(Price); // Via MT4-OSJS - variante entre plataformas (MT4/5)
    
    FirstRun = false;
  }
}

A função MT4Order destacada em amarelo faz a mesma coisa que a função MT5Order. Em qualquer fórum, o código amarelo será imediatamente compreendido, mas o código alternativo do MT5 não.

E como escrever para o MT5 - cada um decide por si mesmo. Eu, por exemplo, uso MT4Orders e, em alguns casos raros, também MQL5 puro (SB tem funcionalidade fraca). Ambos os estilos de escrita funcionam em paralelo. Mas, se você escrever apenas por meio do MT4Orders, o sistema de ordens será multiplataforma. Portanto, eu pratico a escrita de código que funciona em ambas as plataformas sem alterações.

 
fxsaber:

Assim, pratico a escrita de código que é executado sem alterações em ambas as plataformas.

Obrigado! Provavelmente terei que pensar nessa opção no futuro também.
 

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

Como determinar o último preço de fechamento de uma ordem (MQL5)?

fxsaber, 2016.12.05 10:25 AM

#include <MT4Orders.mqh>

void OnStart()
{
  if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
    Alert(OrderClosePrice());
}
 
void Terminal()
{            
int oldticket=0;
int Ticket=0;
   ArrayResize(Mas_LOT,OrdersTotal(),3);
   ArrayInitialize(Mas_LOT,0); 

   for(int i=0; i <= OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)){    
      if (OrderSymbol()==Symbol()&& OrderMagicNumber() == Magik){

      
      Mas_LOT[i][0] = OrderTicket();
      Mas_LOT[i][1] = OrderLots();
      Mas_LOT[i][2] = OrderType();
      Mas_LOT[i][3] = (OrderProfit() + OrderSwap() + OrderCommission());
      Mas_LOT[i][4] = OrderStopLoss();
      Mas_LOT[i][5] = OrderOpenPrice();

      Mas_LOT[i][6] = OrderTakeProfit();

}}}}

Por exemplo, a matriz de ordens do mt4 é muito útil e conveniente para calcular, por exemplo, a média de take/stop, e essa mesma matriz pode ser alimentada nas funções de modificação e arrasto, mas é melhor convertê-la para o mt5 usando a biblioteca MT4Orders.mqh ou sem ela
 
Aleksey Semenov:
Qual a melhor maneira de convertê-lo para o MT5 usando a biblioteca MT4Orders.mqh?
Adicionar
#include <MT4Orders.mqh>
 
Exemplo de plataforma cruzada

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

Nova versão do MetaTrader 5 build 1525: apresentação do histórico na forma de posições e melhoria do testador

fxsaber, 2017.01.27 19:20

Executando um script de plataforma cruzada

// Código MQL4&5

#property strict

#include <MT4Orders.mqh>

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick) && (OrdersTotal() == 0) &&
      (OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0) > 0))
  {
    const double Lots[] = {0.6, 0.3, 0.1};
    
    for (int i = 0; i < ArraySize(Lots); i++)    
      if (OrderSelect(0, SELECT_BY_POS) && SymbolInfoTick(_Symbol, Tick))
        OrderClose(OrderTicket(), Lots[i], Tick.bid, 0);

    const int Total = OrdersHistoryTotal();
    
    for (int i = 0; i < Total; i++)
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        OrderPrint();  
  }
}

Primeiro no MT5-Hedge. Obtemos uma impressão MT4 muito boa

#114769046 2017.01.27 19:57:25 balance 0.00  1 0 0 2017.01.27 19:57:11 0 0.00 0.00 50000.00 0
#114769087 2017.01.27 19:57:25 buy 0.60 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:25 1.06829 0.00 0.00 -5.40 0
#114769088 2017.01.27 19:57:25 buy 0.30 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:25 1.06829 0.00 0.00 -2.70 0
#114769089 2017.01.27 19:57:25 buy 0.10 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:26 1.06829 0.00 0.00 -0.90 0

e um relatório clássico

Ordens
Horário de aberturaOrdemSímboloTipo de ordemVolumePreçoS / LT / PTempoCondiçãoComentário
2017.01.27 19:57:25131208025EURUSDcomprar1.00 / 1.001.068382017.01.27 19:57:25preenchido
2017.01.27 19:57:25131208027EURUSDvender0.60 / 0.601.068292017.01.27 19:57:25preenchido
2017.01.27 19:57:25131208030EURUSDvender0.30 / 0.301.068292017.01.27 19:57:25preenchido
2017.01.27 19:57:26131208031EURUSDvender0.10 / 0.101.068292017.01.27 19:57:26preenchido
Transações
TempoTransaçãoSímboloTipo de transaçãoDireçãoVolumePreçoOrdemComissãoTrocaLucroSaldoComentário
2017.01.27 19:57:11114769046saldo0.000.0050 000.0050 000.00
2017.01.27 19:57:25114769085EURUSDcomprarem1.001.068381312080250.000.000.0050 000.00
2017.01.27 19:57:25114769087EURUSDvenderfora0.601.068291312080270.000.00-5.4049 994.60
2017.01.27 19:57:25114769088EURUSDvenderfora0.301.068291312080300.000.00-2.7049 991.90
2017.01.27 19:57:26114769089EURUSDvenderfora0.101.068291312080310.000.00-0.9049 991.00

Como confirmação, executamos o mesmo script no MT4.

Relatório clássico do MT4

Transações fechadas:
BilheteTempo de aberturaTipo de transaçãoTamanhoItemPreçoS / LT / PTempo de fechamentoPreçoComissãoImpostosTrocaLucro
1700392462017.01.27 20:00:41saldoDepósito50 000.00
1700392872017.01.27 20:00:57comprar0.60eurusd1.068540.000000.000002017.01.27 20:00:571.068360.000.000.00-10.80
para #170039289
1700392892017.01.27 20:00:57comprar0.30eurusd1.068540.000000.000002017.01.27 20:00:581.068360.000.000.00-5.40
para #170039290
1700392902017.01.27 20:00:57comprar0.10eurusd1.068540.000000.000002017.01.27 20:00:581.068360.000.000.00-1.80
de #170039289

E a impressão do registro do script

#170039246 2017.01.27 20:00:41 balance 0.01  0 0 0 2017.01.27 20:00:41 0 0.00 0.00 50000.00 Deposit 0
#170039287 2017.01.27 20:00:57 buy 0.60 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:57 1.06836 0.00 0.00 -10.80 to #170039289 0
#170039289 2017.01.27 20:00:57 buy 0.30 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:58 1.06836 0.00 0.00 -5.40 to #170039290 0
#170039290 2017.01.27 20:00:57 buy 0.10 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:58 1.06836 0.00 0.00 -1.80 from #170039289 0

Você pode ver claramente que o registro do script no MT4 e no MT5 coincide - a plataforma cruzada funciona.

ZY Se a lógica do script for escrita para o MT5 via SB, o script não funcionará corretamente. Em geral, é até difícil dizer como escrever uma lógica MQL4 tão simples para o MT5.

[Excluído]  

seleção por símbolo e majic não funciona

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
}

OrderSelect não funciona não seleciona uma ordem (ticket por índice) para trabalhar com ela, exemplo simples em anexo e não funciona no mt5 por algum motivo

Arquivos anexados: