Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5 - страница 37

 
Denis Kirichenko:

Аналогично. Просто создание символа и торговля по нему в Тестере у меня разнесены на отдельные процедуры.

Только так.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: Virtual

fxsaber, 2018.11.21 06:26

А вот почему скрипт ускоряет еще в четыре раза - сложно объяснить. Единственное отличие, в скрипте не формируются бары, а штатный Тестер их формирует. Но почему он их формирует столь медленно - загадка.

В новых билдах появилась замечательная возможность ускорения индикаторов - вычисляются, когда к ним обращаются. Почему бы не применить тот же подход к барам? Считаем бары тогда, когда к ним обращаются. Ведь бары - это тот же индикатор.

 

The one and only client that has bought my product (for the techs to test: checkOnlineStatus ) two days ago reported right away a access violation:

Единственный клиент, который купил мой продукт (для тех, кто тестировал: checkOnlineStatus) два дня назад сразу сообщил о нарушении прав доступа:

2018.11.20 10:12:51.049 CheckOnlineStatus (GBPCHF,H4) Access violation at 0x00007FF654802AD8 read to 0x0000004080260D24
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A68 8B058A379300 mov eax, [rip+0x93378a]
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A6E 4C8BD2 mov r10, rdx
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A71 4C8BC1 mov r8, rcx
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A74 83F805 cmp eax, 0x5
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A77 0F8CCC000000 jl dword 0x7ff654802b49
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4)
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A7D 41F6C001 test r8b, 0x1
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A81 7429 jz 0x7ff654802aac
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4)
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A83 488D0451 lea rax, [rcx+rdx*2]
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A87 488BD1 mov rdx, rcx
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A8A 483BC8 cmp rcx, rax
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A8D 0F84A1010000 jz dword 0x7ff654802c34
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4)
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A93 33C9 xor ecx, ecx
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A95 66390A cmp [rdx], cx
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A98 0F8496010000 jz dword 0x7ff654802c34
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4)
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802A9E 4883C202 add rdx, 0x2
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AA2 483BD0 cmp rdx, rax
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AA5 75EE jnz 0x7ff654802a95
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4)
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AA7 E988010000 jmp 0x7ff654802c34
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4)
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AAC 83E11F and ecx, 0x1f
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AAF B820000000 mov eax, 0x20
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AB4 482BC1 sub rax, rcx
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AB7 498BD0 mov rdx, r8
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802ABA 48F7D9 neg rcx
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802ABD 4D1BDB sbb r11, r11
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AC0 4C23D8 and r11, rax
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AC3 49D1EB shr r11, 1
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AC6 4D3BD3 cmp r10, r11
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AC9 4D0F42DA cmovb r11, r10
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802ACD 33C9 xor ecx, ecx
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802ACF 4B8D0458 lea rax, [r8+r11*2]
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AD3 4C3BC0 cmp r8, rax
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AD6 740E jz 0x7ff654802ae6
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4)
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) crash --> 00007FF654802AD8 66390A cmp [rdx], cx
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802ADB 7409 jz 0x7ff654802ae6
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4)
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802ADD 4883C202 add rdx, 0x2
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AE1 483BD0 cmp rdx, rax
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AE4 75F2 jnz 0x7ff654802ad8
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4)
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AE6 492BD0 sub rdx, r8
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00007FF654802AE9 48D1FA sar rdx, 1
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4)
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 00: 0x00007FF654802AD8
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4) 01: 0x00007FF6548058CB
2018.11.20 10:12:51.091 CheckOnlineStatus (GBPCHF,H4)

Can you please check what's wrong with the indicator?
Thanks, Martin.
00:43
Here from another terminal:
2018.11.20 00:29:31.482 CheckOnlineStatus (USDCHF,H1) Access violation at 0x00007FF7D2392AD8 read to 0x0000009B8DD30D24
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A68 8B058A379300 mov eax, [rip+0x93378a]
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A6E 4C8BD2 mov r10, rdx
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A71 4C8BC1 mov r8, rcx
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A74 83F805 cmp eax, 0x5
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A77 0F8CCC000000 jl dword 0x7ff7d2392b49
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1)
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A7D 41F6C001 test r8b, 0x1
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A81 7429 jz 0x7ff7d2392aac
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1)
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A83 488D0451 lea rax, [rcx+rdx*2]
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A87 488BD1 mov rdx, rcx
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A8A 483BC8 cmp rcx, rax
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A8D 0F84A1010000 jz dword 0x7ff7d2392c34
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1)
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A93 33C9 xor ecx, ecx
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A95 66390A cmp [rdx], cx
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A98 0F8496010000 jz dword 0x7ff7d2392c34
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1)
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392A9E 4883C202 add rdx, 0x2
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AA2 483BD0 cmp rdx, rax
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AA5 75EE jnz 0x7ff7d2392a95
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1)
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AA7 E988010000 jmp 0x7ff7d2392c34
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1)
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AAC 83E11F and ecx, 0x1f
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AAF B820000000 mov eax, 0x20
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AB4 482BC1 sub rax, rcx
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AB7 498BD0 mov rdx, r8
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392ABA 48F7D9 neg rcx
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392ABD 4D1BDB sbb r11, r11
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AC0 4C23D8 and r11, rax
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AC3 49D1EB shr r11, 1
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AC6 4D3BD3 cmp r10, r11
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AC9 4D0F42DA cmovb r11, r10
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392ACD 33C9 xor ecx, ecx
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392ACF 4B8D0458 lea rax, [r8+r11*2]
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AD3 4C3BC0 cmp r8, rax
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AD6 740E jz 0x7ff7d2392ae6
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1)
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) crash --> 00007FF7D2392AD8 66390A cmp [rdx], cx
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392ADB 7409 jz 0x7ff7d2392ae6
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1)
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392ADD 4883C202 add rdx, 0x2
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AE1 483BD0 cmp rdx, rax
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AE4 75F2 jnz 0x7ff7d2392ad8
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1)
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AE6 492BD0 sub rdx, r8
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00007FF7D2392AE9 48D1FA sar rdx, 1
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1)
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 00: 0x00007FF7D2392AD8
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 01: 0x00007FF7D23958CB
2018.11.20 00:29:31.512 CheckOnlineStatus (USDCHF,H1) 

He send me an email - I started (my version of) the indicator and on my pc (Win7,64, Mt5 b1947) it is working perfectly.

I asked for further details (OS, terminal build, logfiles) but I haven't got it yet.

Он отправил мне электронное письмо - я начал (свою версию) индикатор и на своем компьютере (Win7,64, Mt5 b1947) работает отлично.

Я попросил подробности (OS,
terminal build, logfiles), но я еще не получил его.

 

Can it be that the EAs and indicators compiled before beta 1930 won't run on terminals build 1930+.

Could this cause the occasional access violation?

Может ли быть, что эксперты и индикаторы, составленные до бета-версии 1930 года, не будут работать на терминалах, построенных в 1930 году.

Может ли это вызвать случайное нарушение прав доступа?

 
Carl Schreiber:

Can it be that the EAs and indicators compiled before beta 1930 won't run on terminals build 1930+.

Could this cause the occasional access violation?

Может ли быть, что эксперты и индикаторы, составленные до бета-версии 1930 года, не будут работать на терминалах, построенных в 1930 году.

Может ли это вызвать случайное нарушение прав доступа?

К сожалению, билд 1930 содержит ошибку.

Использование StringFormat и PrintFormat может вызвать эту ошибку, если MQL программа скомпилирована билдом редактора до 1930

Ошибка была исправлена, терминал необходимо обновить на билд 1947
 

My client told me that my indicator runs on MT5 build 1940 on a VPS at Beeks with Windows Server 2012 - connected with ICMarkets and Apari.

Мой клиент сказал мне, что мой индикатор работает на MT5 build 1940 на VPS на Beeks с Windows Server 2012 - связан с ICMarkets и Apari.

 
Не оптимальная реализация доступа к истории осталась

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения

fxsaber, 2017.12.08 22:46

Решил посмотреть скоростные характеристики предложенного решения. Советник для тестера

#include <MT4Orders.mqh>
#include <Generic\HashMap.mqh>

CHashMap<ulong, double> DealsProfit;

// Создаем историю из Amount сделок в тестере
void CreateHistory( const int Amount, const double Lots = 0.1 )
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick) && Tick.ask && Tick.bid)
    for (int i = (Amount >> 1) - 1; i >= 0; i--)
      OrderClose(OrderSend(_Symbol, OP_BUY, Lots, Tick.ask, 0, 0, 0), Lots, Tick.bid, 0);
}

// Заполняем массив случайно выбранными сделками
void GetDeals( const int Amount, const int MaxDealTicket, ulong &Deals[] )
{
  for (int i = ArrayResize(Deals, Amount) - 1; i >= 0; i--)  
    Deals[i] = MathRand() * MaxDealTicket / SHORT_MAX;
}

// Заполнили HashMap
void SetHashMap()
{
  if (HistorySelect(0, INT_MAX))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong DealTicket = HistoryDealGetTicket(i);
      
      DealsProfit.Add(DealTicket, HistoryDealGetDouble(DealTicket, DEAL_PROFIT));
    }
}

double GetDealProfitHashClear( const ulong Deal )
{
  static double Profit = 0;
  
  return(DealsProfit.TryGetValue(Deal, Profit) ? Profit : 0);
}

double GetDealProfitFull( const ulong Deal )
{
  return(HistoryDealSelect(Deal) ? HistoryDealGetDouble(Deal, DEAL_PROFIT) : 0);
}

double GetDealProfitClear( const ulong Deal )
{
  return(HistoryDealGetDouble(Deal, DEAL_PROFIT));
}

typedef double (*GetDealProfit)( const ulong );

// Находим суммарный профит сделок из массива
double SumProfit( const ulong &Deals[], GetDealProfit DealProfit )
{
  double Profit = 0;
  
  for (int i = ArraySize(Deals) - 1; i >= 0; i--)
    Profit += DealProfit(Deals[i]);
    
  return(Profit);
}

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

int OnInit()
{
  const int Amount = 100000;  
  CreateHistory(Amount); // Создаем историю из Amount сделок в тестере
  
  ulong Deals[];
  GetDeals(Amount, Amount, Deals); // Заполняем массив случайно выбранными сделками

  // Находим суммарный профит сделок из массива
  
  BENCH(Print(SumProfit(Deals, GetDealProfitFull))); // Полноценная классическая реализация
  
  BENCH(SetHashMap()); // Заполнили HashMap
  BENCH(Print(SumProfit(Deals, GetDealProfitHashClear))); // Реализация через HashMap
  
  BENCH(HistorySelect(0, INT_MAX));
  BENCH(Print(SumProfit(Deals, GetDealProfitClear))); // Реализация с предварительно загруженной историей
  
  return(INIT_FAILED);
}

Советник открывает 100 000 сделок, затем ищет суммарный профит случайных сделок разными методами (см. комментарии). Результат

2017.12.05 00:00:00   -13133.19999999244
2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitFull))] = 38082
2017.12.05 00:00:00   Time[SetHashMap()] = 57849
2017.12.05 00:00:00   -13133.19999999244
2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitHashClear))] = 7437
2017.12.05 00:00:00   Time[HistorySelect(0,INT_MAX)] = 1
2017.12.05 00:00:00   -13133.19999999244
2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitClear))] = 31669

Ну вот сравниваем два выделенных показателя. Получается, что HashMap-доступ в 4 раза быстрее того, что у разработчиков. Но у разработчиков он уже включает историю...

В 4 раза - много это или мало для данной ситуации? Ну здесь это 24 миллсекунды. Если очень много раз обращаться к истории, то, наверное, получится заметно сэкономить. Но не уверен.


Для более реального тестерного случая (2000 сделок и 1 000 000 единичных обращений к истории) результат выглядит так

2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitFull))] = 122969
2017.12.05 00:00:00   Time[SetHashMap()] = 816
2017.12.05 00:00:00   4829800340.792288
2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitHashClear))] = 23852
2017.12.05 00:00:00   Time[HistorySelect(0,INT_MAX)] = 1
2017.12.05 00:00:00   4829800340.792288
2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitClear))] = 114427

Почти 100 мс экономии на проход! Если, допустим, делаем Оптимизацию на 10 000 полноценных проходов, то Hash-вариант закончится на 15 минут быстрее.

Разработчикам за реализацию работы с Историей твердую пятерку ставить пока рано. Видно, что могут ускорить, раз даже MQL-решение уделывает.


Результат на билде 1949

2018.09.01 00:00:00   -42594.50000000905
2018.09.01 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitFull))] = 22048
2018.09.01 00:00:00   Time[SetHashMap()] = 35959
2018.09.01 00:00:00   -42594.50000000905
2018.09.01 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitHashClear))] = 4974
2018.09.01 00:00:00   Time[HistorySelect(0,INT_MAX)] = 1
2018.09.01 00:00:00   -42594.50000000905
2018.09.01 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitClear))] = 22151


Скорость доступа к историии выросла в 1.5 раза, но отставание от Hash-реализации осталось прежним - в 4-5 раз.

 
Ilyas :

К сожалению, билд 1930 содержит ошибку.

Использование StringFormat и PrintFormat может вызвать эту ошибку, если MQL программа скомпилирована билдом редактора до 1930

Ошибка была исправлена, терминал необходимо обновить на билд 1947

Спасибо, я проинструктировал ег.

Thank you - I instructed him accordingly.

 
Slava:

Спасибо за сообщение. Исправим.

Кстати, в билде 1881 график из окна свойств тоже получается при помощи ChartNext. Но у него символ - пустой (ChartSymbol) и период (ChartPeriod) равен 0

Билд 1947

1. Как выяснилось, проблема затрагивает и все другие окна (Вид/Символы, Справка и т.д). 

2. И попутно. Посмотрите эксперт:

void OnInit() 
   {
   EventSetMillisecondTimer(500);                 
   }
void OnTimer()                                   
   { 
   ExpertRemove(); 
   Print("+++++++++++++++++++++++  Meтка 203" ); 
   Sleep(15000);
   Print("+++++++++++++++++++++++  Meтка 204" ); 
   }
Sleep() после ExpertRemove() работает не так, как ожидается. Такое впечатление, что не в милли-, а в микро-секундах.
Причина обращения: