Особенности языка mql5, тонкости и приёмы работы - страница 96

 

Вот очень кстати разговор коснулся GetSystemTimePreciseAsFileTime. Подобной функции очень не хватает в MQL, ну или хотя бы с округлением до микро/милли-секунд.  Время в секундах - это слишком грубо.  В самом MT везде используются миллисекунды.  Сейчас приходится городить огород, синтезируя точное время с помощью той же GetMicrosecondCount:

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

Вот очень кстати разговор коснулся GetSystemTimePreciseAsFileTime. Подобной функции очень не хватает в MQL, ну или хотя бы с округлением до микро/милли-секунд.  Время в секундах - это слишком грубо.  В самом MT везде используются миллисекунды.  Сейчас приходится городить огород, синтезируя точное время с помощью той же GetMicrosecondCount:

создайте свой callback с генерацией в mcs через WinApi функционал

 
Konstantin:

создайте свой callback с генерацией в mcs через WinApi функционал

А callback тут зачем?

 
Alexey Navoykov:

А callback тут зачем?

ну если хотите весь поток тогда достаточно функции-кольца, а если хотите с событиями работать то callback

 
Проверяйте свои работы (как быть с Маркетом - не знаю) на наличие механизма невидимости. Можно серьезно "попасть"...
 
Старая тема, но совсем простой код для понимания проблемы

Forum on trading, automated trading systems and testing trading strategies

How to check that an order is executed after calling PositionOpen

fxsaber, 2018.08.09 20:35

Try this script there ForexTimeFXTM-Demo01 (or FXOpen-MT5)

#include <Trade/Trade.mqh>

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

Sometimes two new positions will open, not one.


Скриптом пытаемся открыть одну новую позицию, а получаем иногда две.

 
fxsaber:
Старая тема, но совсем простой код для понимания проблемы

Скриптом пытаемся открыть одну новую позицию, а получаем иногда две.

Так вроде как было уже решение в КБ:

//+------------------------------------------------------------------+
//| Возвращает "неопределённое" состояние торгового окружения        |
//+------------------------------------------------------------------+
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:
Проверяйте свои работы (как быть с Маркетом - не знаю) на наличие механизма невидимости. Можно серьезно "попасть"...

Прошёл по ссылке, но не понял, о каком механизме невидимости речь.

 
Alexey Navoykov:

Прошёл по ссылке, но не понял, о каком механизме невидимости речь.

Индикатор в скрытом режиме на графике. Он выгружает советники. Я так понял при беглом взгляде с мобилы.

 
Alexey Navoykov:

Прошёл по ссылке, но не понял, о каком механизме невидимости речь.

Его не удалить.

Причина обращения: