MT5 e velocidade em ação - página 18

 
Renat Fatkhullin:

Você só tem dois estados 5000 e sem limite?

Você é o mestre de sua própria felicidade.

Sim, você precisa ou de controle total ou de controle superficial. Não vejo qual é o ponto intermediário.
 
Renat Fatkhullin:

Em teoria, sim.

Não se esqueça dos processos de sincronização. Um grande número de processos na plataforma são assíncronos.

Por exemplo, uma integração de gateway com um provedor de câmbio ou liquidez pode enviar relatórios de transações com atrasos de segundos ou mesmo minutos. Muitas vezes a api não fornece acesso ao histórico para a reconciliação, mas fornece geradores de relatórios lentos e não rítmicos.

Na abertura do mercado, ou devido a uma reconexão inesperada do portal, os relatórios podem ser atrasados. Eles são replicados para o histórico no servidor e imediatamente enviados de forma assíncrona para os terminais. Por causa da classificação por data, eles são inseridos nos lugares certos e, enquanto isso, você pode abrir novos negócios.

A maioria dos APIs de integração são tão analfabetos e disfuncionais que quase impossibilitam a criação de gateways garantidos. Embora haja uma opinião de que se trata de um produto de sabotagem deliberada por seus desenvolvedores.

Devemos dar o direito de escolha? Quem precisa de "snaps" físicos e quem precisa o suficiente para trabalhar com índices com riscos apropriados.

 
Comentários não relacionados a este tópico foram movidos para "Perguntas dos iniciantes do MQL5 MT5 MetaTrader 5".
 
fxsaber:

Devemos dar o direito de escolha? Quem precisa de "snaps" físicos e quem precisa o suficiente para trabalhar com índices com os riscos adequados.

Qual é o problema em manter um cache local na EA e a amostragem em relação ao último tempo de atualização? Eu tenho e nunca tive nenhum atraso com isso. Minhas funções de rede tornam toda a interface mais lenta devido a sua implementação síncrona, seria bom ter WebRequestAsync fora da caixa, embora eu já esteja olhando para DLL ou até mesmo invólucros de python e C++, já que há uma API de negociação em python :)

Mas trabalhar com grandes quantidades de dados sem cache local é muito estranho.

PS. Em geral, máscaras de hash e caching são muito procuradas em várias moedas e é por isso que eu pedi acima neste tópico por máscaras de hash normais (leia-se rápido) fora da caixa.
Документация по MQL5: Сетевые функции / WebRequest
Документация по MQL5: Сетевые функции / WebRequest
  • www.mql5.com
Для использования функции WebRequest() следует добавить адреса серверов в список разрешенных URL во вкладке "Советники" окна "Настройки". Порт сервера выбирается автоматически на основе указанного протокола - 80 для "http://" и 443 для "https://". Функция WebRequest() является синхронной, это означает, что она приостанавливает выполнение...
 
Andrey Pogoreltsev:

Qual é o problema em manter um cache local na EA e a amostragem em relação ao último tempo de atualização?

O roteiro faz exatamente isso.

Quanto ao cache local, é assim que a história é implementada no MT4Orders.

 
fxsaber:

Quanto ao cache local, foi assim que o MT4Orders implementou a história.

Eu não esperava que o roteiro, que tem dois anos de idade, fosse

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

OrderCloseTime Expert Advisor MQL5

fxsaber, 2018.07.06 00:49

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

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      OpenTime = OrderOpenTime();
      CloseTime = OrderCloseTime();
      
      break;
    }
}

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
  
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
          OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
          
        break;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime&, datetime& );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
  datetime OpenTime, CloseTime;
  datetime Tmp = 0;

  for (int i = 0; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
  Print(Tmp);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

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

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


mostrará tais freios!

// Первый запуск
2020.08.28 22:01:12.941 HistoryDealsTotal() = 9435
2020.08.28 22:01:13.198 2046.04.30 00:13:20
2020.08.28 22:01:13.198 Time[Bench(LastTimeMQL4)] = 257277
2020.08.28 22:01:43.982 2046.04.30 00:13:20
2020.08.28 22:01:43.982 Time[Bench(LastTimeMQL5)] = 30783493

// Второй запуск
2020.08.28 22:03:31.474 HistoryDealsTotal() = 9435
2020.08.28 22:03:31.724 2046.04.30 00:13:20
2020.08.28 22:03:31.724 Time[Bench(LastTimeMQL4)] = 250491
2020.08.28 22:04:02.011 2046.04.30 00:13:20
2020.08.28 22:04:02.011 Time[Bench(LastTimeMQL5)] = 30286258

O cache MQL5 puro é 100 vezes mais lento que o cache parcial (somente HistorySelectByPosition).

 
O teste é de todo inaceitável.

Para o estilo MQL5, você testou especificamente 10 000 amostras de HistorySelect em toda a profundidade. E você também acrescentou ciclos extras.

Sem uma declaração inicial clara das condições, explicando seu óbvio viés e dando números chocantes - esta é a mais pura trapaça e manipulação.

Para tais brincadeiras sujas com um bilhete de caça ao lobisomem.
 
Renat Fatkhullin:
O teste é de todo inaceitável.

Para o estilo MQL5, você testou especificamente 10 000 amostras de HistorySelect em toda a profundidade. E você também acrescentou ciclos extras.

Sem uma declaração inicial clara das condições, explicando seu óbvio viés e dando números chocantes - esta é a mais pura trapaça e manipulação.

Para tais brincadeiras sujas com um bilhete de caça ao lobisomem.

Portanto, sua percepção está errada. É mostrado que é correto se esconder para que não haja espinhos em seu lado.

Se entendi corretamente, após esta implementação.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

MT5 e Velocidade em Ação

Renat Fatkhullin, 2020.08.27 22:58

Já otimizamos muitas operações de amostragem e agora estamos pensando na atualização ideal do cache, quando na realidade 99% das amostras serão completamente inúteis e faltarão na realidade.

Ou seja, a menos que você randomize especificamente os limites de amostragem, o cache mostrará acessos próximos a 100%.

Muito provavelmente, na próxima semana já haverá uma solução eficaz.


este exemplo correrá muito mais rápido.


HH O roteiro calcula o tempo de abertura/fechamento da última posição no histórico comercial.

 
fxsaber:

Mostra-lhe como se esconder adequadamente, para que você não seja jogado fora.

Se você "cache" como este, será super-rápido.

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  static ulong PrevTicketIn = 0;  // Хранит тикет входа позиции с последнего вызова.
  static ulong PrevTicketOut = 0; // Хранит тикет выхода позиции с последнего вызова.
  
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
      
      if (Ticket == PrevTicketOut)            
      {
        OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        CloseTime = (datetime)HistoryDealGetInteger(PrevTicketOut, DEAL_TIME);        
        
        break;
      }
      else if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        PrevTicketOut = Ticket;
        
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
        {
          PrevTicketIn = HistoryDealGetTicket(0);
          OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        }
          
        break;
      }
    }
  }
}

Quem escreve assim?

 
fxsaber:

Se você "esconde-lo" assim, será super-rápido.

Quem escreve assim?

C programadores.