Чудеса отладчика ? - страница 3

 
Alexey Oreshkin:

Поговорили с саппортом, вопрос решён. Суммирую ответ саппорта и Slawa: несмотря на то что хендл создаётся сразу, доступ к данным будет на следующем тике (через некоторое время).
Рекомендуют создавать хендлы в ините, что логично.

Почему я не создаю в данном примере хендлы в ините : 
Передо мной стоит задача провести в советнике некоторые расчёты по всему рынку. Часть расчётов полностью совпадает с результатами индикатора макд, поэтому я и решил вызвать его а не писать логику самому.
А теперь займёмся расчётами, для примера обратимся на демосервер метаквотов. Валюта+сфд даёт мне 96 доступных для торговли инструментов.
мне нужно проверить результаты макд в следующем диапазоне: fastEma 5-20, slowEma 20-100, sigbalMA 3-9.  Итого 7200 вариантов по каждому символу, в общем 7200х96=691200 хендлов.
Эти расчёты мне нужно проводить 1 раз в день, вполне логично создать эти хендлы в онтике, посчитать всё что надо и релизнуть их до следующей необходимости.
Теперь, учитывая все новые знания наверное создам массив всех хендлов и вызову их в ините, пусть болтаются в памяти, благо места занимают не много, менее 3 МБ (691200 *4/1024/1024)

Ок, но вопрос остался открытым - почему это происходит только при дебаге на ист. данных? Что-то с отладчиком значит не так.
 
Alexey Volchanskiy:
Ок, но вопрос остался открытым - почему это происходит только при дебаге на ист. данных? Что-то с отладчиком значит не так.
согласен, тем более времени тут на обсчёт и загрузку данных предостаточно, потому как пошагово проверка идёт по каждой строке, с визуальной оценкой всех переменных и т.д, короче долго, за это время можно весь депозит слить, а не то что просто данные загрузить :)
но как говорится это уже другая история. Саппорт с проблемой ознакомлен, дальше будут действовать как считают нужным. Я свой вопрос тоже решил.

Хочется конечно съязвить вот таким товарищам:
Petros Shatakhtsyan:
Если Вы такой умник, то для чего открыли эту тему ?
но удержусь и не буду :)
 
Alexey Oreshkin:

Поговорили с саппортом, вопрос решён. Суммирую ответ саппорта и Slawa: несмотря на то что хендл создаётся сразу, доступ к данным будет на следующем тике (через некоторое время).
Рекомендуют создавать хендлы в ините, что логично.

Почему я не создаю в данном примере хендлы в ините : 
Передо мной стоит задача провести в советнике некоторые расчёты по всему рынку. Часть расчётов полностью совпадает с результатами индикатора макд, поэтому я и решил вызвать его а не писать логику самому.
А теперь займёмся расчётами, для примера обратимся на демосервер метаквотов. Валюта+сфд даёт мне 96 доступных для торговли инструментов.
мне нужно проверить результаты макд в следующем диапазоне: fastEma 5-20, slowEma 20-100, sigbalMA 3-9.  Итого 7200 вариантов по каждому символу, в общем 7200х96=691200 хендлов.
Эти расчёты мне нужно проводить 1 раз в день, вполне логично создать эти хендлы в онтике, посчитать всё что надо и релизнуть их до следующей необходимости.
Теперь, учитывая все новые знания наверное создам массив всех хендлов и вызову их в ините, пусть болтаются в памяти, благо места занимают не много, менее 3 МБ (691200 *4/1024/1024)

Сначала надо поэкспериментировать с памятью.

Возможно, наилучшим вариантом будет написание некоего диспетчера индикаторов. На предыдущем тике говоришь диспетчеру создать индикатор, на следующем тике взять значение индикатора и освободить его.

Всё таки 700 тысяч хэндлов это слишком круто и я сильно сомневаюсь в расчёте на 3 мега. Вы не учитываете размер индикаторных буферов для каждого хендла, которые живут, пока живёт хендл

 
Alexey Volchanskiy:
Ок, но вопрос остался открытым - почему это происходит только при дебаге на ист. данных? Что-то с отладчиком значит не так.

Всё просто. При дебаге на исторических данных никаких хендлов изначально нет, так как тестер только-только стартовал.

При дебаге на реальных данных используется не тестер, а терминал, в котором после разных экспериментов ещё живут как раз нужные хендлы индикаторов

 
Slawa:

Всё просто. При дебаге на исторических данных никаких хендлов изначально нет, так как тестер только-только стартовал.

При дебаге на реальных данных используется не тестер, а терминал, в котором после разных экспериментов ещё живут как раз нужные хендлы индикаторов

1. Удалил все индикаторы из терминала, перезапустил его. Без отладки данные идут на первом тике. С пошаговой отладкой на истории - со второго тика.

2. Утверждение, что при создании индикатора с разными входными параметрами создается отдельный экземпляр и он сохраняется - верное, хендлы выдаются, как на предыдущем тике.

    for(int i=5;i<10;i++)
    {
        handle=iMACD(Symbol(),Period(),i,26,9,PRICE_CLOSE);  

2016.06.29 14:49:08.291 TestHandle (EURUSD,M1) TickCount=1  handle=14  x=100  0

2016.06.29 14:49:08.291 TestHandle (EURUSD,M1) TickCount=1  handle=13  x=100  0

2016.06.29 14:49:08.291 TestHandle (EURUSD,M1) TickCount=1  handle=12  x=100  0

2016.06.29 14:49:08.291 TestHandle (EURUSD,M1) TickCount=1  handle=11  x=100  0

2016.06.29 14:49:08.291 TestHandle (EURUSD,M1) TickCount=1  handle=10  x=100  0

2016.06.29 14:49:08.099 TestHandle (EURUSD,M1) TickCount=0  handle=14  x=100  0

2016.06.29 14:49:07.997 TestHandle (EURUSD,M1) TickCount=0  handle=13  x=100  0

2016.06.29 14:49:07.895 TestHandle (EURUSD,M1) TickCount=0  handle=12  x=100  0

2016.06.29 14:49:07.795 TestHandle (EURUSD,M1) TickCount=0  handle=11  x=100  0

2016.06.29 14:49:07.682 TestHandle (EURUSD,M1) TickCount=0  handle=10  x=100  0

----------- 

Вывод: все же что что-то с отладчиком на истории не так. 

 
Slawa:

Сначала надо поэкспериментировать с памятью.

Возможно, наилучшим вариантом будет написание некоего диспетчера индикаторов. На предыдущем тике говоришь диспетчеру создать индикатор, на следующем тике взять значение индикатора и освободить его.

Всё таки 700 тысяч хэндлов это слишком круто и я сильно сомневаюсь в расчёте на 3 мега. Вы не учитываете размер индикаторных буферов для каждого хендла, которые живут, пока живёт хендл

кстати да. Это размер только самих хендлов. Далее если мы возьмём разрешённые по умолчанию 100000 баров, то получится следующий расчёт:
100000*8 это столько памяти скушает каждый буфер каждого индикатора. Буферов 3, индикаторов 691200, итого получим
100000*8*3*691200/1024/1024/1024 это есть 1544 гигабайта :) и + 3 метра хендлов ещё.
Вообщем изначально действовал правильно - индикаторы надо создавать в онтике, просто оценивать эти данные на следующем тике+на всякий пожарный проверку готовности расчётов.

Но тогда возникает проблема вот с этим ответом саппорта:

Support Team 2016.06.29 12:21

Фактически при освобождении хендла он только помечается, что больше не нужен. Но не удаляется.

то есть память будет всё равно занята ?
 

Повторяю. Отладка на истории сильно отличается от отладки на реальных данных

В первом случае запускается визуальный тестер. В визуальном тестере все доступы к данным чётко синхронные. И индикаторы пересчитываются чётко между тиками

Во втором случае в текущем клиентском терминале открывается новое окно чарта. В терминале все доступы к данным асинхронные. А так как отладчик работает медленно, то индикатор вполне успевает пересчитаться в другом потоке

 
Alexey Oreshkin:

кстати да. Это размер только самих хендлов. Далее если мы возьмём разрешённые по умолчанию 100000 баров, то получится следующий расчёт:
100000*8 это столько памяти скушает каждый буфер каждого индикатора. Буферов 3, индикаторов 691200, итого получим
100000*8*3*691200/1024/1024/1024 это есть 1544 гигабайта :) и + 3 метра хендлов ещё.
Вообщем изначально действовал правильно - индикаторы надо создавать в онтике, просто оценивать эти данные на следующем тике+на всякий пожарный проверку готовности расчётов.

Но тогда возникает проблема вот с этим ответом саппорта:

Support Team 2016.06.29 12:21

Фактически при освобождении хендла он только помечается, что больше не нужен. Но не удаляется.

то есть память будет всё равно занята ?

Пока хендл не удалится, да. Память будет занята.

Но хендл долго не живёт. Как правило, до следующего пересчёта индикаторов

 
Slawa:

Пока хендл не удалится, да. Память будет занята.

Но хендл долго не живёт. Как правило, до следующего пересчёта индикаторов

Ок, благодарю. Значит так и поступлю.
 
Alexey Oreshkin:

Поговорили с саппортом, вопрос решён. Суммирую ответ саппорта и Slawa: несмотря на то что хендл создаётся сразу, доступ к данным будет на следующем тике (через некоторое время).
Рекомендуют создавать хендлы в ините, что логично.

Почему я не создаю в данном примере хендлы в ините : 
Передо мной стоит задача провести в советнике некоторые расчёты по всему рынку. Часть расчётов полностью совпадает с результатами индикатора макд, поэтому я и решил вызвать его а не писать логику самому.
А теперь займёмся расчётами, для примера обратимся на демосервер метаквотов. Валюта+сфд даёт мне 96 доступных для торговли инструментов.
мне нужно проверить результаты макд в следующем диапазоне: fastEma 5-20, slowEma 20-100, sigbalMA 3-9.  Итого 7200 вариантов по каждому символу, в общем 7200х96=691200 хендлов.
Эти расчёты мне нужно проводить 1 раз в день, вполне логично создать эти хендлы в онтике, посчитать всё что надо и релизнуть их до следующей необходимости.
Теперь, учитывая все новые знания наверное создам массив всех хендлов и вызову их в ините, пусть болтаются в памяти, благо места занимают не много, менее 3 МБ (691200 *4/1024/1024)

Главное, чтобы памяти на все индюки хватило. Иначе придется релизить их в процессе и, возможно, ждать, пока освободится память (это не мгновенный процесс).