Стратегия, происходит перезапись статической переменной

Сообщайте о возможных ошибках в программе.
Ответить
Сообщение
Автор
hal9000
Сообщения: 14
Зарегистрирован: Вс ноя 11, 2012 7:48 am

Стратегия, происходит перезапись статической переменной

#1 Сообщение hal9000 » Чт янв 17, 2013 2:05 am

В общем, очень неприятная проблема - из кода Forex Tester происходит перезапись статической переменной, расположенной в DLL-ке стратегии.

Вот первые строчки основного модуля (после директив #include):

bool Init = false;
TStrategy *Strategy1 = NULL;
TStrategy *Strategy = NULL;

int Magic = 0;

Происходит порча перезаписью 32-битным значением 0x1cf80001 по адресу Strategy1 минус 2 байта. При этом Init не портится, так как между ними есть пропуск из-за выравнивания. То есть, портятся два байта до Strategy1, и два байта Strategy1. Пробовал менять имена переменных, вставлял не используемые - результат не меняется. Собственно, раньше там стояла Strategy и происходила беда. Поставил Strategy1 - это не используемая переменная, которая специально стоит на этом месте, принимает беду на себя.

Последовательность действий.
Точки останова стоят на InitStrategy(), DoneStrategy(), ResetStrategy().
1. Запускаем Forex Tester, успеваем подключиться отладчиком до инициализации стратегий и ловим точку останова на InitStrategy() - переменные в порядке (обе NULL). Продолжаем выполнение.
2. В Forex Testere нажимаем Start Test, задать начальную дату, тестировать. Ловим точку останова на ResetStrategy() - память испорчена, Strategy1 = 0x00001cf8.

Если поставить точку останова на данные, попадаем в код Forex Testera. Конкретный пример.
Адрес Init 0x0f208798, адрес Strategy1 0x0f20879c. Ставим точку останова на данные. Попадаем в ForexTester.exe!00625d64():

00625D5C mov edx,dword ptr [ebp-4]
00625D5F mov edx,dword ptr [edx+0Ch]
00625D62 mov dword ptr [edx],eax
00625D64 jmp 00625EA7

Тут edx = 0x0f20879a, eax = 0x1cf80001. Соответственно, 0001 попадает в неиспользуемые байты, а 1cf8 в Strategy1.
Перезапись происходит ДО нажатия на кнопку Start test.

После вставки Strategy1 стратегия стала запускаться, но очень хотелось бы разобраться с этим, так как этими 4-мя байтами дело может не ограничиваться.

hal9000
Сообщения: 14
Зарегистрирован: Вс ноя 11, 2012 7:48 am

#2 Сообщение hal9000 » Чт янв 17, 2013 2:15 am

Может, это связано с параметрами, регистрируемыми RegOption? Туда как раз передаются адреса на соседние участки памяти.
Вот все мои статические переменные этого модуля, и содержимое InitStrategy() - может, поможет:

bool Init = false;
TStrategy *Strategy1 = NULL;
TStrategy *Strategy = NULL;

int Magic = 0;

PChar Currency = NULL;
int StrategyType = 6;
int PeriodOptimization = 50;
int SC_MaxDropDown = 1000;
int SC_MinProfitPersent = 80;
double SC_MinOrders = 2;
int FitnessType = 0;
bool MultiThread = true;
char *DirectoryWork = NULL;
bool CreateNew = true;
bool ResetProfit = true;
bool ModeExport = false;
bool CloseType = 0;
bool OneOrder = false;
double RiskPersent = 5;

TDateTime PBar = 0;
TDateTime LastBar = 0;

TPriceHistory *History;

EXPORT void __stdcall InitStrategy()
{

StrategyShortName("c-15");
StrategyDescription("c-15");

ReplaceStr(DirectoryWork, "D:\\Projects\\Personal\\FX\\C-15\\Data\\MATM\\EURUSD");

RegOption("Currency", ot_Currency, &Currency);
RegOption("Timeframe", ot_TimeFrame, &Timeframe);
RegOption("StrategyType", ot_Integer, &StrategyType);
RegOption("PeriodOptimization", ot_Integer, &PeriodOptimization);
RegOption("SC_MaxDropDown", ot_Integer, &SC_MaxDropDown);
RegOption("SC_MinProfitPersent", ot_Integer, &SC_MinProfitPersent);
RegOption("SC_MinOrders", ot_Double, &SC_MinOrders);
RegOption("FitnessType", ot_Integer, &FitnessType);
RegOption("MultiThread", ot_Boolean, &MultiThread);
RegOption("CreateNew", ot_Boolean, &CreateNew);
RegOption("ResetProfit", ot_Boolean, &ResetProfit);
RegOption("ModeExport", ot_Boolean, &ModeExport);
RegOption("CloseType", ot_Integer, &CloseType);
RegOption("DirectoryWork", ot_String, &DirectoryWork);

Timeframe = PERIOD_H1;

}

FT Support
Сообщения: 329
Зарегистрирован: Сб июл 11, 2009 3:59 pm

#3 Сообщение FT Support » Чт янв 17, 2013 5:31 pm

Пожалуйста, пришлите весь код стратегии, попробуем разобраться

hal9000
Сообщения: 14
Зарегистрирован: Вс ноя 11, 2012 7:48 am

#4 Сообщение hal9000 » Пт янв 18, 2013 6:55 am

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

Думаю, это еще всплывет, так как до описанной и разобранной выше ситуации, были еще другие случаи, когда портился не указатель, а параметр стратегии. Это было видно в настройках. Например, вместо целого числа, один-два знака, я вдруг обнаруживал какую-нибудь ерунду, типа 352460545, хотя точно этот параметр не менял, тем более, на такое значение. Тогда у меня было подозрение на свой код.

Если поймаю - что нужно сохранить? Код стратегии, DLLку, папку с ForexTester - этого достаточно?

FT Support
Сообщения: 329
Зарегистрирован: Сб июл 11, 2009 3:59 pm

#5 Сообщение FT Support » Пт янв 18, 2013 1:39 pm

думаю будет достаточно кода стратегии

Ответить