Различная скорость выполнения скрипта и советника...

 
В продолжение начатой темы "Возможно ли запустить эксперта из скрипта?"

Мне показалось что разница скорости выполнения эксперта и скрипта разная не потому, что я не прописал ObjectsRedraw в конце функции Init, где у меня идут расчёты по истории в советнике. Это ничего не изменило.
У меня даже функция Init выходила по timeout, если история была слишком большой. Там я думаю тоже есть ограничение на выполнение функции Init в 2.5 секунды.
Вобщем, чтобы не быть голословным, то хочу показать что один и тот же код, но оформленный ввиде эксперта и советника выполняется с разной скоростью. В частности функция Init.
Надеюсь вы обсудите со мою эту проблему. Для меня впринципе это не критично, но, просто, удивительно, что функция инит в советнике выполняется на 6 сек долше чем та же функция с тем же кодом в скрипте, где Init выполняется меньше секунды.
А ведь скорость выполнения советника существенно повлияет на скорость оптимизации.
Файлы:
 
Это - время появления записи в логе. И ничего более. Для замера времени используйте разницу значений функции GetTickCount в начале и конце функции
 
Хорошо, я засёк выполнение функции init (а в ней также выполняется функция start) в тиках как для эксперта так и для скрипта.
Теперь видна разница исполнения функции start (а именно она вызывается из init у меня и берёт больше всего времени для расчётов) как в тиках так и в
секундах. Время записи в лог не имеет никагого значения в этом случае.
Вообще, напишу ещё другой пример попроще ввиде скрипта и эксперта и посмотрю будет ли так же разница в скорости исполнения.
Файлы:
 
К сожалению, Вы не привели полный исходный код эксперта. И это самое главное.

Меня удивляют вопросы по коду без предоставления самого кода.
Наверное это нормально задавать такие вопросы без точных деталей?
Тогда также верно и нам задавать вопрос "где же код?", но это не останавливает обобщенные и обезличенные вопросы...
 
Renat:
К сожалению, Вы не привели полный исходный код эксперта. И это самое главное.

Меня удивляют вопросы по коду без предоставления самого кода.
Наверное это нормально задавать такие вопросы без точных деталей?
Тогда также верно и нам задавать вопрос "где же код?", но это не останавливает обобщенные и обезличенные вопросы...
Ну это были предварительные вопросы по скорости выполнения одного и того же кода как в советнике, так и в скрипте, но если заинтересовались проблемой то привожу код, который в советнике и скрипте один и тот же а так же новый log, модифицированный немного. Там разбил время выполнения init по блокам и функциям и вывожу колличество баров в истории, по которой производятся предварительные расчёты по истории.

Сначала идёт код а затем log

#property copyright "Alex Verb" #property link "" //#property show_inputs #include <stdlib.mqh> //extern bool recalculate = true; bool recalculate = true; datetime setup_array[9], active_setup_array[9], countdn_array[13]; datetime zero_bar_time; int bars, obj_num, period, combo_phase; int combo_type, setup_index, countdn_index, active_combo_type, active_setup_index, combo_num; double text_point_shift; string prefix; int init() { int tb = GetTickCount(); SetTimeFrameValues(); int te = GetTickCount(); Print("Время выполнения функции SetTimeFrameValues() в тиках ", te - tb); tb = GetTickCount(); if(recalculate == true) { ObjectsDeleteAll(); SaveParameters(); recalculate = false; } LoadParameters(); te = GetTickCount(); Print("Время выполнения блока работы с параметрами в тиках ", te - tb); start(); ObjectsRedraw(); return(0); } int deinit() { return(0); } int start() { int tb = GetTickCount(); bars = CheckForNewBars(); if(bars > 0) Print("bars ", bars); if(bars <= 0) return(0); while(bars > 0) { ProccessBar(); bars--; } SaveParameters(); int te = GetTickCount(); Print("Время выполнения функции start() в тиках ", te - tb); return(0); } int GetIndex(datetime time) { return (iBarShift(NULL, 0, time)); /* int tmp_bars = bars - 1; datetime tmp_time = Time[bars - 1]; while(time < tmp_time) { tmp_time -= Period()*60; if(Time[tmp_bars + 1] == tmp_time) tmp_bars++; } return(tmp_bars); */ } int CheckForNewBars() { return (iBarShift(NULL, 0, zero_bar_time)); /* int tmp_bars = 0; datetime tmp_time = Time[0]; while(zero_bar_time < tmp_time) { tmp_time -= Period()*60; if(Time[tmp_bars + 1] == tmp_time) tmp_bars++; } return(tmp_bars); */ } void ProccessBar() { //Определяем начало установочного набора (setup) на покупку (buy) if(Close[bars] < Close[bars + 4] && Close[bars + 1] >= Close[bars + 5]) { combo_type = -1; setup_index = 0; } //Определяем начало установочного набора (setup) на продажу (sell) if(Close[bars] > Close[bars + 4] && Close[bars + 1] <= Close[bars + 5]) { combo_type = 1; setup_index = 0; } //Добавляем индекс новой свечи в установочный набор на покупку (buy) if (combo_type == -1 && Close[bars] < Close[bars + 4]) { if (setup_index <= 8) { setup_array[setup_index] = Time[bars]; } if (setup_index >= 8) { SetActiveSetupAndStartCountdn(); CheckSetupBarsForCountdn(); return; } setup_index++; } //Добавляем индекс новой свечи в установочный набор на продажу (sell) if (combo_type == 1 && Close[bars] > Close[bars + 4]) { if (setup_index <= 8) { setup_array[setup_index] = Time[bars]; } if (setup_index >= 8) { SetActiveSetupAndStartCountdn(); CheckSetupBarsForCountdn(); return; } setup_index++; } //Добавляем индекс свечи в отчёт на покупку (buy) if (active_combo_type == -1) { if (countdn_index == 13) { //Проверяем условие законченности combo (подскок). if (Close[bars] > Close[bars + 4]) { CompliteNewCountdn(); } return; } if (Close[bars]/* + Point*1*/ > Low[bars + 2]) return; if(Low[bars]/* + Point*1*/ >= Low[bars + 1]) return; if(countdn_index > 0) { int index1 = GetIndex(countdn_array[countdn_index - 1]); if(Close[bars]/* + Point*1*/ >= Close[index1]) return; } countdn_array[countdn_index] = Time[bars]; countdn_index++; return; } //Добавляем индекс свечи в отчёт на продажу (sell) if (active_combo_type == 1) { if (countdn_index == 13) { //Проверяем условие законченности combo (подскок). if (Close[bars] < Close[bars + 4]) { CompliteNewCountdn(); } return; } if (Close[bars]/* + Point*1*/ < High[bars + 2]) return; if(High[bars]/* + Point*1*/ <= High[bars + 1]) return; if(countdn_index > 0) { index1 = GetIndex(countdn_array[countdn_index - 1]); if(Close[bars]/* + Point*1*/ <= Close[index1]) return; } countdn_array[countdn_index] = Time[bars]; countdn_index++; return; } } void SetActiveSetupAndStartCountdn() { for (int i = 0; i < 9; i++) active_setup_array[i] = setup_array[i]; active_combo_type = combo_type; active_setup_index = setup_index; combo_type = 0; countdn_index = 0; } void CompliteNewCountdn() { combo_num++; DrawSetup(); DrawCountDown(); active_combo_type = 0; countdn_index = 0; } void CheckSetupBarsForCountdn() { if(active_combo_type == -1) { for(int i = 0; i < 9; i++) { int index = GetIndex(active_setup_array[i]); if (Close[index]/* + Point*1*/ > Low[index + 2]) continue; if(Low[index]/* + Point*1*/ >= Low[index + 1]) continue; if(countdn_index > 0) { int index1 = GetIndex(countdn_array[countdn_index - 1]); if(Close[index]/* + Point*1*/ >= Close[index1]) continue; } countdn_array[countdn_index] = active_setup_array[i]; countdn_index++; } } if(active_combo_type == 1) { for(i = 0; i < 9; i++) { index = GetIndex(active_setup_array[i]); if (Close[index]/* + Point*1*/ < High[index + 2]) continue; if(High[index]/* + Point*1*/ <= High[index + 1]) continue; if(countdn_index > 0) { index1 = GetIndex(countdn_array[countdn_index - 1]); if(Close[index]/* + Point*1*/ <= Close[index1]) continue; } countdn_array[countdn_index] = active_setup_array[i]; countdn_index++; } } } void DrawSetup() { datetime time; double price; for (int i = 0; i < 9; i++) { string text = i + 1; int index = GetIndex(active_setup_array[i]); time = Time[index]; price = Low[index]; DrawText(text, time, price, Red); } } void DrawCountDown() { for (int i = 0; i < 13; i++) { string text = i + 1; int index = GetIndex(countdn_array[i]); datetime time = Time[index]; double price = Low[index]; string object_name = DrawText(text, time, price, Yellow); if(i == 0) { if(active_setup_array[8] == countdn_array[0]) { price -= text_point_shift; } } } } string DrawText(string text, datetime time, double price, color font_color) { obj_num++; string object_name = obj_num; int ret = ObjectFind(object_name); if(ret != -1) return (0); ObjectCreate(object_name, OBJ_TEXT, 0, time, price); ObjectSet(object_name, OBJPROP_TIMEFRAMES, period); ObjectSetText(object_name, text, 7, "Arial", font_color); return (object_name); } void SetTimeFrameValues() { prefix = Symbol(); string time_frame; switch(Period()) { case PERIOD_M1: time_frame = "_M1|"; period = OBJ_PERIOD_M1; text_point_shift = Point*2; break; case PERIOD_M5: time_frame = "_M5|"; period = OBJ_PERIOD_M5; text_point_shift = Point*3; break; case PERIOD_M15: time_frame = "_M15|"; period = OBJ_PERIOD_M15; text_point_shift = Point*4; break; case PERIOD_M30: time_frame = "_M30|"; period = OBJ_PERIOD_M30; text_point_shift = Point*5; break; case PERIOD_H1: time_frame = "_H1|"; period = OBJ_PERIOD_H1; text_point_shift = Point*6; break; case PERIOD_H4: time_frame = "_H4|"; period = OBJ_PERIOD_H4; text_point_shift = Point*7; break; case PERIOD_D1: time_frame = "_D1|"; period = OBJ_PERIOD_D1; text_point_shift = Point*8; break; case PERIOD_W1: time_frame = "_W1|"; period = OBJ_PERIOD_W1; text_point_shift = Point*9; break; case PERIOD_MN1: time_frame = "_MH1|"; period = OBJ_PERIOD_MN1; text_point_shift = Point*10; break; } prefix = StringConcatenate(prefix, time_frame); } void SaveParameters() { if(recalculate == false) zero_bar_time = Time[0]; if(IsTesting() == falsespan class="
Файлы:
 
Посмотрите у вас случаем не стоит приоритет выполнения потока с советником как LOWEST? Может быть поэтому на выполнение кода советника уходит на много больше тиков чем для выполнения скрипта?
 
Сразу ответ не дам - мы замерим скорость выполнения и ответим.
Спасибо за поднятый вопрос!
 
Renat:
Сразу ответ не дам - мы замерим скорость выполнения и ответим.
Спасибо за поднятый вопрос!
Хорошо, буду ждать ответа. Если будут дополнительные вопросы по самому коду ввиде советника и эксперта, то спрашивайте. За темой буду следить.
 
15:10:47 Combo_script EURUSD,H1: loaded successfully 15:10:47 Combo_script EURUSD,H1: Время
 
Да у вас и правда всё нормально. Ну не знаю в чем проблема. Попробую переустановить МТ4.
Вы значит просто методом перетаскивания кидали сначала скрипт а затем эксперта на чарт? И у эксперта значит появляется морда улыбающаяся?
Вы котировки от себя берёте или с какого то брокера конкретного? Я поробовал с двух. Это ничего не меняет.
Бум искать проблему у себя. Спасибо за тестирование.
Мож что посоветуете проверить, что могло бы так затормозить работу советника?
 
кстати, может быть кто-то тоже попробует у себя этот код запустить ввиде эксперта и скрипта?
Причина обращения: