Тестирование

 
Как понять такой результат?

В эксперте используются индикаторы с конкретных указанием таймфрема. Типа iMA(NULL,60,.... Ни один индикатор не берет данных с таймфрема, на который присоединен. Нет такого - iMA(NULL,0,....

В при тестировании (режим контрольные точки (другие не пробовал)) при выборе в тестер H4 - одни результаты тестирования, при выборе H1 - другие. Ладно бы разные, но дело в том, что при одном выборе советник показывает прекрасные результаты, при другом - убытки.

И как это все понимать? Что за особенности моделирования у тестера? Может где есть описание процесса моделирования, который используется в тестере (более подробное)? И вообще можно-ли после этого доверять результатам тестирования? Вобщем - почему так происходит, ведь как мне кажется результат должен быть одинаковый, если советник берет данные с определнных таймфреймов?
 
Посетите раздел Expert Advisors нашего сайта - там есть статьи, описывающие тестирование.
Также желательно сходить на "MQL4: automated forex trading" - там есть библиотека исходных кодов массы индикаторов.
 
Прочитал статьи в разделе Expert Advisors.

Понятно, что при тестировании в режиме контрольных точек при выборе H4 берутся опорные точки с H1, при выборе H1 - c M30. И казалось бы от этого разные результаты тестирования. Однако попробовал режим "Все тики на основе всех наименьших доступных периодов". Результат тот же (ТО ЕСТЬ РАЗНЫЙ). А ведь в этом периоде тики моделируются на основе самого наименьшего периода, откуда же тогда различия при тестировании на H1 и H4? И чему все-таки верить?
 
какое качество моделирования при тестах?
я думаю, если сделать всю историю из минуток (и Н4 Н1) и тестить по всем тикам, разница будет меньше.
Обязательное условие - тестировать только период, за который есть минутки.

А самый точный тест будет на М1, но он всё равно будет отличаться от реальных результатов
Эксперементируйте ;)
 

какое качество моделирования при тестах?


При моделировании по контрольным точкам - 47%

При моделировании по всем тикам - 89%

Моделирование по всем тикам на H4 и H1 при наличии минутной истории показывает РАЗНЫЕ РЕЗУЛЬТАТЫ!!! (Для любопытных - убытки в обеих случаях.) Результаты не слишком разные, но все же разные и достаточно заметно. Почему? И в том и в другом случае, судя по описанию способов моделирования, используются минутки. МОЖЕТ БЫТЬ БАР С ДРУГОГО ТАЙМФРЕЙМА БЕРЕТСЯ ЗАВЕРШЕННЫЙ, А НЕ МОДЕЛИРУЕТСЯ? В эксперте данный берутся с H1, M15.

Вообщем не представляю как можно используя тестер МТ заниматься разработкой стратегий. Может быть разработчики опубликуют полный алгоритм модерирования цены при тестировании? Иначе тестер стратегий кажется только забавной игрушкой совершенно неприминимой для реальной работы. (а то я довольно сильно преуспел в разработке стратегий показывающих обалденные результаты в тестере и совершенно не работающие реально))))

МОЖЕТ БЫТЬ БАР С ДРУГОГО ТАЙМФРЕЙМА БЕРЕТСЯ ЗАВЕРШЕННЫЙ, А НЕ МОДЕЛИРУЕТСЯ?
 
Realjin,
есть ещё такая подробность:
индикаторы как правило приязаны к барам (того размера, кот. определён текущим ТФ). Например, любая простая МА 21 будет отображаться по-разному на Н1 и Н4. Сама МА при этом будет посчитана правильно, но если, скажем, Н1 растянуть и наложить на Н4, то две эти МА не совпадут. А чтоб они совпали (и то "в основном") необходимо для Н1 указывать параметр МА 84. Такая МА84(Н1) совпадёт с МА21(Н4).

Для того, чтоб оценивать правильность и корректность тестера, необходимо внимательно отследить все настраиваемые и ненастраиваемые параметры, используемые и в советнике и в индикаторах, на кот. он построен. Особо внимательно надо подойти к ненастраиваемым. Некот. инд. и советники ориентированы только для работы в строго определённом ТФ, поэтому в них могут быть использованы даже и не пременные, а просто численные константы.

Одним словом, тестирование программы без её подробного анализа может привести к результатам, не всегда очевидным эксперементатору.

Вопросы, кот. ты задаёшь, лежат на поверхности и были очевидны программистам, сделавшим тестер.
Правильней было бы поискать функциональную ошибку в своих действиях и большинство неудач отнести к области некорректно организованного тестирования ( а не тестера).
 

индикаторы как правило приязаны к барам (того размера, кот. определён текущим ТФ). Например, любая простая МА 21 будет отображаться по-разному на Н1 и Н4. Сама МА при этом будет посчитана правильно, но если, скажем, Н1 растянуть и наложить на Н4, то две эти МА не совпадут. А чтоб они совпали (и то "в основном") необходимо для Н1 указывать параметр МА 84. Такая МА84(Н1) совпадёт с МА21(Н4).


Это очевидно! - параметр МА - это количество баров, а не промежуток времени в часах или минутах.. Но если быть точным, то МА 84 на H1 будет не такой как MA21 на H4. Временной период конечно будет одинаковый - и там и там по 84 часа. Но построены они будут по разному количеству точек.


Для того, чтоб оценивать правильность и корректность тестера, необходимо внимательно отследить все настраиваемые и ненастраиваемые параметры, используемые и в советнике и в индикаторах, на кот. он построен.


А разве мало для оценки некорректности тестера? - Различный результат тестирования при выборе разного периода, в то время как индикаторы берут даные с конкретно указанных таймфреймов, а тики (при моделировании по всем тикам) берутся с минуток. И почему же разница? Единственное, до чего я додумываюсь, это то, что текущий бар моделируется по минуткам только на выбранном для тестирования периоде, а на других таймфремах (с которых строятся индикаторы) используется завершенный бар, поэтому и разница в результатах.


...отнести к области некорректно организованного тестирования ( а не тестера).


А как можно корректо организовать тестирование некорректным тестером?
 
В принципе, догадываюсь в чем проблема у Realjin, код не прошу, так как смотреть все равно не буду, но может кто-нибудь из форумян сказал бы чего умного при наличии исходника.
 
Realjin,
ну чё ты прям..:)

Вот ты задаёшь вопрос:
Моделирование по всем тикам на H4 и H1 при наличии минутной истории показывает РАЗНЫЕ РЕЗУЛЬТАТЫ!!!

Я тебе пытаюсь ответить:
Для того, чтоб оценивать правильность и корректность тестера, необходимо внимательно отследить все настраиваемые и ненастраиваемые параметры, используемые и в советнике и в индикаторах, на кот. он построен. Особо внимательно надо подойти к ненастраиваемым.

Ты говоришь:
МА 84 на H1 будет не такой как MA21 на H4. Временной период конечно будет одинаковый - и там и там по 84 часа. Но построены они будут по разному количеству точек.

И я прибл. о том же:
А чтоб они совпали (и то "в основном") необходимо для Н1 указывать параметр МА 84

Но что будет, если этот параметр (21) указан внутри кода советника или индикатора?
Он будет работать именно как 21 на любом ТФ. О какой корректности может идти речь? То же касается и настраиваемых. Я не знаю что там у тебя, но понятно, что между тестированиями на разных ТФ одной и той же программы должен должен быть промежуток глубокого анализа содержания программы. Настраиваемые необх. как минимум переосмыслить (в простом варианте при переходе из Н4 в Н1 указать 84 вместо 21; но наверняка найдутся и "непростые параметры" и программные строки).

Ты-то сам как думаешь?
Должен ли один и тот же советник давать одинаковые результаты на разных ТФ?
(при условии, что он опирается на вычисления, основанные на обычных техн. индикаторах с жестко заданными или одинаковыми параметрами)

А как можно корректо организовать тестирование некорректным тестером?

Это, я думаю, ты немного погорячился..:)
 
// Режимы работы
extern bool Use_Reverse=true;//закрытие позиции при противоположном сигнале

// ордер
extern double Lots=1;
extern int Slippage=3;
extern int Take_Profit=0;
extern int Stop_Loss=11;
extern int Trailing_Stop=11;
extern int T_S_Start=0;//уровень "прибыли" (без учета спрэда), с которого начинается перемещения трейлинг-стопа

// индикаторы
extern int RSM_Period=100;
extern int RSM_Range=4;
extern int RSM_Shift=0;
extern int RSM_Smooth=7;
extern int RSM_CountBars=500;

//

extern int Magic_N=908454;

//--------------------------------------------------------------------------

//переменные

double hs60,ls60,rl60,sl60,hs15,ls15,rl15,sl15,MA;
int BC_1,SC_1;
int bs,ss;
string cmnt;
int cnt;
double Stop_Loss_To_Set,Take_Profit_To_Set;

int start(){

//--------------------------------------------------------------------------

// индикаторы

hs60=iCustom(NULL,60,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,0,0);
ls60=iCustom(NULL,60,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,1,0);
rl60=iCustom(NULL,60,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,2,0);
sl60=iCustom(NULL,60,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,3,0);

hs15=iCustom(NULL,15,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,0,0);
ls15=iCustom(NULL,15,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,1,0);
rl15=iCustom(NULL,15,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,2,0);
sl15=iCustom(NULL,15,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,3,0);

MA=iMA(NULL,15,35,0,MODE_SMA,PRICE_MEDIAN,0);

//--------------------------------------------------------------------------

// условия для BUY

BC_1=0;
if(ls60==sl60 && ls15==sl15 && Bid<MA){
BC_1=1;
}

//--------------------------------------------------------------------------

// условия для SELL


SC_1=0;
if(hs60==rl60 && hs15==rl15 && Bid>MA){
SC_1=1;
}

//--------------------------------------------------------------------------

// сигналы на вход

bs=0;
ss=0;

if(BC_1==1){
bs=1;
cmnt="BUY BUY BUY";
}
if(SC_1==1){
ss=1;
cmnt="SELL SELL SELL";
}

//--------------------------------------------------------------------------

// закрытие при разворотном сигнале

if(Use_Reverse==true){
for(cnt=0;cnt<OrdersTotal();cnt++){
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_N){
if(OrderType()==OP_BUY){
if(ss==1){
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua); // закрываем позицию
Sleep(10000);
}
}
if(OrderType()==OP_SELL){
if(bs==1){
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red); // закрываем позицию
Sleep(10000);
}
}
}
}
}

//--------------------------------------------------------------------------

// трейлинг стопы
if(Trailing_Stop>0){
for(cnt=0;cnt<OrdersTotal();cnt++){
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_N){
if(OrderType()==OP_BUY){
if(Ask-OrderOpenPrice()>=Point*T_S_Start){
if(OrderStopLoss()<Bid-Point*Trailing_Stop){
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*Trailing_Stop,OrderTakeProfit(),0,Green);
}
}
}
if(OrderType()==OP_SELL){
if((OrderOpenPrice()-Bid)>=Point*T_S_Start){
if((OrderStopLoss()>(Ask+Point*Trailing_Stop)) || (OrderStopLoss()==0)){
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*Trailing_Stop,OrderTakeProfit(),0,Red);
}
}
}
}
}
}

//--------------------------------------------------------------------------

//открытие позиции

if(O_Count()==0){
//long
if(bs==1 && ss==0){
Buy_SL_TP();
OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Stop_Loss_To_Set,Take_Profit_To_Set,cmnt,Magic_N,0,Red);
}
//short
if(ss==1 && bs==0){
Sell_SL_TP();
OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Stop_Loss_To_Set,Take_Profit_To_Set,cmnt,Magic_N,0,Aqua);
}
}
return(0);
}

//--------------------------------------------------------------------------
//--------------------------------------------------------------------------

// прочие функции

//рассчет значений СЛ и ТП

void Buy_SL_TP(){
if (Stop_Loss==0){
Stop_Loss_To_Set=0;
}
else{
Stop_Loss_To_Set=Bid-Stop_Loss*Point;
}
if(Take_Profit==0){
Take_Profit_To_Set=0;
}
else{
Take_Profit_To_Set=Bid+Take_Profit*Point;
}
}

void Sell_SL_TP(){
if (Stop_Loss==0){
Stop_Loss_To_Set=0;
}
else{
Stop_Loss_To_Set=Ask+(Stop_Loss)*Point;
}
if(Take_Profit==0){
Take_Profit_To_Set=0;
}
else{
Take_Profit_To_Set=Ask-(Take_Profit)*Point;
}
}

//количество ордеров данного эксперта

int O_Count() {
int tmp=0;
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_N) {
tmp++;
}
}
}
return(tmp);
}
 
Ё-маё!:)
Ты посмотри сколько здесь разных цифрочек!:)
1, 3, 11, 4, 7, 15, 60..

Вот как раз то, о чём я и говорил:

Настраиваемые параметры.
extern bool Use_Reverse=true;//закрытие позиции при противоположном сигнале

// ордер
extern double Lots=1;
extern int Slippage=3;
extern int Take_Profit=0;
extern int Stop_Loss=11;
extern int Trailing_Stop=11;
extern int T_S_Start=0;//уровень "прибыли" (без учета спрэда), с которого начинается перемещения трейлинг-стопа 

// индикаторы
extern int RSM_Period=100;
extern int RSM_Range=4;
extern int RSM_Shift=0;
extern int RSM_Smooth=7;
extern int RSM_CountBars=500; 



Не настраиваемые параметры: 60, 15, 1, 2, 3.

hs60=iCustom(NULL,60,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,0,0);
ls60=iCustom(NULL,60,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,1,0);
rl60=iCustom(NULL,60,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,2,0);
sl60=iCustom(NULL,60,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,3,0);

hs15=iCustom(NULL,15,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,0,0);
ls15=iCustom(NULL,15,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,1,0);
rl15=iCustom(NULL,15,"i_FD_Range-Sm",RSM_Period,RSM_Range,RSM_Shift,RSM_Smooth,RSM_CountBars,2,0);


И ты хочешь, чтоб этот бумажный кораблик одинаково плавал в корыте и в океане?:)