Многие, наверное, сталкивались с проблемой при тестировании в 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-го уровня могут обращаться в "
Стол заказов".
Комментарии (15)
Как говорится, все гениальное — просто.
3 newpvr Сообщений: 17 - Павел
27 Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
6 Carbon13 Сообщений: 84
27 Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
10 morww Сообщений: 44
«Чем больше число — тем меньше скорость, чем меньше число — тем выше скорость.»
P.S. Еще же все зависит от компа и от процессора, чем он занят. Если я параллельно еще нагружаю компьютер работой, то мне и ни какой замедлитель не нужен бывает — и так все тормозит. Редактирован: 11 мая 2016, 23:10
27 Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
Только вот что хотелось бы изменить — чтобы бай и селл работали независимо друг от друга, если это возможно. Буду сюда заходить периодически смотреть. Вдруг увидишь моё сообщение))). Спасибо заранее. Редактирован: 1 октября 2017, 18:18
0 rob8 Сообщений: 1
27 Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
Самый примитив — это, скажем, набабахать прерывания на прерывания на прерывания. Здесь искусственное замедление носит прикладной характер, здорово
Забавно, я как-то этот топик упустил из виду полтора года назад… Редактирован: 2 октября 2017, 16:26
24 ShamanHand Сообщений: 1092 - Наношу добро, причиняю пользу.
А есть возможность переписать в виде индикатора?
7 stepmega Сообщений: 88
27 Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
16 cerber04 Сообщений: 409
27 Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
13 Enot-pipsun Сообщений: 300
24 ShamanHand Сообщений: 1092 - Наношу добро, причиняю пользу.
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий