Портфельное тестирование на MT

 
Доброго времени суток ВСЕМ!
Чтобы как-то решить проблему портфельного тестирования в МТ написал вот скрипт, сшивающий историю из разных инструментов. Его использование позволит упростить тестирование экспертов на портфеле инструментов. Раньше для этого требовалось запускать эксперта на каждом из инструментов, теперь можно использовать один ГИПЕР инструмент.
Короче, так: открываем в МТ все инструменты (обязательно одного таймфрейма), из которых собрались клеить историю. На каждом из них поочередно ОДНОКРАТНО запускаем скрипт. В папке MetaTrader 4\experts\files появляется файл HistoryХХ.csv. Это так называемая сумма всех историй, на которых был запущен скрипт. Даты в склеиваемых кусках проставляются автоматически, т.е. если последний обработанных график заканчивался 2008.02.04 20:00, то следующий кусок истории начнется с 2008.02.04 21:00. В результате может получиться история например до 2036 года (отсюда и название скрипта). К тому же если разрыв между последним клозом, и новым опеном получается больше 2ATR, то прилепляемая история нормализуется таким образом, чтоб ее опен равнялся предущему клозу… Объяснил как сумел. Думаю на тестировании абсолютное значение цены не должно сказаться.
Теперь импортируем полученный csv в какой-нибудь из архивов, и гоняем советника по этой истории.
Замечания и предложения принимаются…
Как прицепить файл не нашел, поэтому листинг ниже:

#property copyright "Copyright © 2008, Skycat"
#property link "skycat@pisem.net"
//#property show_inputs

//extern int DeltaYear=10;
int Handle=-1;
int start()
{
int i, cnt, last_pos, time, OldSec, year,period=Period();
double open, low, high, close, vol, OldClose, ATR=iATR(NULL,0,50,1), DeltaData;
string symbol=Symbol(), OldData, NewTime, NewYear;
datetime date;

Handle=FileOpen("History"+period+".csv", FILE_READ|FILE_WRITE, ',');
if(Handle < 0)
{
Alert("Не могу создать файл History",period,".csv");
return;
}

FileSeek(Handle, -50, SEEK_END); // перемещаемся за 50 знаков от конца файла
OldData=FileReadString(Handle); // читаем последнюю дату
if (OldData!="")
{
OldSec=StrToTime(OldData); // преобразуем в секунды, прошедшие с 01.01.1970 (формат записи данных такой)
Alert("Дата начала новой истории: ",OldData);

FileSeek(Handle, -12, SEEK_END); // перемещаемся за 12 знаков от конца файла
OldData=FileReadString(Handle); // читаем последнюю цену закрытия (это чтоб избежать разрывов при присоединении новой истории)
OldClose=StrToDouble(OldData);

FileSeek(Handle, 0, SEEK_END); // перемещаемся в конец файл
last_pos=FileTell(Handle); // определим номер последнего символа ради интереса
last_pos=last_pos/50; // определим номер последней строки (в каждой строке по 50 символов)
DeltaData=Open[Bars-1]-OldClose;
Alert("Последний Close=",OldClose," ATR=",ATR);

if (MathAbs(DeltaData)<ATR*2) DeltaData=0; // Если разрыв относительно небольшой, то хрен с ним остается
else Alert("Для устранения разрыва сдвинем новую историю на ",DeltaData);
}
else
{
OldSec=Time[Bars-1];
Alert("Файл истории создан, начальная дата: ",TimeToStr(OldSec,TIME_DATE|TIME_MINUTES));
}
// write history file
for(i=Bars-1; i>=0; i--)
{
//time=(Bars-i)*period*60 + OldSec; // начинаем отсчет времени от конца старой истории
time=Time[i]-Time[Bars-1]+OldSec;
NewTime=TimeToStr(time);
if (Low[i]<DeltaData) {Alert("Цены упали ниже 0! КРАХ МИРОВОЙ ЭКОНОМИКИ!!!"); return;}
open=NormalizeDouble(Open[i]-DeltaData,Digits); // корректируем все данные в новой истории
low=NormalizeDouble(Low[i]-DeltaData,Digits); // для устранения разрыва на соединении
high=NormalizeDouble(High[i]-DeltaData,Digits); // все равно абсолютные значения цен для тестов не нужны
close=NormalizeDouble(Close[i]-DeltaData,Digits);
vol=Volume[i];
FileWrite(Handle,NewTime,open,high,low,close,vol);
}
Alert ("прицепили ",Bars," новых баров, последняя дата теперь: ",NewTime);
return(0);
}

void deinit()
{
if(Handle>=0) FileClose(Handle);
}
Причина обращения: