Bibliotecas: MT4Orders - página 81

 

Com a diretiva #define MT4ORDERS_FASTHISTORY_OFF ativada, ele não compila - gera muitos erros.

Anteriormente, tive que ativar essa diretiva porque algumas funcionalidades (discutidas aqui ) usadas no artigo não estão disponíveis sem ela. Se a funcionalidade ainda for reduzida, é desejável corrigi-la.

Библиотеки: MT4Orders - Попробуйте отключить этот медленный режим. Выделенная ссылка отвечает за игнорирование закрытых позиций по CloseBy, а поиск соответствующего выхода
Библиотеки: MT4Orders - Попробуйте отключить этот медленный режим. Выделенная ссылка отвечает за игнорирование закрытых позиций по CloseBy, а поиск соответствующего выхода
  • 2019.09.27
  • www.mql5.com
что такой простой код не работал корректно в MT5 со старой версией библиотеки. Было бы очень желательно указать как минимум в шапке комменатриев исходника. а поиск соответствующего выхода как раз обложен условной компиляцией на MT4ORDERS
 
Stanislav Korotky #:

Com a diretiva #define MT4ORDERS_FASTHISTORY_OFF ativada, ele não é compilado e gera muitos erros.

Esse é um vestígio histórico que não consigo remover.

A MQ criou tantas dores de cabeça que só vale a pena usar as variantes mais sofisticadas.

Deveria haver uma grande atualização da biblioteca, apesar da estranha falta de relatórios de erros. Ela ainda não está pronta.

 
OrderSelect(i, SELECT_BY_POS)

Nessa operação, sempre há posições abertas nos índices mais baixos e ordens pendentes nos índices mais altos.

Com a ajuda desse fato, é possível acelerar um pouco a busca pelas ordens MT4 necessárias.

 

Gostaria de saber se é possível vencer o Testador em uma velocidade em que não deveria haver nenhuma chance?

Escrevi um Expert Advisor "sem chances" - otimizado ao máximo para velocidade.

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

input int inAmountMagics = 50; // Quantos TCs devem ser emulados

// Abrir uma posição e uma ordem para cada TS. Código MT4 para fins de brevidade.
void OnInit()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))  
    for (int i = 0; i < inAmountMagics; i++)
    {
      OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0, NULL, i);
      
      OrderSend(_Symbol, OP_BUYLIMIT, 1, Tick.ask - 1 e4*_Point, 0, 0, 0, NULL, i);
    }
}

// Colete informações das posições/ordens corretas. Código MT5 rápido ao máximo.
double CountOrders( const int Type, const int Magic )
{
  double Res = 0;
  
  if (Type <= OP_SELL)
  {
    for (int i = PositionsTotal() - 1; i >= 0; i--)
      if (PositionGetTicket(i) && (PositionGetInteger(POSITION_TYPE) == Type) && PositionGetInteger(POSITION_MAGIC) == Magic)
        Res += PositionGetDouble(POSITION_PRICE_OPEN) + PositionGetDouble(POSITION_PRICE_CURRENT) +
               PositionGetDouble(POSITION_TP) + PositionGetDouble(POSITION_SL);
  }
  else
    for (int i = OrdersTotal(true) - 1; i >= 0; i--)
      if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) == Type) && OrderGetInteger(ORDER_MAGIC) == Magic)
        Res += OrderGetDouble(ORDER_PRICE_OPEN) + OrderGetDouble(ORDER_PRICE_CURRENT) +
               OrderGetDouble(ORDER_TP) + OrderGetDouble(ORDER_SL);
        
  return(Res);
}

// Número para controlar a correção de implementações alternativas.
double OnTesterValue = 0;
double OnTester() { return(OnTesterValue); }

void OnTick()
{
  // Simular a operação em todos os TCs.
  for (int i = 0; i < inAmountMagics; i++)
    OnTesterValue += CountOrders(POSITION_TYPE_BUY, i) + 
                     CountOrders(POSITION_TYPE_SELL, i) +
                     CountOrders(ORDER_TYPE_BUY_LIMIT, i) +
                     CountOrders(ORDER_TYPE_SELL_LIMIT, i);  
}

Pelo código, você pode argumentar que ele foi escrito para ser lento. Mas o código emula o trabalho de muitos "TS". E muitos TSs funcionam exatamente da mesma maneira - em primeiro lugar, eles encontram suas posições/ordens.

OnTester result 54790620.97344553
EURCAD,M1: 192394 ticks, 1440 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:01:21.775 (including ticks preprocessing 0:00:00.016).
81 segundos para executar. Para um dia de ticks reais, algo muito grande. Mas o que está lá.
 
fxsaber #:

81 segundos para concluir. Para um dia com ticks reais, isso é muito. Mas o que é.

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

Bibliotecas: Virtual

fxsaber, 2023.03.01 20:36

OnTester result 54790620.97344553
EURCAD,M1: 192394 ticks, 1440 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:00:46.653 (including ticks preprocessing 0:00:00.016).

A soma de verificação corresponde. Consegui aumentar a velocidade quase duas vezes.

Não foi fácil, mas funcionou.

 
fxsaber #:

Escreveu um EA "sem chance" - otimizado ao máximo para velocidade.

Uma maneira simples de aumentar a velocidade.
 

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

Bibliotecas: MT4Orders

fxsaber, 2022.07.20 00:39

// Lista de modificações:
// 20.07.2022
// Adição: Adicionado OrderLotsOpen() - posição completa/volume da ordem antes de fechar/excluir. Funciona corretamente apenas no modo ByPass.

Usando o mesmo exemplo (abriu 1 lote e fechou-o gradualmente em 0,1, 0,2, 0,3 e 0,4 lotes), mas com uma visualização diferente.


OrderLotsOpen() em quadros vermelhos na parte superior da imagem.
 

Olá,

Parece que há um erro no OrderTicket()

Não é o ticket correto do histórico do MT5


Este é o meu código:

bool isCopyHistory2(string u_symbol, int master_ticket)
  {

   int ticket_copy;

   bool is_exists = false;

// recuperação de informações do histórico comercial

   for(int i = 0; i < OrdersHistoryTotal(); i++)
     {
      //---- verificar o resultado da seleção

      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false)
        {
         Print("Access to history failed with error (", GetLastError(), ")");
         continue;
        }

      // algum trabalho com a ordem

      ticket_copy = (int)extract_master_ticket(OrderComment());

      if(ticket_copy == master_ticket)
        {
	//print-for-debug
        Print("c ticket: ", OrderTicket());  // ==> esse tíquete não está correto no MT5
         is_exists = true;
         break;
        }

     }

//---

   if(!is_exists)

      Print("New Signal #" + (string)master_ticket);

   return(is_exists);

  }

 
Cuong Le Van #:

Parece que há um bug em OrderTicket()

Não é o ticket correto do histórico do MT5

Aparentemente, você deseja obtê-lo.

// Lista de alterações:
// 13.03.2019
// Adicionar: Adicionado OrderTicketID() - PositionID of an MT5 transaction or MT5 position, and the ticket of a pending MT4 order.

Os motivos estão detalhados aqui.

 
fxsaber #:

Aparentemente, você deseja obtê-lo.


Os motivos estão detalhados aqui.

Muito obrigado.

Está tudo bem com

OrderTicketID()