Unhandled exception 0xC0000092 после создания ордера, билд 646, помогите разобраться (исходник с проблемой прилагается)
Скорее всего ошибка в коде, возможно в dll. Попробуйте без dll ее воспроизвести.
STATUS_FLOAT_STACK_CHECK
Код ошибки: 0xC0000092 {ИСКЛЮЧЕНИЕ}
Ошибка стека при операции с плавающей точкой
Скорее всего ошибка в коде, возможно в dll. Попробуйте без dll ее воспроизвести. STATUS_FLOAT_STACK_CHECK Код ошибки: 0xC0000092 {ИСКЛЮЧЕНИЕ} Ошибка стека при операции с плавающей точкой
совсем без dll работает, так же как и с dll но без открытия ордеров, мало того, большая dll замечательно отрабатывает все что на нее возложено, данные ходят туда и обратно, строки и числа, без проблем, проверял значения, работал с ними, но как дошел до необходимости тестировать с открыванием ордеров - приплыл.
я упростил все задачи, сделал простую DLL которая ничего не делает, и эксперта:
#import "heh.dll" int hehinit(int ii1, int ii2); int hehdeinit(); #import #property strict void init() { int cc=0; int ii11 = 1, ii22 = 1; cc = hehinit(ii11,ii22); } void deinit() { int cc; cc=hehdeinit(); } int start() { int oo = OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"",0,0,clrGreen); return(0); }
//--------------------------------------------------------------------------- #pragma once #define WIN32_LEAN_AND_MEAN #define EXTFUNC extern "C" __declspec(dllexport) #include <Classes.hpp> #include <windows.h> #include <stdio.h> #pragma package(smart_init) #pragma hdrstop #pragma argsused //--------------------------------------------------------------------------- int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; } //--------------------------------------------------------------------------- EXTFUNC int __stdcall hehdeinit() { CoInitialize(0); CoUninitialize; return 0; } //--------------------------------------------------------------------------- EXTFUNC int __stdcall hehinit(long int ii1, long int ii2) { CoInitialize(0); CoUninitialize; return 0; } //---------------------------------------------------------------------------
вот результат работы:
ордер создается, но на возврате из start() или даже на первой проверке if в моем большом коде, вылетало с этой ошибкой
2014.06.18 00:33:57.211 EURUSD,M1: 1 tick events (369404 bars, 11516005 bar states) processed within 0 ms (total time 3322 ms) 2014.06.18 00:33:57.211 2010.01.04 00:00 Tester: order #1 is closed 2014.06.18 00:33:57.211 2010.01.04 00:00 Testing pass stopped due to a critical error in the EA 2014.06.18 00:33:57.211 2010.01.04 00:00 Unhandled exception 0xC0000092 2014.06.18 00:33:57.211 2010.01.04 00:00 ExpertS1 EURUSD,M1: open #1 buy 0.10 EURUSD at 1.43275 ok 2014.06.18 00:33:57.205 ExpertS1 test started 2014.06.18 00:33:53.874 TestGenerator: current spread 16 used 2014.06.18 00:33:53.873 Expert ExpertS1: loaded successfully
если захотите проверить, прикладываю программу и откомпилированную dll
Был некоторый опыт безрезультатного общения с сервис-деском на эту тему. Вывод получился такой: dll, требующая явной инициализации (например, с объектами), в штатном тестере МТ4 из-за указанной ошибки работать не будет. Придётся ваять самопальный тестер. О происхождении этой и других ошибок немного есть здесь.
Увы, там ничего об этом нет, да и сама DLL полностью работает, и в тестере собственно все проходит от и до, проблема возникает именно после создания ордера, сейчас пробую различные компиляторы, может какая-либо не стыковка получается в связи с ними.
Всё верно, только компиляторы, скорее всего, ни при чём. Ошибка явно искусственного происхождения и связана с особенностями внутреннего устройства МТ4, вероятно, с обёртками dll, о которых говорится в п. 4 цитированной мною статьи. Тестерная "песочница" МТ5 устроена, видимо, по-другому, чем в МТ4. В прицепе - кусок моей безуспешной переписки с сервис-деском именно по этому поводу.
да, очень похоже, у меня компилятор BC++ Builder 6, пробовал RAD Studio 2010 - то же самое, а вот в MS Visual Studio 2013 сделал тоже пустую DLL-ку, с ней сработало, но переделывать весь здоровенный и сложный проект, с учетом его специфики, это еще на несколько месяцев работы, будем надеяться, что авторы программы базовую совместимость обеспечат.
РЕШЕНО
скрин ответа
http://screenshot.su/show.php?img=2bfdae1a4ac658b0bf285535963e1204.jpg
копипаста
Support Team 2014.06.23 13:10 Провели исследование данной Проблемы. Результат: Обнаружена ошибка компилятора MS VC++ (_MSC_VER=1700) приводящая к генерации исключения 0xС0000092 при вызове OrderSend функции из MQL кода. Но, активация генерации данного исключения происходит внутри библиотеки пользователя. В borland C++ по умолчанию включаются исключения для инструкций FPU. Ошибку компилятора MS VC++ при OrderSend обошли, данное исключение больше не генерируется, исправление войдёт в следующий билд. ВАЖНО: Из-за данной ошибки компилятора MS VC++ нам придётся провести полную проверку кода наших продуктов, т.к. внесённое исправление локально и решает только проблему функции OrderSend. Обычно, для отключения активации исключений инструкций FPU компиляторы имеют опции, воспользуйтесь аналогичной в borland C++ для своей DLL. Support Team 2014.06.23 15:53
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Приветствую!
Хоть и хвалят новые билды но старым проблемам пришли на смену новые, еще менее понятные и более неуловимые.
Суть:
1. в эксперте использую DLL
2. тестирование без создания ордеров проходит без проблем, полностью, обмен данными, их обработка, на любом промежутке
3. как только создается ордер - вылетает ошибка, ордер создается руками, все формулы убрал ради теста "int oo = OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"",0,0,clrGreen);"