Страница 1 из 1

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

Добавлено: Чт янв 17, 2013 2:05 am
hal9000
В общем, очень неприятная проблема - из кода 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-мя байтами дело может не ограничиваться.

Добавлено: Чт янв 17, 2013 2:15 am
hal9000
Может, это связано с параметрами, регистрируемыми 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;

}

Добавлено: Чт янв 17, 2013 5:31 pm
FT Support
Пожалуйста, пришлите весь код стратегии, попробуем разобраться

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

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

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

Добавлено: Пт янв 18, 2013 1:39 pm
FT Support
думаю будет достаточно кода стратегии