Работа тестера

 
Написал эксперта, который предположительно должен работать на дневках, причем все решения и торговые операции совершаются при появление нового дневного бара (находятся внутри условия)
extern int       bTF=1440;
if(bTimeFlag!=iTime(NULL,bTF,0))
{
    bTimeFlag=Time(NULL,bTF,0);
...
}

другие т-ф пока не использовались (на дневках будет определяться направление, а точки входа впоследствии будут уточняться на мелких т-ф для этого используется указанный вариант получения времени, а торговлю по дневкам написал для того, чтобы определить эффективность определения направления). Запустил на тестирование (билд 178, модель 2), получил результаты, памятуя о наличии ошибок в моделировании решил посмотреть что же там наторговал мой эксперт. Смотрю на график



Чудеса стопов и профитов начинаются с первой операции:
1. Советник торгует раз в сутки в начале появления нового бара открываются, закрываются, изменяются все позиции, а на вкладке результаты мы наблюдаем время всех операций = 23:59 (иногда все-таки и встречается правильные 00:00 ну или чуть позже, время на просчет + посылки ордера), скорее всего 23:59 предыдущий даты на самом деле является 00:00 следующей за ней датой (см. ветку "Моделирование?!?")
2. по первой операции (OP_BUY) последнее изменение стопа 11/01/1990 23:59 = 1.6572, после этого до момента срабатывания стопа 17/01/1990 23:59 (????) почему-то стоп сработал тоже в 23:59 цена побывала ниже уровня стопа, как минимум два раза (спрэд учтен)
3. если судить по времени срабатывания стопа то уровень должен быть гораздо ниже (жирная красная линия на графике), а так цена закрытия равна уровню стопа который указан в ордере (хоть что-то правильно, уже радует)

 
Какой режим тестирования использовался? потиковый, по контрольным точкам или по открытию баров?
Если потиковый, то запросто можно получить время 23:59 - нужен полный код эксперта чтобы проверить.
 
я могу предположить, что объёмы у Ваших дневных баров равны 1. поэтому сгенерированы только последние состояния баров на время 23:59
 
Какой режим тестирования использовался? потиковый, по контрольным точкам или по открытию баров?


Запустил на тестирование (билд 178, модель 2)


Если потиковый, то запросто можно получить время 23:59 - нужен полный код эксперта чтобы проверить.


да какая разница! я же пишу , что все торговые операции заключены внутри условия

extern int       bTF=1440;
if(bTimeFlag!=iTime(NULL,bTF,0))
{
    bTimeFlag=Time(NULL,bTF,0);
    здесь прописаны все действия производимые экспертом
...
}



что означает = если время бара отличается от сохраненного в переменной bTimeFlag, то начинаем выполнять действия и сначала записываем новое время в переменную, пока не появится новый бар
ни о каких действия речи быть не может. Новый бар на дневках появляется в 00:00, эксперт может отловить это чуть позже, но не заранее. Экспертов я привел в "Моделирование?!?" (автор ветки-loewe).
Оба приведенных мною экспертов показывают наличие проблем с временной шкалой (уже недели две как) , кроме того в этой ветке я привел картинку, на которой видно и установленные уровни
стоп-лосс и что цена побывала ниже, а стоп не сработал

//---- input parameters
extern int       bTF=1440;
extern int       AMARange=10;
extern int       AMAFast=2;
extern int       AMASlow=20;
extern int       AMAFilter=60;
extern int       AMAn=6;
extern double    AMAh=0.003;
extern double    bePillow=0.004;
extern double    biPillow=0.001;
extern int       PCRange=6;
extern int       ShRange=30;
extern double    Sh_k=2.4;

//--------- объявление глобальных переменных
int bTrFlag=0;
datetime bTimeFlag=0;
double bBSLoss=0.0, bSSLoss=0.0, bSLim=0.0, bBLim=0.0;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int i,j;
   double mlot=1;
//---- 
   if(bTimeFlag!=iTime(NULL,bTF,0))
   {
      GetIbTFValue(0);
//----
   
//------------------- если флаг направления равен 11 ----------------------------------------------
      if(bTrFlag==11)
      {
         //если есть открытые ордера закроем или удалим все кроме OP_BUY
         if( OrdersTotal()>0 )
         {
            for(i=0;i<OrdersTotal();i++) //цикл по ордерам
            {
               //делаем попытки ордер селект
               if( m_OSelect(i,SELECT_BY_POS,MODE_TRADES,100)!=1 ) //если ордер не выбран
               {
                  Alert("Внимание!!! Необходимо удалить (закрыть) ордера отличные от OP_BUY");//выдаем сообщение
               }
               else
               {
                  //если ордер отложенный
                  if( OrderType()>1 )
                  {
                     //делаем попытки удалить его
                     m_ODel(100);
                  }
                  else
                  {
                     if( OrderType()==1 ) //если ордер OP_SELL
                     {
                        //делаем попытки закрыть его
                        m_OClose(Ask,1,Black,100);
                     }
                  }
               }
            }
         }
         //конец блока удаляющего и закрывающего "лишние" ордера
         //теперь если остались ордера то это OP_BUY для них нужно проверить необходимость передвижения стопа
         //если нет - тогда нужно открыть нужные ордера
         if( OrdersTotal()<1 )
         {
            m_OSend(Symbol(),OP_BUY,mlot,Ask,1,bBSLoss,0,""+bTrFlag,bTrFlag,0,DeepSkyBlue,100);
         }
         else
         {
            for(i=0;i<OrdersTotal();i++) //цикл по ордерам
            {
               //делаем попытки ордер селект
               if( m_OSelect(i,SELECT_BY_POS,MODE_TRADES,100)!=1 ) //если ордер не выбран
               {
                  Alert("Внимание!!! Необходимо скорректировать значения ордеров OP_BUY");//выдаем сообщение
               }
               else
               {
                  if( OrderStopLoss()<bBSLoss )
                  {
                     m_OModify(0,bBSLoss,OrderTakeProfit(),0,DeepSkyBlue,100);
                  }
               }
            }
         }
      }
//-------------------------------------------------------------------------------------------------
      
//------------------- если флаг направления равен 12 ----------------------------------------------
      if(bTrFlag==12)
      {
         //если есть открытые ордера закроем или удалим все кроме OP_SELL
         if( OrdersTotal()>0 )
         {
            for(i=0;i<OrdersTotal();i++) //цикл по ордерам
            {
               //делаем попытки ордер селект
               if( m_OSelect(i,SELECT_BY_POS,MODE_TRADES,100)!=1 ) //если ордер не выбран
               {
                  Alert("Внимание!!! Необходимо удалить (закрыть) ордера отличные от OP_SELL");//выдаем сообщение
               }
               else
               {
                  //если ордер отложенный
                  if( OrderType()>1 )
                  {
                     //делаем попытки удалить его
                     m_ODel(100);
                  }
                  else
                  {
                     if( OrderType()==0 ) //если ордер OP_BUY
                     {
                        //делаем попытки закрыть его
                        m_OClose(Bid,1,DeepSkyBlue,100);
                     }
                  }
               }
            }
         }
         //конец блока удаляющего и закрывающего "лишние" ордера
         //теперь если остались ордера то это OP_SELL для них нужно проверить необходимость передвижения стопа
         //если нет - тогда нужно открыть нужные ордера
         if( OrdersTotal()<1 )
         {
            m_OSend(Symbol(),OP_SELL,mlot,Bid,1,bSSLoss,0,""+bTrFlag,bTrFlag,0,Black,100);
         }
         else
         {
            for(i=0;i<OrdersTotal();i++) //цикл по ордерам
            {
               //делаем попытки ордер селект
               if( m_OSelect(i,SELECT_BY_POS,MODE_TRADES,100)!=1 ) //если ордер не выбран
               {
                  Alert("Внимание!!! Необходимо скорректировать значения ордеров OP_SELL");//выдаем сообщение
               }
               else
               {
                  if( OrderStopLoss()>bSSLoss )
                  {
                     m_OModify(0,bSSLoss,OrderTakeProfit(),0,Black,100);
                  }
               }
            }
         }
      }
//-------------------------------------------------------------------------------------------------

//------------------- если флаг направления равен 21 ----------------------------------------------
      if(bTrFlag==21)
      {
         
      }
//-------------------------------------------------------------------------------------------------

//------------------- если флаг направления равен 22 ----------------------------------------------
      if(bTrFlag==22)
      {
      
      }
//-------------------------------------------------------------------------------------------------

      //во избежание недоразумений обнуляем глобальные переменные
      bTrFlag=0;
      bBSLoss=0.0;
      bSSLoss=0.0;
      bSLim=0.0;
      bBLim=0.0;
   }
   return(0);
  }
//-------------------------------------------------------------------------------------------------

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//-------------------------------------------------------------------------------------------------

//+------------------------------------------------------------------+
//| Функция получения данных индикатора на большом т-ф               |
//+------------------------------------------------------------------+
int GetIbTFValue(int cb)
  {
//---- 
   bTimeFlag=iTime(NULL,bTF,cb); //изменяем значения флага времени последнего получения данных с индикатора
   //устанавливаем значение флага направления торговли
   bTrFlag=iCustom(NULL,bTF,"exp1_2",AMARange,AMAFast,AMASlow,AMAFilter,AMAn,AMAh,bePillow,biPillow,PCRange,ShRange,Sh_k,6,cb);
   if( bTrFlag>10 )
   {
      if( bTrFlag==11 )//если восходящий тренд
      {
         //получим значение стоп-лосс для позиции Buy
         bBSLoss=iCustom(NULL,bTF,"exp1_2",AMARange,AMAFast,AMASlow,AMAFilter,AMAn,AMAh,bePillow,biPillow,PCRange,ShRange,Sh_k,2,cb);
         return(0);//выходим из функции
      }
      else
      {
         if( bTrFlag==12 )//если нисходящий тренд
         {
            //получим значение стоп-лосс для позиции Sell
            bSSLoss=iCustom(NULL,bTF,"exp1_2",AMARange,AMAFast,AMASlow,AMAFilter,AMAn,AMAh,bePillow,biPillow,PCRange,ShRange,Sh_k,1,cb);
            return(0);
         }
      }
   }
   if( bTrFlag>20 && bTrFlag<23 ) //если флет
   {
      //получим значения точек отбития и пробития
      bBSLoss=iCustom(NULL,bTF,"exp1_2",AMARange,AMAFast,AMASlow,AMAFilter,AMAn,AMAh,bePillow,biPillow,PCRange,ShRange,Sh_k,4,cb);
      bSSLoss=iCustom(NULL,bTF,"exp1_2",AMARange,AMAFast,AMASlow,AMAFilter,AMAn,AMAh,bePillow,biPillow,PCRange,ShRange,Sh_k,3,cb);
      bBLim=  iCustom(NULL,bTF,"exp1_2",AMARange,AMAFast,AMASlow,AMAFilter,AMAn,AMAh,bePillow,biPillow,PCRange,ShRange,Sh_k,2,cb);
      bSLim=  iCustom(NULL,bTF,"exp1_2",AMARange,AMAFast,AMASlow,AMAFilter,AMAn,AMAh,bePillow,biPillow,PCRange,ShRange,Sh_k,1,cb);
      return(0);
   }
   else
   {
      //если значение флага направления не соответствует ни одному из перечисленных
      //обнулим навсякий пожарный флаг направления торговли
      bTrFlag=0;
      //и сообщим о том что возникла не предвиденная ситуация
      Alert("Внимание!!!Не предвиденная ситуация!!!");
   }
//----
   return(-1);
  }
//-------------------------------------------------------------------------------------------------

//+------------------------------------------------------------------+
//| Функция делает Attempt количество попыток ордер селект           |
//+------------------------------------------------------------------+
int m_OSelect(int ct, int sel, int pool, int Attempt)
  {
   int i;
//---- 
//ордер селект за Attempt попыток
   for(i=0;i<Attempt;i++)
   {
      if( OrderSelect(ct,sel,pool)==1 ) //если ордер выбран
      {
         Alert( "Попытка ордер селект удачна "+OrderTicket() );
         return(1);//завершаем функцию
      }
   }
   Alert( "Код ошибки - "+GetLastError() );
   Alert("Невозможно ордер селект! Сделано "+Attempt+" попыток.");
//---- 
   return(-1);
  }
//-------------------------------------------------------------------------------------------------
  
//+------------------------------------------------------------------+
//| Функция делает Attempt количество попыток удалить ордер          |
//+------------------------------------------------------------------+
int m_ODel(int Attempt)
  {
   int i;
//---- 
//пытаемся удалить ордер за Attempt попыток
   for(i=0;i<Attempt;i++)
   {
      if( OrderDelete(OrderTicket())==1 ) //если ордер удален
      {
         Alert("Ордер "+OrderTicket()+" удален!!!");
         return(1);//завершаем функцию
      }
   }
   Alert("Внимание!!! Не удалось удалить отложенный ордер. "+OrderTicket()+" Сделано "+Attempt+" попыток");
//---- 
   return(1);
  }
//-------------------------------------------------------------------------------------------------

//+------------------------------------------------------------------+
//| Функция делает Attempt количество попыток закрыть ордер          |
//+------------------------------------------------------------------+
int m_OClose(double Price, int slip, color ocolor, int Attempt)
  {
   int i;
//---- 
//пытаемся закрыть ордер за Attempt попыток
   for(i=0;i<Attempt;i++)
   {
      if( OrderClose(OrderTicket(),OrderLots(),Price,slip,ocolor)==1 ) //если ордер закрыт
      {
         Alert("Ордер "+OrderTicket()+" закрыт!!!");
         return(1);//завершаем функцию
      }
   }
   Alert("Внимание!!! Не удалось закрыть ордер. "+OrderTicket()+" Сделано "+Attempt+" попыток");
//---- 
   return(1);
  }
//-------------------------------------------------------------------------------------------------

//+------------------------------------------------------------------+
//| Функция делает Attempt количество попыток послать ордер          |
//+------------------------------------------------------------------+
int m_OSend(string osymb, int otype, double ovol, double oprice, int oslipp, double osloss, double otprof, string ocomm, int omagic, datetime expir, color ocolor, int Attempt)
  {
   int i;
//---- 
//пытаемся удалить ордер за Attempt попыток
   for(i=0;i<Attempt;i++)
   {
      if( OrderSend(osymb,otype,ovol,oprice,oslipp,osloss,otprof,ocomm,omagic,expir,ocolor)!=-1 ) //если ордер послан
      {
         Alert("Установка ордера прошла удачно!!!");
         return(1);//завершаем функцию
      }
   }
   Alert("Внимание!!! Не удалось поставить ордер. Сделано "+Attempt+" попыток");
//---- 
   return(1);
  }
//-------------------------------------------------------------------------------------------------

//+------------------------------------------------------------------+
//| Функция делает Attempt количество попыток изменить ордер         |
//+------------------------------------------------------------------+
int m_OModify(double nprice, double nsloss, double ntprof, datetime nexpir, color ncolor, int Attempt)
  {
   int i;
//---- 
//пытаемся удалить ордер за Attempt попыток
   for(i=0;i<Attempt;i++)
   {
      if( OrderModify(OrderTicket(),nprice,nsloss,ntprof,nexpir,ncolor)!=-1 ) //если ордер послан
      {
         Alert("Ордер "+OrderTicket()+" изменен удачно!!!");
         return(1);//завершаем функцию
      }
   }
   Alert("Внимание!!! Не удалось изменить ордер. "+OrderTicket()+" Сделано "+Attempt+" попыток");
//---- 
   return(1);
  }
//-------------------------------------------------------------------------------------------------