inputint Range = 0;
double Res = 0;
#define GETCURRENTTICK GetCurrentTick1(Tick)
//#define GETCURRENTTICK GetCurrentTick2(Tick, !i)//#define GETCURRENTTICK GetCurrentTick3(Tick)voidOnTick()
{
MqlTick Tick;
for (int i = 0; i < 100; i++)
if (GETCURRENTTICK)
Res += Tick.bid;
}
doubleOnTester()
{
return(Res);
}
bool GetCurrentTick1( MqlTick &Tick )
{
return(SymbolInfoTick(_Symbol, Tick));
}
bool GetCurrentTick2( MqlTick &Tick, constbool NewTick = false )
{
staticMqlTick CurrentTick;
if (NewTick)
SymbolInfoTick(_Symbol, CurrentTick);
Tick = CurrentTick;
return(true);
}
bool GetCurrentTick3( MqlTick &Tick )
{
staticMqlTick _Tick; // Аналог Bid в MT4
_Tick.bid += _Point; // Хоть какой-то расход вычислительный ресурсов.
Tick = _Tick;
return(true);
}
#define GETCURRENTTICK GetCurrentTick1(Tick)
#define GETCURRENTTICK GetCurrentTick2(Tick, !i)
#define GETCURRENTTICK GetCurrentTick3(Tick)
2020.05.2114:19:52.450 Core 1 pass 0 returned result 693275970.165784in0:00:08.9252020.05.2114:19:59.980 Core 1 pass 1 returned result 693275970.165784in0:00:07.5292020.05.2114:20:07.370 Core 1 pass 2 returned result 693275970.165784in0:00:07.3902020.05.2114:20:14.694 Core 1 pass 3 returned result 693275970.165784in0:00:07.3232020.05.2114:20:21.688 Core 1 pass 4 returned result 693275970.165784in0:00:06.9942020.05.2114:20:29.114 Core 1 pass 5 returned result 693275970.165784in0:00:07.4252020.05.2114:20:36.133 Core 1 pass 6 returned result 693275970.165784in0:00:07.0192020.05.2114:20:43.557 Core 1 pass 7 returned result 693275970.165784in0:00:07.4242020.05.2114:20:49.580 Core 1 pass 8 returned result 693275970.165784in0:00:06.0222020.05.2114:20:57.273 Core 1 pass 9 returned result 693275970.165784in0:00:07.6932020.05.2114:21:03.993 Core 1 pass 10 returned result 693275970.165784in0:00:06.7192020.05.2114:21:03.993 Tester optimization finished, total passes 112020.05.2114:21:04.003 Statistics optimization done in1 minutes 22 seconds
2020.05.2114:21:04.003 Statistics shortest pass 0:00:06.022, longest pass 0:00:08.925, average pass 0:00:07.3142020.05.2114:21:04.003 Statistics local 11 tasks (100%), remote 0 tasks (0%), cloud 0 tasks (0%)
2020.05.2114:21:49.346 Core 1 pass 0 returned result 693275970.165784in0:00:03.0502020.05.2114:21:51.108 Core 1 pass 1 returned result 693275970.165784in0:00:01.7612020.05.2114:21:52.903 Core 1 pass 2 returned result 693275970.165784in0:00:01.7952020.05.2114:21:54.731 Core 1 pass 3 returned result 693275970.165784in0:00:01.8272020.05.2114:21:56.536 Core 1 pass 4 returned result 693275970.165784in0:00:01.8032020.05.2114:21:58.341 Core 1 pass 5 returned result 693275970.165784in0:00:01.8052020.05.2114:22:00.135 Core 1 pass 6 returned result 693275970.165784in0:00:01.7932020.05.2114:22:01.912 Core 1 pass 7 returned result 693275970.165784in0:00:01.7772020.05.2114:22:03.663 Core 1 pass 8 returned result 693275970.165784in0:00:01.7502020.05.2114:22:05.458 Core 1 pass 9 returned result 693275970.165784in0:00:01.7942020.05.2114:22:07.274 Core 1 pass 10 returned result 693275970.165784in0:00:01.8152020.05.2114:22:07.274 Tester optimization finished, total passes 112020.05.2114:22:07.284 Statistics optimization done in0 minutes 21 seconds
2020.05.2114:22:07.284 Statistics shortest pass 0:00:01.750, longest pass 0:00:03.050, average pass 0:00:01.9062020.05.2114:22:07.284 Statistics local 11 tasks (100%), remote 0 tasks (0%), cloud 0 tasks (0%)
2020.05.2114:23:00.873 Core 1 pass 0 returned result 661757660284.981689in0:00:02.8592020.05.2114:23:02.704 Core 1 pass 1 returned result 661757660284.981689in0:00:01.8302020.05.2114:23:04.488 Core 1 pass 2 returned result 661757660284.981689in0:00:01.7832020.05.2114:23:06.227 Core 1 pass 3 returned result 661757660284.981689in0:00:01.7372020.05.2114:23:07.778 Core 1 pass 4 returned result 661757660284.981689in0:00:01.5502020.05.2114:23:09.517 Core 1 pass 5 returned result 661757660284.981689in0:00:01.7382020.05.2114:23:11.288 Core 1 pass 6 returned result 661757660284.981689in0:00:01.7712020.05.2114:23:12.997 Core 1 pass 7 returned result 661757660284.981689in0:00:01.7082020.05.2114:23:14.815 Core 1 pass 8 returned result 661757660284.981689in0:00:01.8172020.05.2114:23:16.621 Core 1 pass 9 returned result 661757660284.981689in0:00:01.8052020.05.2114:23:18.313 Core 1 pass 10 returned result 661757660284.981689in0:00:01.6912020.05.2114:23:18.313 Tester optimization finished, total passes 112020.05.2114:23:18.323 Statistics optimization done in0 minutes 21 seconds
2020.05.2114:23:18.323 Statistics shortest pass 0:00:01.550, longest pass 0:00:02.859, average pass 0:00:01.8442020.05.2114:23:18.323 Statistics local 11 tasks (100%), remote 0 tasks (0%), cloud 0 tasks (0%)
TheXpert: возможно метод инлайнится, тогда это проблема не отладчика, а компилятора для дебаг-режима
Вот-вот, проект получился переполненным макросами вдоль и поперек, как моими, так и из стандартных модулей. Возможно, поэтому, у отладчика не всегда получается сопоставить команды в дебаг файле *.ex5 со строками в исходном файле *.mq5 и остальных модулях...
так это стоимость самой функции а не передачи строки по значению а не по ссылке!
тем более ваш вариант с кэшем вполне себе решение, если выполнение этой функции занимает значимый процент времени от времени выполнения советника (во что я слабо верю)
Вот-вот, проект получился переполненным макросами вдоль и поперек, как моими, так и из стандартных модулей. Возможно, поэтому, у отладчика не всегда получается сопоставить команды в дебаг файле *.ex5 со строками в исходном файле *.mq5 и остальных модулях...
возможно у вас такая сложная структура файлов, что отладчик не может ассоциировать точку останова, тогда это проблема отладчика.
В Оптимизаторе эти функции вызываются десятки миллиардов раз.
тем более ваш вариант с кэшем вполне себе решение, если выполнение этой функции занимает значимый процент времени от времени выполнения советника (во что я слабо верю)
На определенном этапе становится важным не только относительное часть занимаемого времени, но и абсолютная.
Очень много текста, все не читал. Но если у вас что-то работает в дебаг версии и при этом не работает в релиз, или наоборот, то проверьте все ли переменные и поля, особенно в классе/структуре, были инициализированы.
Те данные, которые нуждались в инициализации я проинициализировал. А если, вдруг и окажутся где-то случайные данные, то это вызовет ошибку самой программы (например Array out of range или Invalid pointer). По крайней мере, на работу отладчика это не повлияет. И подобные баги он как раз и помогает найти.
TheXpert: возможно у вас такая сложная структура файлов, что отладчик не может ассоциировать точку останова, тогда это проблема отладчика.
Думаю, что структура файлов стандартных элементов UI, которые я использую в своем проекте еще сложнее, чем моих наработок. Для того чтобы сделать что-то подобное мне пришлось бы очень много работать. А так, бери и пользуйся, как говорится. Если всё сложить вместе, как в моём случае. То, действительно, получается нечто сложное. Но для работающих программ это вполне нормально.
На определенном этапе становится важным не только относительное часть занимаемого времени, но и абсолютная.
Попишите немного на Си языке, появится хорошая привычка аллоцировать переменные.
В первой пользовательской функции входящая MqlTick структура, сразу передаётся в функцию MQL, без выделения памяти. Такая запись называется плохим кодингом.
Во втором примере, создаётся переменная CurrentTick; под которую выделяется память. И такая запись считается более правильной. Так как память уже выделена, то входные данные обрабатываются быстрее, без лишних затрат.
#define GETCURRENTTICK GetCurrentTick1(Tick)#define GETCURRENTTICK GetCurrentTick2(Tick, !i)#define GETCURRENTTICK GetCurrentTick3(Tick)На тему бесплатности SymbolInfo-функций.
возможно метод инлайнится, тогда это проблема не отладчика, а компилятора для дебаг-режима
Вот-вот, проект получился переполненным макросами вдоль и поперек, как моими, так и из стандартных модулей. Возможно, поэтому, у отладчика не всегда получается сопоставить команды в дебаг файле *.ex5 со строками в исходном файле *.mq5 и остальных модулях...
На тему бесплатности SymbolInfo-функций.
так это стоимость самой функции а не передачи строки по значению а не по ссылке!
тем более ваш вариант с кэшем вполне себе решение, если выполнение этой функции занимает значимый процент времени от времени выполнения советника (во что я слабо верю)
Вот-вот, проект получился переполненным макросами вдоль и поперек, как моими, так и из стандартных модулей. Возможно, поэтому, у отладчика не всегда получается сопоставить команды в дебаг файле *.ex5 со строками в исходном файле *.mq5 и остальных модулях...
так это стоимость самой функции а не передачи строки по значению а не по ссылке!
Изначально к этому подводил.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
fxsaber, 2020.05.20 13:24
А лучше, конечно, иметь
В Оптимизаторе эти функции вызываются десятки миллиардов раз.
тем более ваш вариант с кэшем вполне себе решение, если выполнение этой функции занимает значимый процент времени от времени выполнения советника (во что я слабо верю)
На определенном этапе становится важным не только относительное часть занимаемого времени, но и абсолютная.
Очень много текста, все не читал.
Но если у вас что-то работает в дебаг версии и при этом не работает в релиз, или наоборот, то проверьте все ли переменные и поля, особенно в классе/структуре, были инициализированы.
Те данные, которые нуждались в инициализации я проинициализировал. А если, вдруг и окажутся где-то случайные данные, то это вызовет ошибку самой программы (например Array out of range или Invalid pointer). По крайней мере, на работу отладчика это не повлияет. И подобные баги он как раз и помогает найти.
Может у вас проявляется данныей дефект:
(не исправлено ME5(build 2390)) ** (new) Debuger, не работает StepInto (F11) и установленные breakpoints.
возможно у вас такая сложная структура файлов, что отладчик не может ассоциировать точку останова, тогда это проблема отладчика.
Думаю, что структура файлов стандартных элементов UI, которые я использую в своем проекте еще сложнее, чем моих наработок. Для того чтобы сделать что-то подобное мне пришлось бы очень много работать. А так, бери и пользуйся, как говорится. Если всё сложить вместе, как в моём случае. То, действительно, получается нечто сложное. Но для работающих программ это вполне нормально.
Изначально к этому подводил.
На определенном этапе становится важным не только относительное часть занимаемого времени, но и абсолютная.
Попишите немного на Си языке, появится хорошая привычка аллоцировать переменные.
В первой пользовательской функции входящая MqlTick структура, сразу передаётся в функцию MQL, без выделения памяти.
Такая запись называется плохим кодингом.
Во втором примере, создаётся переменная CurrentTick; под которую выделяется память.
И такая запись считается более правильной.
Так как память уже выделена, то входные данные обрабатываются быстрее, без лишних затрат.
Попишите немного на Си языке, появится хорошая привычка аллоцировать переменные.