Unhandled exception 0xC0000092 после создания ордера, билд 646, помогите разобраться (исходник с проблемой прилагается)

 

Приветствую!


Хоть и хвалят новые билды но старым проблемам пришли на смену новые, еще менее понятные и более неуловимые.

Суть:

1. в эксперте использую DLL

2. тестирование без создания ордеров проходит без проблем, полностью, обмен данными, их обработка, на любом промежутке

3. как только создается ордер - вылетает ошибка, ордер создается руками, все формулы убрал ради теста "int   oo = OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"",0,0,clrGreen);"

2014.06.17 23:26:00.172 EURUSD,M1: 1 tick events (369404 bars, 11516005 bar states) processed within 15 ms (total time 3214 ms)
2014.06.17 23:26:00.172 2010.01.04 00:00  Tester: order #1 is closed
2014.06.17 23:26:00.172 2010.01.04 00:00  Testing pass stopped due to a critical error in the EA
2014.06.17 23:26:00.172 2010.01.04 00:00  Unhandled exception 0xC0000092
2014.06.17 23:26:00.172 2010.01.04 00:00  ExpertS1 EURUSD,M1: open #1 buy 0.10 EURUSD at 1.43276 ok
 

Скорее всего ошибка в коде, возможно в dll. Попробуйте без dll ее воспроизвести.

STATUS_FLOAT_STACK_CHECK

Код ошибки: 0xC0000092 {ИСКЛЮЧЕНИЕ}

Ошибка стека при операции с плавающей точкой

 
Renat:
Скорее всего ошибка в коде, возможно в 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

Файлы:
heh.zip  75 kb
 
Был некоторый опыт безрезультатного общения с сервис-деском на эту тему. Вывод получился такой: dll, требующая явной инициализации (например, с объектами), в штатном тестере МТ4 из-за указанной ошибки работать не будет. Придётся ваять самопальный тестер. О происхождении этой и других ошибок немного есть здесь.
 
alexjou:
Был некоторый опыт безрезультатного общения с сервис-деском на эту тему. Вывод получился такой: dll, требующая явной инициализации (например, с объектами), в штатном тестере МТ4 из-за указанной ошибки работать не будет. Придётся ваять самопальный тестер. О происхождении этой и других ошибок немного есть здесь.

Увы, там ничего об этом нет, да и сама DLL полностью работает, и в тестере собственно все проходит от и до, проблема возникает именно после создания ордера, сейчас пробую различные компиляторы, может какая-либо не стыковка получается в связи с ними.
 
Всё верно, только компиляторы, скорее всего, ни при чём. Ошибка явно искусственного происхождения и связана с особенностями внутреннего устройства МТ4, вероятно, с обёртками dll, о которых говорится в п. 4 цитированной мною статьи. Тестерная "песочница" МТ5 устроена, видимо, по-другому, чем в МТ4. В прицепе - кусок моей безуспешной переписки с сервис-деском именно по этому поводу.
Файлы:
 
alexjou:
Всё верно, только компиляторы, скорее всего, ни при чём. Ошибка явно искусственного происхождения и связана с особенностями внутреннего устройства МТ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) приводящая к генерации исключения 00000092 при вызове OrderSend функции из MQL кода.

   Но, активация генерации данного исключения происходит внутри библиотеки пользователя. В borland C++  по умолчанию включаются исключения для инструкций FPU.

Ошибку компилятора MS VC++ при OrderSend обошли, данное исключение больше не генерируется, исправление войдёт в следующий билд.

ВАЖНО: Из-за данной ошибки компилятора MS VC++ нам придётся провести полную проверку кода наших продуктов, т.к. внесённое исправление локально и решает только проблему функции OrderSend.

Обычно, для отключения активации исключений инструкций FPU компиляторы имеют опции, воспользуйтесь аналогичной в borland C++ для своей DLL.
Support Team 2014.06.23 15:53