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

Alexey Navoykov
4552
Alexey Navoykov  

Вот очень кстати разговор коснулся 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;
}
Konstantin
744
Konstantin  
Alexey Navoykov:

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

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

Alexey Navoykov
4552
Alexey Navoykov  
Konstantin:

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

А callback тут зачем?

Konstantin
744
Konstantin  
Alexey Navoykov:

А callback тут зачем?

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

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

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.


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

Artyom Trishkin
Модератор
49198
Artyom Trishkin  
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;
     }

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

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

Artyom Trishkin
Модератор
49198
Artyom Trishkin  
Alexey Navoykov:

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

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

fxsaber
16082
fxsaber  
Alexey Navoykov:

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

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