Тестер отработал сутки, все было нормально.
Потом, что то произошло, и результат в тесте, отличается от выбранного результата в тесте и прогона при тех же параметрах.
Работаю с файлом. Куда записаны, результаты расчетов.
Может, кто что подсказать?
Может быть так, что минутки по которым я бегая, в тестере и при
прямом прогоне берутся из разных файлов.
И если один из этих файлов попортился, то вот и получаются разные результаты?
У меня бывает что за время долгой оптимизации, успеваю подправить код эксперта или связанного индикатора;)
То есть, не нужно думать, что если были неизменные параметры эксперта, то все рыночное окружение (включая историю чартов) также неизменно.
Разные исходные данные приводят к разным результатам.
То есть, не нужно думать, что если были неизменные параметры эксперта, то все рыночное окружение (включая историю чартов) также неизменно.
А если тестирование идёт на прошлом периоде, назад более месяца от текущей даты, с уже закачанной историей? Я тоже замечал различия в результатах при нескольких тестах.
Вот пример ниже. Был прогнан тест, первый прогон выполнен совсем недавно, 07.12.2007 4:38 (точнее, это дата сбора файла с итогами, но она отличается от завершения теста не более минуты), затем этот же тест я повторил сейчас, т.е. 11.12.2007 в 23:52. Период тестирования был выбран значительно раньше текущей даты, с 01.12.2005 по 31.08.2006. Т.е. история валютной пары за этот период давно сформирована и закачана мною в терминал, на unlimited канале мне не жаль никакого трафика для повышения точности расчётов. В итоге на двух прогонах с разницей в 4 дня на прошедшем периоде три показателя: общая прибыль, общий убыток и, соответственно, разница между ними (чистая прибыль) отличаются, как видно, от 55 USD на чистой прибыли до 400 с лишним USD на общей прибыли. Это уже, честно, на погрешность тестирования списать трудновато.
На самом деле это, вероятно, можно уложить в 90% точность истории пары, но я видел (могу поднять 9 Гб backup SQL базы с этими данными и показать на примерах) совсем другие различия, несколько тестов с одинаковыми параметрами эксперта и датами прогонов, т.е. по сути дубликаты тестов, выданные оптимизатором терминала, содержали в некоторых копиях теста резкие отличия от основной массы результатов. Т.е. подобный тест был прогнан оптимизатором несколько десятков раз, и среди них были очень резкие отличия от основной, среднеарифметической статистики по данному тесту.
Для этого нужно:
- опубликовать код эксперта или выбрать стандартный Moving Average
- выбрать какой-то далекий период не ближе полугода, символ, период
- закачать все необходимые данные
- выбрать демо-счет какого-то одного брокера, опубликовать адрес
сервера, логин и инвесторский пароль (можно на demo.metaquotes.net)
- записать и опубликовать все важные настройки символа
- провести тест, экспортировать весь отчет и опубликовать
- подождать 2-3 дня и провести тест заново с шагов 5-6.
- сравнить и проанализировать отчеты, особенно настройки символов
У многих брокеров используются динамическое изменение параметров торговли в зависимости от состояния рынка. Рынок ведь очень разный в 04:38 и в 23:52. Так как тестер торговых стратегий не знает, какие были рыночные условия в любой момент времени в прошлом, то он вынужден использовать данные текущего рыночного состояния с текущего активного счета. Учитывайте этот момент в своей работе, пожалуйста.
Хорошо, Ренат, спасибо за Ваши комментарии.
Я тестирую экспертов с подключением терминалов на реальный
счёт, мне кажется, так точнее. Конечно, окружение рынка для этого
счёта со временем меняется. Если мне удастся заметить сильные
отклонения в итогах тестов, я сделаю отдельного учебного эксперта
и выложу его код с параметрами тестирования. Все пары, на которых
идут тесты, стараюсь закачивать по максимуму.
Скажите, пожалуйста, Вы два раза упомянули настройки символа. Это то, что показано на рисунках ниже? Или что-то ещё я не беру во внимание, выдать результаты MarketInfo() для этого символа?
Скажите, пожалуйста, Вы два раза упомянули настройки символа. Это то, что показано на рисунках ниже? Или что-то ещё я не беру во внимание, выдать результаты MarketInfo() для этого символа?
"Рыночное окружение" - это не только исторические данные (которые, вообще-то подкачиваются автоматически, то есть History Center может автоматически обновляться на большую глубину в зависимости от таймфрейма) чартов, но и конкретные настройки символов. Например, сейчас в 04:00 (MSK) на нашем демосервере минимальный отступ от рынка по евро равен 4 пипсам, а днем будет 2 пипса.
Свопы меняются достаточно часто. Например, на странице истории свопов одной известной компании можно найти такие данные по EURUSD:
Дата | Swap Long |
Swap Short |
---|---|---|
2007.12.11 |
-0.46 | 0.01 |
2007.12.10 | -0.46 |
0.01 |
2007.12.07 | -0.55 |
0.05 |
2007.12.06 | -0.59 |
0.07 |
То есть, за 4 последних рабочих дня свопы по EURUSD менялись трижды. Конечно же, изменение текущих свопов приведет к изменению результатов сделок в прошлом (как раз на те самые 50-300 долларов). Тестер не имеет истории свопов и спредов за предыдущие годы, поэтому вынужден использовать текущие значения.
работаю на 2-х компах,один всегда в сети,а на второй перетаскивал папку хистори раз в 2-3 недели
так вот с месяц назад, при тестировании одного и того же советника, на постоянно подключенном компе появилась "лишняя" сделка аж в 2004 году
перетащил хистори на другой комп-и там она появилась
этим был превзойден предел неудобств при отладке
теперь совсем отрезал инет от терминала с помошью файервола
подключаю лишь иногда,после окончания большого этапа тестирования
Разные исходные данные приводят к разным результатам.
То есть, не нужно думать, что если были неизменные параметры эксперта, то все рыночное окружение (включая историю чартов) также неизменно.
Разобрался в чем причина.
Файл с расчетами я создавал, на 4 часах.
А потом, провел подгон всех таймфреймов по минутам. И оказалось, что этого достаточно.
Это версия.. :) счас создаю новый расчетный файл, и сравню!
Сравнил файлы.. результаты разные.
Странно, что на 4 часах, расчетных данных больше (чисто количественно), чем при расчете на всех тиках.
Счас подготовлю код. Он рабочий. На 4 часах, идем по тикам на евродолларе скажем с 2004.11.11. по 2007.11.11
Получаем одно количество строк.
И идем по явному контролю открытия баров.
Так вот, почему от типа прохода в тестере, по тикам, по явному открытию баров, и по контрольным точкам получается разное количество баров!
У меня явный контроль.
По открытию больше всех, по тикам не намного меньше, по контрольным точкам намного меньше!!!
Просьба прокомментировать кому-нибудь из MetaQuotes. Заранее спасибо! Я теперь и не знаю, что же именно я тестирую == насколько это равно реальности!
//+------------------------------------------------------------------+
//| ArtificialIntelligence_Right. mq4 |
//| Copyright © 2006, Yury V. Reshetov |
//| http://reshetov.xnet.uz/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Yury V. Reshetov ICQ:282715499 http://reshetov.xnet.uz/"
#property link "http://reshetov.xnet.uz/"
#include <stderror.mqh>
#include <stdlib.mqh>
//---- input parameters
// StopLoss level
//extern double sl = 38;
//extern double sl1 = 38;
extern int z1;
extern int z2;
extern int z3;
extern int z4;
extern double prg;
extern double prg1;
extern double prg3;
extern double prg2;
extern double lots = 1;
extern int MagicNumber = 777;
extern int PeriodNorm=30;
extern int Lag=30;
extern int NumComps=4;
extern int N=6000;
static int prevtime = 0;
int j,i,handle;
int sumx, sumx2;
double per,per2,ima,gus;
string per1;
double arryTimeSeries[],SSA[];
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
ArrayResize(arryTimeSeries,N);
ArrayResize(SSA,N);
handle = FileOpen("sing", FILE_CSV|FILE_WRITE,';');
// handle = FileOpen("sing.csv",FILE_READ|FILE_CSV," ");
if(handle<1)
{
Print("Файл my_data.dat не обнаружен, последняя ошибка ", GetLastError());
return(false);
}
Print(handle);
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
// if(Volume[0]>1) return(0);
if(iVolume(NULL,PERIOD_M1,0)>1) return(0);
int ticket = -1;
// check for opened position
int total = OrdersTotal();
if (Volume[0]==1) {per=perceptron(); sumx = 1;}
// Print(per1);
//----
for(int i = total - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
// check for symbol & magic number
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
int prevticket = OrderTicket();
{
if((OrderType() == OP_BUY)) //STOP)||(OrderType() == OP_BUYLIMIT))
if (TimeCurrent()-OrderOpenTime()<prg2) //(per>0) // мы купили и тренд продолжается,
тралим. Тейкпрофит убираем.
{ //OrderClose(prevticket, lots, Bid, 3,Blue);
}
else // ждем закрытия, Можно установить тейкпрофит - его тралить.
Надеемся пересидеть откат.
{
OrderClose(prevticket, lots, Bid, 3, Blue);
}
else //OrderClose(prevticket, lots,Ask, 3, Red);
if (TimeCurrent()-OrderOpenTime()<prg2)
{ //OrderClose(prevticket, lots, Ask, 3,Red);
}
else
{
OrderClose(prevticket, lots, Ask, 3, Red);
}
}
}
}
// check for long or short position possibility
if ((OrdersTotal()<11)&&(sumx==1))
{
if (per>0) { // тренд вверх
per2=Open[0]-(prg-per)*Point;
per2=NormalizeDouble(per2,MarketInfo(Symbol(), MODE_DIGITS));
if ((per2>=Bid-1*Point)&&(per2<=Bid+1*Point)) { sumx=0;
ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, per2-prg1*Point, per2+prg3*Point,
"AI", MagicNumber, 0, Blue); }
}
if (per<0)
{ // тренд вниз
per2=Open[0]+(prg+per)*Point;
per2=NormalizeDouble(per2,MarketInfo(Symbol(), MODE_DIGITS));
if ((per2>=Bid-1*Point)&&(per2<=Bid+1*Point)) { sumx=0;
ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, per2+Ask-Bid+prg1*Point, per2+Ask-Bid-prg3*Point,
"AI", MagicNumber, 0, Red); }
}
}
//--- exit
return(0);
}
//+------------------------------------------------------------------+
//| The PERCEPTRON - a perceiving and recognizing function |
//+------------------------------------------------------------------+
double perceptron()
{
double ma,dev,dev1;
double w1 = z1-10000;
double w2 = z2-10000;
double w3 = z3-10000;
double w4 = z4-10000;
int ii;
//---- buffers
// double SSA[];
int k=0,a;
double value;
double b,c, RegSMa=0;
double sumy=0.0, sum=0.0, oldval, deviation, newres;
double sumxy=0.0;
double nmax, nmin;
//---
if(Volume[0]>1) return;
SSA[4]=iMA(NULL,0,Lag/5,0,MODE_SMA,PRICE_MEDIAN,1);
FileWrite(handle, SSA[4]);
w1=0;
return(-w1);
}

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Тестер отработал сутки, все было нормально.
Потом, что то произошло, и результат в тесте, отличается от выбранного результата в тесте и прогона при тех же параметрах.
Работаю с файлом. Куда записаны, результаты расчетов.
Может, кто что подсказать?