Oxy
..ιllιlι.lι.ιllι.ιlι..

 
Уровень 21

  Торгую в компаниях:


Группа "Программирование на MQL"

Рейтинг 270



Извращённый способ регулирования скорости тестера. MT4

Многие, наверное, сталкивались с проблемой при тестировании в MT4 на всех тиках: скорость тестирования 31 медленная, прям тягомотина, а скорость 32 — вмиг график улетает, не успеваешь на паузу в нужном месте нажать.
И я задумалась о регулировании скорости 32. Увеличить скорость 31 не смогу, но вот искусственно замедлить 32-ю скорость — почему бы не попробовать.
А создам ка я бесполезный цикл, который просто высчитывает какие-то ненужные значения, и, посмотрю, как это повлияет на скорость:
void SlowdownSpeedTester () {
  double _sn = 2, _sb = 3;
  for(int i=0; i<SpeedForTester; i++) {
    _sn *= _sn;
    _sb *= _sb;
  }
}

Во входящие переменные у советника вывела параметр:
extern int    SpeedForTester= 200000;  // замедляем скорость тестирования

И в функцию OnTick() добавила ссылку на цикл:
if(IsTesting()) { 
  if(SpeedForTester>0) SlowdownSpeedTester();
}

Прогнала советник в тестере — помогло! Скорость 32 замедлилась!
Но проблема в том, что для изменения скорости, надо остановить советник полностью, изменить входящий параметр и снова запустить советник.
Т.е. чтобы было удобно пользоваться, надо вынести этот входящий параметр на график.
Сразу же пришла в голову мысль добавить объект поля ввода на график. Удобно же. Но! Обработчик событий OnChartEvent, в тестере не работает. Можно было совсем извратиться и всё-таки заставить поле ввода работать и в тестере.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Но я пошла другим путем: добавила текстовую метку — с ней будем работать.

Функцию добавления текстовой метки беру стандартную с сайта mql4 и чуть под себя переделываю:
//+------------------------------------------------------------------+
//| Создает текстовую метку                                          |
//+------------------------------------------------------------------+
bool LabelCreate(const string            name="Label",             // имя метки                 
                 const int               x=0,                      // координата по оси X
                 const int               y=0,                      // координата по оси Y
                 const color             clr=clrRed,               // цвет 
                 const string            text="text",              // текст
                 const int               font_size=16,             // размер шрифта 
                 const ENUM_BASE_CORNER  corner=CORNER_RIGHT_UPPER,// угол графика для привязки                 
                 const string            font="Arial",             // шрифт                                                 
                 const ENUM_ANCHOR_POINT anchor=ANCHOR_RIGHT_UPPER,// способ привязки
                 const double            angle=0.0,                // наклон текста
                 const bool              back=false,               // на заднем плане
                 const bool              selection=true,           // выделить для перемещений
                 const bool              hidden=true,              // скрыт в списке объектов
                 const long              z_order=0,                // приоритет на нажатие мышью
                 const int               sub_window=0,             // номер подокна
                 const long              chart_ID=0)               // ID графика
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим текстовую метку
   if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0)) {
      Print(__FUNCTION__, ": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
      return(false);
   }
//--- установим координаты метки
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим текст
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- установим размер шрифта
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- установим угол наклона текста
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- установим способ привязки
   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+

Во входящих переменных остается:
extern int    SpeedForTester= 200000;  // замедляем скорость тестирования

В OnInit() добавляю:
if(IsTesting()) {
  LabelCreate("EDIT", 20, 80, clrOrangeRed, (string)SpeedForTester, 16);
}

В OnTick() меняю:
if(IsTesting()) { 
  int _speed = (int)ObjectGetString(0, "EDIT", OBJPROP_TEXT);
  if(_speed>0) SlowdownSpeedTester(_speed);
}

Сама функция цикла почти не изменилась:
void SlowdownSpeedTester (int _speed) {
  double _sn = 2, _sb = 3;
  for(int i=0; i<_speed; i++) {
    _sn *= _sn;
    _sb *= _sb;
  }
}

Вот, что у нас на графике:


Чтобы изменить скорость, прямо во время тестирования надо войти в свойства метки (правая клавиша мыши). И что примечательно — тестирование во время этой процедуры само встанет на паузу! А уже в свойствах изменить поле «текст»:


Чем больше число — тем меньше скорость, чем меньше число — тем выше скорость. Удобно просто приписывать или удалять ноль у числа.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Применим полученные данные на практике.
Недавно советник писала, который позволяет торговать в тестере вручную. Добавим туда регулятор скорости:
EA_inTester_Sell_Buy_btns_speed.rar (24 Kb) Тестируйте на здоровье!

P.S. Нужен программист? Пишите в личку — подскажу, какие идеи возьмусь реализовывать и почём.
Также пользователи от 3-го уровня могут обращаться в "Стол заказов".
  • +10
  • Просмотров: 6018
  • 27 апреля 2016, 14:11
  • Oxy
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Программирование на MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Панель управления на MQL4 это просто!
Следующая запись в группе  
Индикатор "Спидометр"
05 апреля 2016
08 июня 2016

Комментарии (13)

+
+1
Oxy, спасибо большое! Это очень хороший инструмент для тренировки!:) 

Как говорится, все гениальное — просто.
avatar

  3  newpvr Сообщений: 17 - Павел

  • 28 апреля 2016, 11:56
+
0
пользуйтесь ;) 
avatar

  21  Oxy Автор Сообщений: 3224 - ..ιllιlι.lι.ιllι.ιlι..

  • 28 апреля 2016, 12:00
+
0
а можно, попросить тебя, этот «ускоритель» вставить в другой тестер???
avatar

  6  Carbon13 Сообщений: 85

  • 11 мая 2016, 16:17
+
0
Пишите в личку, дайте ссылку на советник: возьмусь или нет и подскажу по стоимости (может получиться символически)
avatar

  21  Oxy Автор Сообщений: 3224 - ..ιllιlι.lι.ιllι.ιlι..

  • 11 мая 2016, 23:12
+
+1
по-моему наоборот, он слишком медленно работает на 32
avatar

  9  morww Сообщений: 31

  • 11 мая 2016, 17:20
+
0
задайте другое число, будет работать быстрее:
«Чем больше число — тем меньше скорость, чем меньше число — тем выше скорость.»

P.S. Еще же все зависит от компа и от процессора, чем он занят. Если я параллельно еще нагружаю компьютер работой, то мне и ни какой замедлитель не нужен бывает — и так все тормозит.
Редактирован: 11 мая 2016, 23:10
avatar

  21  Oxy Автор Сообщений: 3224 - ..ιllιlι.lι.ιllι.ιlι..

  • 11 мая 2016, 23:08
+
0
Oxy, ты просто гений, давно хотел такую штучку!!!
Только вот что хотелось бы изменить — чтобы бай и селл работали независимо друг от друга, если это возможно. Буду сюда заходить периодически смотреть. Вдруг увидишь моё сообщение))). Спасибо заранее.
Редактирован: 1 октября 2017, 18:18
avatar

  0  rob8 Сообщений: 1

  • 1 октября 2017, 18:18
+
+1
В «P.S.» скрыт ответ на ваш вопрос
avatar

  21  Oxy Автор Сообщений: 3224 - ..ιllιlι.lι.ιllι.ιlι..

  • 1 октября 2017, 22:01
+
+1
Прежде чем полностью понять, что ты сделала, вынужден был внимательно дважды прочесть. Но поржал от души<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/003.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/003.gif' alt=' :D '>&nbsp; '>&nbsp; 
Самый примитив — это, скажем, набабахать прерывания на прерывания на прерывания. Здесь искусственное замедление носит прикладной характер, здорово:) 
Забавно, я как-то этот топик упустил из виду полтора года назад…
Редактирован: 2 октября 2017, 16:26
avatar

  15  ShamanHand Сообщений: 422 - Матрёшковод, трёхлинейщик и повелитель ГиП.

  • 2 октября 2017, 16:20
+
0
Oxy, спасибо!
А есть возможность переписать в виде индикатора?
avatar

  7  stepmega Сообщений: 85

  • 22 апреля 2018, 09:26
+
0
Пишите тех задание в личку — подскажу: возьмусь или нет, а также по стоимости и срокам.
avatar

  21  Oxy Автор Сообщений: 3224 - ..ιllιlι.lι.ιllι.ιlι..

  • 24 апреля 2018, 23:35
+
0
Получается, чтобы потестить свою сову, мне надо «код регулятора скорости» в него вставить?.. Я правильно понимаю?
Редактирован: 28 апреля 2018, 23:31
avatar

  12  cerber04 Сообщений: 353

  • 28 апреля 2018, 23:26
+
0
если вас не устраивает скорость тестера, как описано в топике, то да
avatar

  21  Oxy Автор Сообщений: 3224 - ..ιllιlι.lι.ιllι.ιlι..

  • 29 апреля 2018, 01:02

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари