Юрий доброго времени суток! Удалось мне запустить оптимизацию второго этапа и она прошла. Но во время оптимизации постоянно в логе такие вот ошибки валятся:
И по итогу как я понял в базу данных ничего не добавилось... Единственное в базе данных tasks поменялся статус задач второго этапа и время их выполнения.
Что значит эта ошибка и куда копать? Куда должна записываться информация о проходах и должна ли вообще? Если должна то по мере проходов или в конце всего этапа одной транзакцией вся в базу данных?
У меня такого не наблюдалось, то есть это действительно ошибка. Судя по этой строке лога:
2024.08.2301:15:04.693 SimpleVolumesStage2 (GBPUSD,M15) database error, table passes has 2 columns but 48 values were supplied
могу предположить, что у вас в основной базе таблица passes заменилась на ту, которая должна была создаваться только во второй базе. То есть в этой таблице теперь вместо 48 столбцов стало 2.
Информация о проходах второго этапа записывается в основную базу по мере завершения каждого прохода. То есть туда же, куда пишется информация о проходах первого этапа
С этим вопросом я разобрался и провёл второй этап. Проходов в основной базе добавилось. Но появилась новая проблема... Теперь с третьим советником. Он почему-то не берёт в работу проходы которые указываешь в списке, а берёт первые с самого начала с таблицы passes. И есть теперь предположение что советник второго этапа работал так-же и вся оптимизация неверная. Как это решить пока не пойму.
А вот база данных задачи должны по вашей задумке где создаваться, в папке Common\Files или в папке терминала MQL5\Files ?
С третьим советником тоже разобрался, вроде бы заработало как надо. Юрий спасибо Вам за советник и цикл статей этот.
PS: Заметил такой момент, это конечно не проблема но всё же, - вот при тесте в визуальном режиме в тестере советник открывает очень много отдельных ордеров, часто по 0.01 лота. Как я понимаю это от каждой виртуальной стратегии открываются свои позиции. А вроде бы если посмотреть схему из 3-й статьи то там согласно последней схеме он должен открывать по одной позиции на каждом торговом инструменте и просто корректировать объём в зависимости от суммарного лота и направления всех открытых виртуальных позиций. Типо как будто работа на netting счёте. Может быть это просто в тестере такой глюк или так отображаются позичии там... Юрий, а можно как то в советнике включить чтобы он на hage счёте работал как будто на netting счёте и имел только одну позицию в рынке по каждому торговому инструменту?
Если я правильно понимаю, то в MT5 такого сделать нельзя. Если хотим netting-исполнение, то открываем netting-счет. Если оставаться на hedge-счете, то реализовать работу через одну позицию можно только через полное закрытие имеющейся позиции и открытии новой с другим объёмом при каждой коррекции. А это ничего, кроме дополнительных потерь на комиссии и среде, не даёт.
Для лучшей визуализации, может быть действительно удобнее использовать по одной позиции на символ. Но тут проще для тестирования открыть ещё один демо-счет (или не демо) с netting.
Юрий здравствуйте. Провожу сейчас вот оптимизацию второго этапа и в логе периодически проскакивает ошибка занятости базы данных:
2024.09.0210:38:33.294 Optimization (EURUSD,M5) OnTimer | Current Task ID = 2882024.09.0210:38:38.294 Optimization (EURUSD,M5) OnTimer | Current Task ID = 2882024.09.0210:38:43.293 Optimization (EURUSD,M5) OnTimer | Current Task ID = 2882024.09.0210:38:48.293 Optimization (EURUSD,M5) OnTimer | Current Task ID = 2882024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) database error, database is locked
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) CDatabase::Execute | ERROR: 5605 in query
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) INSERT INTO passes VALUES (NULL, 288, 360, 10000.00,0.00,7003.37,9407.08,-2403.71,46.87,-28.78,941.40,59.00,941.40,59.00,-146.47,7.00,-87.89,13.00,9984.47,146.78,0.94,0.94,146.78,9933.81,217.95,1.92,1.92,217.95,5.57,3.91,32.13,4.09,7507.03,2340.00,1258.00,889.00,369.00,595.00,663.00,430.00,459.00,9.00,4.00,99.96,16091.26,'class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,24,0.10,0.10,150,5800.00,1800.00,31000,5)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],6.543218),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,16,0.10,0.10,0,2400.00,1200.00,27000,5)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],4.995504),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,120,0.50,1.90,50,2800.00,1200.00,60000,19)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],13.285506),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,38,1.30,1.30,50,3800.00,1100.00,13000,25)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],10.046213),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,32,0.50,0.90,100,2800.00,1100.00,2000,3)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],10.450413),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,32,0.50,0.90,150,2800.00,1100.00,2000,3)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],10.254307),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,12,0.10,0.10,150,2800.00,1500.00,21000,16)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],2.232143),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,120,0.50,1.90,0,2800.00,1200.00,16000,11)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],9.453583),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,120,0.50,1.90,0,2800.00,1200.00,27000,23)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],9.453583),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,120,0.50,1.90,0,2800.00,1200.00,39000,19)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],9.453583),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,28,0.60,0.30,0,2800.00,1300.00,52000,5)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],4.348582),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,42,0.50,0.60,150,2400.00,1600.00,2000,3)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],6.733553),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,12,0.10,0.30,150,5800.00,1900.00,51000,4)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],7.383343),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,32,0.50,0.90,150,2600.00,1100.00,1000,3)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],8.483203),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,12,0.10,0.10,150,5800.00,1900.00,38000,7)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],2.723237),class CVirtualStrategyGroup([
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) class CSimpleVolumesStrategy("GBPUSD",15,34,0.60,0.40,0,2200.00,1300.00,51000,5)
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],4.561836),
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) ],4.588208)',
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) 'i1_=0,i2_=0,i3_=0,i4_=0,i5_=0,i6_=0,i7_=0,i8_=0,i9_=0,i10_=0,i12_=0,i11_=0,i13_=0,i14_=0,i15_=0,i16_=0,idTask_=288,idParentJob_=18,count_=16',
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) '2024.09.0210:38:50');
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) CDatabase::ExecuteTransaction | ERROR: Transaction failed, error code=56052024.09.0210:38:53.293 Optimization (EURUSD,M5) OnTimer | Current Task ID = 2882024.09.0210:38:58.293 Optimization (EURUSD,M5) OnTimer | Current Task ID = 2882024.09.0210:39:03.323 Optimization (EURUSD,M5) OnTimer | Current Task ID = 2882024.09.0210:39:08.292 Optimization (EURUSD,M5) OnTimer | Current Task ID = 2882024.09.0210:39:13.305 Optimization (EURUSD,M5) OnTimer | Current Task ID = 288
Советник оригинальный, из статьи. Оптимизацию провожу на локальных агентах пк и по локальной сети на агентах другого пк. В целом процесс идёт и проходы в базу заполняются, но хотелось бы понять от чего происходит эта ошибка, ну и как то её исправить?
Ещё бывает некоторые задачи второго этапа очень быстро заканчиваются. Вот к примеру:
Вот здесь к примеру NZDCAD H1 M30 и NZDCHF H1 закончились буквально за один проход оптимизатора как я понимаю. Хотя там в базе проходов первого этапа для них много есть. Почему так происходит и что с этим можно сделать?
А NZDCAD M15 вообще ошибку выдал. Как я понимаю он не находит данных в базе данных, но как такое возможно? Ведь на первом этапе оптимизация этих пар была и проходы должны быть в базе...
Юрий а можно так вот к примеру сделать: вот я провёл первый и второй этап и сохранил всё в одну базу. А можно потом (после второго этапа) поменять, в базе данных, статус задач первого этапа для тех пар и тф на которых второй этап дал плохие результаты, чтобы для этих пар и тф как бы поверх второго этапа добавить проходов первого этапа ещё, а потом для них провести повторно второй этап? Просто при таком действии id новых проходов первого этапа будет выше чем id проходов второго этапа для всех остальных пар в этой базе. Я имею веду таблицу passes. Можно так сделать, и найдёт ли оптимизатор проходы превого этапа для этих пар и тф?
Проверьте в первую очередь, что у вас не оказалось запущено два экземпляра советника Optimization в разных графиках терминала. Про остальное отвечу позже.
2024.09.0210:38:50.882 SimpleVolumesStage2 (GBPUSD,M15) database error, database is locked
Где-то открыта и заблокирована база данных. Это может быть и внешнее приложение по отношению к тестеру, например, MetaEditor. Не помню, чтобы сталкивался с подобным.
2024.09.0210:45:41.008 SimpleVolumesStage2 (NZDCAD,M15) OnTesterInit | ERROR: Can't load data from file database892.sqlite.
2024.09.0210:45:41.008 SimpleVolumesStage2 (NZDCAD,M15) Check that it exists in data folder or in common data folder.
Это действительно говорит о том, что проходов первого этапа для NZDCAD M15 почему-то не нашлось.
А можно потом (после второго этапа) поменять, в базе данных, статус задач первого этапа для тех пар и тф на которых второй этап дал плохие результаты, чтобы для этих пар и тф как бы поверх второго этапа добавить проходов первого этапа ещё, а потом для них провести повторно второй этап? Просто при таком действии id новых проходов первого этапа будет выше чем id проходов второго этапа для всех остальных пар в этой базе. Я имею веду таблицу passes. Можно так сделать, и найдёт ли оптимизатор проходы превого этапа для этих пар и тф?
Да, так делать можно сколько угодно раз. Если хочется, чтобы старых проходов от предыдущих первых этапов не осталось, то их можно удалить из таблицы passes по нужным id_task.
Юрий доброго времени суток! Удалось мне запустить оптимизацию второго этапа и она прошла. Но во время оптимизации постоянно в логе такие вот ошибки валятся:
И по итогу как я понял в базу данных ничего не добавилось... Единственное в базе данных tasks поменялся статус задач второго этапа и время их выполнения.
Что значит эта ошибка и куда копать? Куда должна записываться информация о проходах и должна ли вообще? Если должна то по мере проходов или в конце всего этапа одной транзакцией вся в базу данных?
Здравствуйте, Виктор.
У меня такого не наблюдалось, то есть это действительно ошибка. Судя по этой строке лога:
могу предположить, что у вас в основной базе таблица passes заменилась на ту, которая должна была создаваться только во второй базе. То есть в этой таблице теперь вместо 48 столбцов стало 2.
С этим вопросом я разобрался и провёл второй этап. Проходов в основной базе добавилось. Но появилась новая проблема... Теперь с третьим советником. Он почему-то не берёт в работу проходы которые указываешь в списке, а берёт первые с самого начала с таблицы passes. И есть теперь предположение что советник второго этапа работал так-же и вся оптимизация неверная. Как это решить пока не пойму.
А вот база данных задачи должны по вашей задумке где создаваться, в папке Common\Files или в папке терминала MQL5\Files ?
С третьим советником тоже разобрался, вроде бы заработало как надо. Юрий спасибо Вам за советник и цикл статей этот.
PS: Заметил такой момент, это конечно не проблема но всё же, - вот при тесте в визуальном режиме в тестере советник открывает очень много отдельных ордеров, часто по 0.01 лота. Как я понимаю это от каждой виртуальной стратегии открываются свои позиции. А вроде бы если посмотреть схему из 3-й статьи то там согласно последней схеме он должен открывать по одной позиции на каждом торговом инструменте и просто корректировать объём в зависимости от суммарного лота и направления всех открытых виртуальных позиций. Типо как будто работа на netting счёте. Может быть это просто в тестере такой глюк или так отображаются позичии там... Юрий, а можно как то в советнике включить чтобы он на hage счёте работал как будто на netting счёте и имел только одну позицию в рынке по каждому торговому инструменту?
Юрий здравствуйте. Провожу сейчас вот оптимизацию второго этапа и в логе периодически проскакивает ошибка занятости базы данных:
Советник оригинальный, из статьи. Оптимизацию провожу на локальных агентах пк и по локальной сети на агентах другого пк. В целом процесс идёт и проходы в базу заполняются, но хотелось бы понять от чего происходит эта ошибка, ну и как то её исправить?
Ещё бывает некоторые задачи второго этапа очень быстро заканчиваются. Вот к примеру:
Вот здесь к примеру NZDCAD H1 M30 и NZDCHF H1 закончились буквально за один проход оптимизатора как я понимаю. Хотя там в базе проходов первого этапа для них много есть. Почему так происходит и что с этим можно сделать?
А NZDCAD M15 вообще ошибку выдал. Как я понимаю он не находит данных в базе данных, но как такое возможно? Ведь на первом этапе оптимизация этих пар была и проходы должны быть в базе...
Юрий а можно так вот к примеру сделать: вот я провёл первый и второй этап и сохранил всё в одну базу. А можно потом (после второго этапа) поменять, в базе данных, статус задач первого этапа для тех пар и тф на которых второй этап дал плохие результаты, чтобы для этих пар и тф как бы поверх второго этапа добавить проходов первого этапа ещё, а потом для них провести повторно второй этап? Просто при таком действии id новых проходов первого этапа будет выше чем id проходов второго этапа для всех остальных пар в этой базе. Я имею веду таблицу passes. Можно так сделать, и найдёт ли оптимизатор проходы превого этапа для этих пар и тф?
Где-то открыта и заблокирована база данных. Это может быть и внешнее приложение по отношению к тестеру, например, MetaEditor. Не помню, чтобы сталкивался с подобным.
Это действительно говорит о том, что проходов первого этапа для NZDCAD M15 почему-то не нашлось.
Да, так делать можно сколько угодно раз. Если хочется, чтобы старых проходов от предыдущих первых этапов не осталось, то их можно удалить из таблицы passes по нужным id_task.