Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 96

 

A proposito, GetSystemTimePreciseAsFileTime era molto interessante. Una tale funzione manca molto in MQL, o almeno arrotondata ai micro/millisecondi. Il tempo in secondi è troppo rozzo. In MT stesso i millisecondi sono usati ovunque. Ora dobbiamo fare questo sintetizzando il tempo esatto usando lo stesso 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 proposito, GetSystemTimePreciseAsFileTime era molto interessante. Abbiamo davvero bisogno di una tale funzione in MQL, o almeno arrotondata ai micro/millisecondi. Il tempo in secondi è troppo rozzo. Nella stessa MT i millisecondi sono usati ovunque. Ora dobbiamo farlo sintetizzando il tempo esatto usando la stessa funzione GetMicrosecondCount:

creare il proprio callback con generazione in mcs attraverso la funzionalità WinApi

 
Konstantin:

creare il proprio callback con generazione in mcs tramite la funzionalità WinApi

A cosa serve il richiamo?

 
Alexey Navoykov:

A cosa serve il richiamo?

Beh, se volete l'intero thread allora una funzione-anello è sufficiente, e se volete lavorare con gli eventi allora un callback

 
Controlla il tuo lavoro (non so il Mercato) per un meccanismo di invisibilità. Si può essere seriamente "beccati"...
 
Vecchio argomento, ma codice molto semplice per capire il problema

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Come controllare che un ordine venga eseguito dopo aver chiamato PositionOpen

fxsaber, 2018.08.09 20:35

Prova questo script lìForexTimeFXTM-Demo01 (oFXOpen-MT5)

#include <Trade/Trade.mqh>

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

A volte si aprono due nuove posizioni, non una.


Lo script cerca di aprire una nuova posizione, ma a volte ne ottiene due.

 
fxsaber:
Un vecchio argomento, ma un codice abbastanza semplice per capire il problema

Lo script cerca di aprire una nuova posizione e a volte ne ottiene due.

È un po' come se ci fosse già una soluzione in 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:
Controlla il tuo lavoro (e il Mercato - non lo so) per il meccanismo di invisibilità. Potresti essere seriamente "beccato"...

Ho seguito il link, ma non ho capito il meccanismo di invisibilità in questione.

 
Alexey Navoykov:

Ho seguito il link, ma non ho capito il meccanismo di invisibilità.

L'indicatore è in modalità nascosta sul grafico. Elimina gli Expert Advisors. L'ho capito dal rapido sguardo dal cellulare.

 
Alexey Navoykov:

Ho seguito il link, ma non ho capito il meccanismo di invisibilità.

Non può essere rimosso.

Motivazione: