Características da linguagem mql5, subtilezas e técnicas - página 96

 

A propósito, GetSystemTimePreciseAsFileTime foi muito interessante. Tal função está muito ausente em MQL, ou pelo menos arredondada para micro/milissegundos. O tempo em segundos é demasiado rude. Na própria MT são usados milissegundos em todo o lado. Agora temos de fazer isto sintetizando o tempo exacto usando a mesma GetMicrosecondCount:

long TimeLocal_mcs() 
{ 
  static long time0_mcs= 0;
  if (time0_mcs==0) { datetime t=TimeLocal();  while(TimeLocal()==t);  time0_mcs= (t+1)*1 e6 - GetMicrosecondCount(); }
  datetime time= TimeLocal();
  long time_mcs= time0_mcs + GetMicrosecondCount();
  long delta= time_mcs - time*(long)1 e6; 
  if (delta<0) { time0_mcs-=delta;  time_mcs-=delta; }  
  return time_mcs;
}
 
Alexey Navoykov:

A propósito, GetSystemTimePreciseAsFileTime foi muito interessante. Nós realmente precisamos dessa função em MQL, ou pelo menos arredondado para micro/milissegundos. O tempo em segundos é muito rude. Em MT em si os milissegundos são usados em todo lugar. Agora temos que fazer isso sintetizando o tempo exato usando a mesma função GetMicrosecondCount:

crie seu próprio callback com geração em mcs através da funcionalidade WinApi

 
Konstantin:

crie seu próprio callback com geração em mcs através da funcionalidade WinApi

Para que é a ligação de retorno?

 
Alexey Navoykov:

Para que é a ligação de retorno?

Bem, se você quer o fio inteiro, então um anel de função é suficiente, e se você quer trabalhar com eventos, então uma chamada de retorno

 
Verifique seu trabalho (eu não sei sobre o Mercado) para um mecanismo de invisibilidade. Podes ser "apanhado" a sério...
 
Tópico antigo, mas código muito simples para entender o problema

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

Como verificar se uma ordem é executada após chamar a PositionOpen

fxsaber, 2018.08.09 20:35

Experimente este script láForexTimeFXTM-Demo01 (ouFXOpen-MT5)

#include <Trade/Trade.mqh>

void OnStart()
{
  const int PrevTotal = PositionsTotal();
  
  CTrade Trade;  
  
  while (PositionsTotal() == PrevTotal)
    Trade.Buy(1);    
}

Às vezes, duas novas posições se abrem, não uma.


O roteiro tenta abrir uma nova posição, mas às vezes temos duas.

 
fxsaber:
Um tópico antigo, mas bastante simples para entender o problema.

O roteiro tenta abrir uma nova posição e às vezes temos duas.

É como se já existisse uma solução no QB:

//+------------------------------------------------------------------+
//| Возвращает "неопределённое" состояние торгового окружения        |
//+------------------------------------------------------------------+
bool IsUncertainStateEnv(const string symbol_name,const ulong magic_number)
  {
   if(MQLInfoInteger(MQL_TESTER)) return false;
   int total=OrdersTotal();
   for(int i=total-1; i>WRONG_VALUE; i--)
     {
      if(OrderGetTicket(i)==0) continue;
      if(OrderGetInteger(ORDER_TYPE)>ORDER_TYPE_SELL) continue;
      if(OrderGetInteger(ORDER_MAGIC)!=magic_number) continue;
      if(!OrderGetInteger(ORDER_POSITION_ID) && OrderGetString(ORDER_SYMBOL)==symbol_name)
         return true;
     }
   return false;
  }

//+------------------------------------------------------------------+
//| Заполняет массивы тикетов позиций                                |
//+------------------------------------------------------------------+
bool FillingListTickets(const uint number_of_attempts)
  {
//--- Проверка состояния окружения
   int n=0,attempts=int(number_of_attempts<1 ? 1 : number_of_attempts);
   while(IsUncertainStateEnv(symb,InpMagic) && n<attempts && !IsStopped())
     {
      n++;
      Sleep(sleep);
     }
   if(n>=attempts && IsUncertainStateEnv(symb,InpMagic))
     {
      Print(__FUNCTION__,": Uncertain state of the environment. Please try again.");
      return false;
     }
//---

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Проверка нулевых цен
   if(!RefreshRates() || Point()==0) return;
//--- Заполнение списков тикетов позиций
   int positions_total=PositionsTotal();
   if(prev_total!=positions_total)
     {
      if(FillingListTickets(num_attempts))
         prev_total=positions_total;
      else return;
     }

 
fxsaber:
Verifique seu trabalho (e sobre o Mercado - não sei) para o mecanismo de invisibilidade. Podias ser seriamente "apanhado"...

Segui o link, mas não entendi o mecanismo de invisibilidade em questão.

 
Alexey Navoykov:

Segui o link, mas não entendi o mecanismo de invisibilidade.

O indicador está em modo oculto no gráfico. Elimina os Expert Advisors. Eu entendi isso pelo olhar rápido do telemóvel.

 
Alexey Navoykov:

Segui o link, mas não entendi o mecanismo de invisibilidade.

Não pode ser removido.

Razão: