а функция то та же вызывается? Может в индикаторе не задействуются функции, используемые в советники, либо параметры у них другие.
Там всего одна функция, перепутать сложно. По параметрам выбивает
немедленно, а тут иногда работает пару тиков.
Предполагаю, что МТ все-таки не нравится длительность обработки, но как обойти.
Есть нюанс. Индикатор работает в интерфейсном потоке, который существует всегда. А эксперты и скрипты работают в специально создаваемом потоке. Поток создаётся перед запуском эксперта, а потом убивается.
Обратите внимание на то, как в Вашей dll обрабатывается thread detach
thread detach Что за зверь такой? Он у меня никак не обрабатывается
ДЛЛ получает от МТ
int CatVector(double& a[] , int plag , int pNumberGK ,int predict , int cnt ) ;
Обращается к другой ДЛЛ, которая производит обработку массива и возвращает в нем результат.
Предполагаю, что срабатывает именно Ваш нюанс и при убиении потока выгружается и ДЛЛ, которая используется индикаторами.
Что Вы называете запуском? Инициализацию эксперта или потиковую работу?
Каждая dll имеет функцию DllMain, которая вызывается в 4 случаях
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { //---- switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } //---- return(TRUE); }Эти случаи перечислены выше. В приведённом примере (это из нашей DllSample) нет никакой обработки. А в принципе, если в dll используется thread local storage (TLS), то при thread detach эта память должна освобождаться, а при thread attach (то есть при следующем запуске, при приходе следующего тика) в эту память нельзя обратиться, пока по новой не распределишь её.
А может быть при закрытии чарта перекомпиляции смене таймфрема просто выгружать длл вызывая FreeLibrary. В этом случае всегда можно, убрав просто эксперта с чарта или закрыв чарт скомпилировать новую версию DLL пеерписав поверх сущесвющей в директории MT4. А сейчас это зачастую не возможно пока не закроешь полностью MT4.
А логопеду надо учитывать что в
case DLL_THREAD_DETACH:
или в эксперте в функции
deinit()следует вызывать функцию DLL которая будет освобожать память выделеную для классов в Delphi с помощью Free
иначе тоже может валится весь MT4 из-за DLL
Каждая dll имеет функцию DllMain, которая вызывается в 4 случаях
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { //---- switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } //---- return(TRUE); }Эти случаи перечислены выше. В приведённом примере (это из нашей DllSample) нет никакой обработки. А в принципе, если в dll используется thread local storage (TLS), то при thread detach эта память должна освобождаться, а при thread attach (то есть при следующем запуске, при приходе следующего тика) в эту память нельзя обратиться, пока по новой не распределишь её.
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
//----
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
//----
return(TRUE);
}
Это кусок кода из statistik.dll в статье про отбор ДЦ.
Если у товарища работало в индикаторе, то у него однозначно инициализация была в init(), а не в start (). Таким образом, деаттача на новом тике быть не должно.
И тут же вопрос к stringo - чем является эксперт и чем является индикаторор - нитями? Хотелось бы подробно узнать об этом, потому что при интегрировании Mt4 через dll в разные приложения это важно. Опытным путем установлено, что все эксперты грузят одну копию dll, то есть работают в рамках одного процесса, но вот чем они конкретно ялвяются с точки зрения операционной системы?
Спасибо за советы, но я пока поступил проще.
Создал копию ДЛЛ с другим именем и обращаюсь из советника к ней. Два часа полет нормальный
Спасибо за советы, но я пока поступил проще.
Создал копию ДЛЛ с другим именем и обращаюсь из советника к ней. Два часа полет нормальный
Моя ошибка полет ненормальный, опять выбивает.
Другая идея разбить обсчет на 3 части загрузку, флаг и выгрузку. И тогда такой вопрос по работе советника.
Когда его прерывают по времени выполнения, куда он возвращается опять на старт или в точку прерывания?
И если можно варианты для рабочего и тестового режима.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Кто может помочь с проблемой?
DLL написаная на Delphi нормально работает в индикаторе. При этом тот-же вызов из советника выбивает МТ полностью.
Может сразу выбить, а может несколько раз отработать. Счет правда идет долго и вызывается другая dll.