Тестер выдает результат отличный от едичного прогона при тех же параметрах.

 

Тестер отработал сутки, все было нормально.

Потом, что то произошло, и результат в тесте, отличается от выбранного результата в тесте и прогона при тех же параметрах.

Работаю с файлом. Куда записаны, результаты расчетов.

Может, кто что подсказать?

 
TVA_11:

Тестер отработал сутки, все было нормально.

Потом, что то произошло, и результат в тесте, отличается от выбранного результата в тесте и прогона при тех же параметрах.

Работаю с файлом. Куда записаны, результаты расчетов.

Может, кто что подсказать?


Может быть так, что минутки по которым я бегая, в тестере и при прямом прогоне берутся из разных файлов.

И если один из этих файлов попортился, то вот и получаются разные результаты?

 

У меня бывает что за время долгой оптимизации, успеваю подправить код эксперта или связанного индикатора;)

 
Разные исходные данные приводят к разным результатам.

То есть, не нужно думать, что если были неизменные параметры эксперта, то все рыночное окружение (включая историю чартов) также неизменно.
 
Renat:
Разные исходные данные приводят к разным результатам.

То есть, не нужно думать, что если были неизменные параметры эксперта, то все рыночное окружение (включая историю чартов) также неизменно.


А если тестирование идёт на прошлом периоде, назад более месяца от текущей даты, с уже закачанной историей? Я тоже замечал различия в результатах при нескольких тестах.
Вот пример ниже. Был прогнан тест, первый прогон выполнен совсем недавно, 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 базы с этими данными и показать на примерах) совсем другие различия, несколько тестов с одинаковыми параметрами эксперта и датами прогонов, т.е. по сути дубликаты тестов, выданные оптимизатором терминала, содержали в некоторых копиях теста резкие отличия от основной массы результатов. Т.е. подобный тест был прогнан оптимизатором несколько десятков раз, и среди них были очень резкие отличия от основной, среднеарифметической статистики по данному тесту.

 
Можно все проверить публично.

Для этого нужно:
  1. опубликовать код эксперта или выбрать стандартный Moving Average
  2. выбрать какой-то далекий период не ближе полугода, символ, период
  3. закачать все необходимые данные
  4. выбрать демо-счет какого-то одного брокера, опубликовать адрес сервера, логин и инвесторский пароль (можно на demo.metaquotes.net)
  5. записать и опубликовать все важные настройки символа
  6. провести тест, экспортировать весь отчет и опубликовать
  7. подождать 2-3 дня и провести тест заново с шагов 5-6.
  8. сравнить и проанализировать отчеты, особенно настройки символов
После чего можно будет сравнить результаты. Важно, чтобы этот эксперимент проделало как минимум два человека с контрольными сравнениями после первого и второго тестами. Скорее всего выяснится, что рыночное окружение плавает. А именно: свопы, спреды, минимальные отступы от рынка и тд.

У многих брокеров используются динамическое изменение параметров торговли в зависимости от состояния рынка. Рынок ведь очень разный в 04:38 и в 23:52. Так как тестер торговых стратегий не знает, какие были рыночные условия в любой момент времени в прошлом, то он вынужден использовать данные текущего рыночного состояния с текущего активного счета. Учитывайте этот момент в своей работе, пожалуйста.
 

Хорошо, Ренат, спасибо за Ваши комментарии.
Я тестирую экспертов с подключением терминалов на реальный счёт, мне кажется, так точнее. Конечно, окружение рынка для этого счёта со временем меняется. Если мне удастся заметить сильные отклонения в итогах тестов, я сделаю отдельного учебного эксперта и выложу его код с параметрами тестирования. Все пары, на которых идут тесты, стараюсь закачивать по максимуму.

Скажите, пожалуйста, Вы два раза упомянули настройки символа. Это то, что показано на рисунках ниже? Или что-то ещё я не беру во внимание, выдать результаты MarketInfo() для этого символа?

 
chv:

Скажите, пожалуйста, Вы два раза упомянули настройки символа. Это то, что показано на рисунках ниже? Или что-то ещё я не беру во внимание, выдать результаты 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 году
перетащил хистори на другой комп-и там она появилась
этим был превзойден предел неудобств при отладке
теперь совсем отрезал инет от терминала с помошью файервола
подключаю лишь иногда,после окончания большого этапа тестирования
 
Renat:
Разные исходные данные приводят к разным результатам.

То есть, не нужно думать, что если были неизменные параметры эксперта, то все рыночное окружение (включая историю чартов) также неизменно.


Разобрался в чем причина.

Файл с расчетами я создавал, на 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);
}

Причина обращения: