Bibliotecas: MT4Orders - página 3

 
Alexey Volchanskiy:

Wo, e o fxsaber está chateado por eu ser o único que notou esse erro, então ninguém precisa da biblioteca )). É que nosso pessoal é muito observador.

Uma anedota da vida - eu estava conduzindo um webinar, repeti 10 vezes que haverá uma gravação. No final, eu disse novamente, a gravação será amanhã, se você tiver perguntas - pergunte. E agora adivinhem a primeira pergunta ))))

E leia A. Galich. "Como falei em um comício em defesa da paz". (Espero que eu me lembre do título corretamente).
 
// Lista de modificações:
// 03.08.2016:
// Versão - escrita e testada somente em um testador off-line.
// 29.09.2016:
// Adicionar: possibilidade de trabalhar na bolsa de valores (SYMBOL_TRADE_EXECUTION_EXCHANGE). Observe que a bolsa é no modo Netto (não Hedge).
// Adicionar: Requisito "se houver #include <Trade/Trade.mqh>, insira esta linha DEPOIS".
// substituído por "se houver #include <Expert/Expert.mqh>, insira esta linha DEPOIS".
// Correção: OrderSend de ordens de mercado retorna posições de tíquetes, não transações.
 
Esse comportamento não está implementado na biblioteca

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

Como trabalhar corretamente no MT5 com o OrderSend

fxsaber, 2016.10.13 07:10

Sobrecarga de OrderSend muito simples escrita por mim: até que OnTrade retorne uma resposta, todos os OrderSends subsequentes retornam falso. Quando a resposta é recebida, o false forçado é cancelado.

ZY Se você quiser ter todos os recursos (não para SB), deverá chamar OnTrade OnTick e OnTimer independentemente quando a sincronização correspondente chegar.

Leve em conta essa circunstância do MT5 ao trabalhar com as funções usuais do MT4-Order: OrderSend, OrderModify, OrderClose, OrderDelete.

É possível adicionar sincronização de histórico garantida (como no MT4) após ordens de negociação para o MT5, usando o algoritmo na cotação.

[Excluído]  
A ideia é interessante. No entanto, o Expert Advisor MT4 convertido no MT5 funciona lentamente
 
Aliaksandr Kryvanos:
A ideia é interessante. No entanto, o Expert Advisor MT4 convertido no MT5 funciona lentamente

Somente a implementação de OrderSelect(index, SELECT_BY_POS, MODE_HISTORY) é lenta. Poderia ser mais rápida, mas, nesse caso, não haveria uma certa classificação do histórico, que está disponível no MT4 e que algumas pessoas usam. Se não for usado, seria possível fazer com que esse modo não funcionasse mais lentamente do que no MT4. Todo o resto definitivamente não é mais lento. Portanto, se você não usar o modo OrderSelect mencionado acima, procure freios fora do MT4Orders.

Quanto às séries temporais e outras coisas, esse tópico é enfatizado na descrição - ele não foi abordado. É muito provável que você tenha freios lá.

 
Há um erro no MT5 build 1455

ENUM_ORDER_TYPE_FILLING::ORDER_FILLING_RETURN.

Portanto, se no OrderModify o preenchimento é definido via COrderInfo::TypeFilling(), então no mesmo RoboForexEU-MetaTrader 5 haverá um erro lógico [Unsupported filling mode]. No entanto, esse erro não ocorre na MetaQuotes-Demo - o servidor do desenvolvedor está configurado de forma incorreta?


Isso pode causar o erro [Unsupported filling mode] em alguns servidores de negociação ao tentar modificar ordens pendentes por meio do OrderModify.

Se você tiver encontrado esse problema, poderá contornar esse erro da seguinte maneira

  1. Encontre a linha em MT4Orders.mqh
          Request.type_filling = (ENUM_ORDER_TYPE_FILLING)::OrderGetInteger(ORDER_TYPE_FILLING);

  2. Substitua-a por estas linhas
          Request.symbol = ::OrderGetString(ORDER_SYMBOL);
          
          // https://www.mql5.com/ru/forum/1111/page1759#comment_2906850
          if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)      
            Request.type_filling = (ENUM_ORDER_TYPE_FILLING)::OrderGetInteger(ORDER_TYPE_FILLING);

 
Biblioteca MT5 padrão VS MT4-OSS de plataforma cruzada

biblioteca padrão e escrevi um EA de teste

#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;
  }
}

você pode comparar o código das funções MT4Order e MT5Order.


[Excluído]  
Sim, você está certo, o desempenho lento se deve a OrdersHistoryTotal()
 
Aliaksandr Kryvanos:
Sim, você está certo, o trabalho lento se deve a OrdersHistoryTotal()

Talvez valha a pena criar uma versão mais rápida dessa função. Funcionará sem lentidão, mas não será 100% compatível com o MT4.

Dei uma olhada no código agora. Há várias maneiras de acelerá-lo. Por exemplo, no testador, você pode se preocupar com a sincronização com o histórico do MT5, já que tudo é simples no testador.

Mas, para ser sincero, nem no testador nem na negociação real, nunca encontrei tarefas em que o TS precisasse analisar o histórico.

Portanto, duvido que eu faça essa aceleração.

 
fxsaber:

Talvez valha a pena criar uma versão mais rápida desse recurso. Funcionará sem atrasos, mas não é 100% compatível com o MT4.

Dei uma olhada no código agora. Há várias maneiras de acelerar o processo. Por exemplo, no testador, você pode se preocupar com a sincronização com o histórico do MT5, pois tudo é simples no testador.

Mas, para ser honesto, nem no testador nem na negociação real, nunca encontrei tarefas em que o TS precisasse analisar o histórico.

É por isso que duvido que eu faça essa aceleração.

Eu uso a análise de histórico, meu MM implica negociar uma situação, durante a qual ocorre o fechamento e a abertura de posições, e o risco é levado em conta usando o resultado financeiro do início da situação.

Sob a situação, podemos imaginar que uma tendência é identificada - o trabalho em seu desenvolvimento até sua conclusão é diferente - abrindo e fechando posições, mas é importante saber o que você pode arriscar, porque quanto mais longa for a tendência, maior será a probabilidade de sua conclusão - daí o volume diferente de ordens abertas e pontos de saída.