Бета-версия платформы MetaTrader 5 build 1995: Экономический календарь, MQL5-программы в виде сервисов и API для языка R - страница 9

 
Alexey Volchanskiy:

Только позавчера эти сокеты добавили, не думаю, что уже скорректировали правила. Но тут обсуждали, что в Маркет нельзя с использованием Webrequest. А сокеты это гораздо опаснее, думаю, тоже зарубят. Если что-то поменялось, модераторы меня поправят.

Опасность в том,что можно легко передавать наружу данные о счете пользователя.

Ни сокеты, ни вебреквесты не являются запрещенными в маркете.

 
Renat Fatkhullin:

Ни сокеты, ни вебреквесты не являются запрещенными в маркете.

Благодарю за поправку, у меня почему-то засело в голове, что веб-реквесты запрещены. Это радует!

 
fxsaber:

Вешаю индикатор на чарт кастомного символа. По таймеру из индикатора пробрасываю тик на свой же символ.

Как результат, в Обзоре рынка обновляется тик. Но он не попадает в историю, никак не формирует бары и не вызывает OnCalculate.

Прошу исправить этот баг.

Сколько раз уже просили давать подробности.

Бывают тики, которые не формируют бар.

 
Slava:

Сколько раз уже просили давать подробности.

Бывают тики, которые не формируют бар.

На стадии подготовки воспроизведения столкнулся с тем, что огромный код воспроизводит. Малый - нет. Как локализую, дам подробности.

 
fxsaber:
Баг в Тестере
Исправили
 
fxsaber:

На стадии подготовки воспроизведения столкнулся с тем, что огромный код воспроизводит. Малый - нет. Как локализую, дам подробности.

Полное воспроизведение.

На MQ-Beta запускаем этот скрипт

// Скрипт создает символ TEMP со свойствами EURUSD.

void OnStart()
{
  const string Name = "TEMP";
  
  if (CustomSymbolCreate(Name, NULL, "EURUSD") && SymbolSelect(Name, true))
    ChartOpen(Name, _Period);  
}


На открывшемся TEMP-чарте запускаем этот индикатор

// Индикатор, запущенный на символе TEMP, каждую секунду пробрасывает исторический EURUSD-тик.

#property indicator_chart_window

#property indicator_buffers 0
#property indicator_plots indicator_buffers

MqlTick Ticks[];

void OnInit()
{
  EventSetTimer(1);
    
  CustomRatesDelete(_Symbol, 0, INT_MAX);  // Удалили баровую историю
  CustomTicksDelete(_Symbol, 0, LONG_MAX); // Удалили тиковую историю
  
  // Получим какие-нибудь тики EURUSD
  CopyTicks("EURUSD", Ticks, COPY_TICKS_ALL, (ulong)D'2019.01.01' * 1000, 5); // Взяли 5 штук
  ArrayPrint(Ticks); // Убедимся, что тики корректные
}

void OnTimer()
{
  static int i = 0;
  
  if (i < ArraySize(Ticks))
  {
    MqlTick NewTicks[1];    
    NewTicks[0] = Ticks[i++];
    
    ResetLastError();
    Print(CustomTicksAdd(_Symbol, NewTicks)); // На каждом вызове таймера пробрасываем тик.
    Print(GetLastError());                    // Выводим номер ошибки.
  }  
}

int  OnCalculate( const int , const int , const int, const double &[] )
{
  Print(__FUNCTION__); // При пробросе тика контролируем, что идет вызов OnCalculate
  
  return(0);
}


При первом запуске индикатора увидим (потом через CTRL+U), что тики попадают в историю, но бары не формируются и OnCalculate не вызывается.

При следующих запусках индикатора двоякое поведение: либо тики не пробрасываются с ошибкой, либо тики пробрасываются, но в историю не попадают.


Воспроизводится баг?

 
fxsaber:

Полное воспроизведение.

На MQ-Beta запускаем этот скрипт


На открывшемся TEMP-чарте запускаем этот индикатор


При первом запуске индикатора увидим (потом через CTRL+U), что тики попадают в историю, но бары не формируются и OnCalculate не вызывается.

При следующих запусках индикатора двоякое поведение: либо тики не пробрасываются с ошибкой, либо тики пробрасываются, но в историю не попадают.


Воспроизводится баг?

И на словах теперь объясните, какие тики в данном примере вы отдаёте клиентскому терминалу. Именно словами распишите Ваш алгоритм.
 
Slava:
И на словах теперь объясните, какие тики в данном примере вы отдаёте клиентскому терминалу. Именно словами распишите Ваш алгоритм.

Отдаю исторические EURUSD-тики

                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.01.02 06:00:00 1.14458 1.14463 0.0000        0 1546408800101     134       0.00000
[1] 2019.01.02 06:00:02 1.14455 1.14460 0.0000        0 1546408802603     134       0.00000
[2] 2019.01.02 06:00:02 1.14455 1.14459 0.0000        0 1546408802708       4       0.00000
[3] 2019.01.02 06:00:02 1.14454 1.14459 0.0000        0 1546408802903     130       0.00000
[4] 2019.01.02 06:00:03 1.14454 1.14458 0.0000        0 1546408803001       4       0.00000


С ними все в порядке. Более того, первый запуск даже эти тики помещает в историю. Что не так?

 
fxsaber:

Отдаю исторические EURUSD-тики


С ними все в порядке. Более того, первый запуск даже эти тики помещает в историю. Что не так?

Вы по таймеру раз за разом отправляете эти же самые тики. Каждый раз одни и те же.

После первого раза время последнего тика будет 2019.01.02 06:00:03

На следующей итерации тик со временем 2019.01.02 06:00:00 не войдёт. Так как будет считаться устаревшим. У вас будт проходить только последний тик со временем 06:00:03, так как оно не является более ранним

 
Slava:

Вы по таймеру раз за разом отправляете эти же самые тики. Каждый раз одни и те же.

После первого раза время последнего тика будет 2019.01.02 06:00:03

На следующей итерации тик со временем 2019.01.02 06:00:00 не войдёт. Так как будет считаться устаревшим. У вас будт проходить только последний тик со временем 06:00:03, так как оно не является более ранним

Обратите, пожалуйста, внимание на static в OnTimer.