Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Интересуют возможности MQL5? Загляни в документацию!
nick90
13
nick90 2012.07.13 14:57 

Добрый день!

Пишу советника для МТ4. При проверке работоспособности на демо счёте - всё прекрасно работает: ордера открываются, стопы ставятся! Вобщем, всё работает.

Но при попытке протестировать на тестере стратегий вылезает ряд ошибок:

2012.07.13 18:38:18 TestGenerator: unmatched data error (volume limit 1484 at 2012.03.09 01:00 exceeded)
2012.07.13 18:38:26 TestGenerator: unmatched data error (low value 1.25156 at 2012.06.10 21:00 is not reached from the least timeframe, low price 1.26285 mismatches)
2012.07.13 18:38:28 2012.01.02 10:00 My session break out EURUSD,M30: OrderSend error 130

Вот код, он не сложный.

#property copyright "Nick"
#property link      ""

extern int MaxRisk=5;
extern int TakeProfit=50;
extern int StopLoss=0;
int StartTradeHour1 = 14;
int ib1=0;//счётчик для открытия одной сделки (buy)
int is1=0;//счётчик для открытия одной сделки (sell)

int init()
  {
   return(0);
  }

int deinit()
  {
   return(0);
  }

int start()
  {
   int _today = DayOfWeek();
   //в выходные не торгуем
   if(DayOfWeek()==0||DayOfWeek()==6) 
   {
    if(_today != DayOfWeek())
    {Print("Наступил выходной день!");}
    _today = DayOfWeek();
    return(0);
   }
   if(!IsTradeAllowed()) return(0);
   if (_today != DayOfWeek())
   {//если наступил следующий день - обнуляем счётчики
    ib1=0;
    is1=0;
    _today = DayOfWeek();
   }
   //НАЧИНАЕМ ТОРГ
   double Lot=GetLot(MaxRisk);
   if(Lot==0){Alert("Недостаточно средств!");return(0);}
   //++++   начало выставления ордеров ++++
   if(Hour()==StartTradeHour1)
      {
   //для покупки
   if(ib1 == 0)
   {
    int tikInt_B1 = -1;
    while(tikInt_B1<0)//если ордер не поставился, пробуем ещё
    {
     //High[Highest(Symbol(), PERIOD_H1, MODE_HIGH, 9, 0)];//максимальная цена последней закрывшейся сессии
     tikInt_B1 = NewOrder(OP_BUYSTOP, Lot,High[Highest(Symbol(), PERIOD_H1, MODE_HIGH, 9, 0)],High[Highest(Symbol(), PERIOD_H1, MODE_HIGH, 9, 0)]+TakeProfit*0.00001,0,TimeCurrent()+21600);
    }
    ib1=ib1+1;
   }
   //для продажи
   if (is1 == 0)
   {
    int tikInt_S1 = -1;
    while(tikInt_S1<0)//если ордер не поставился, пробуем ещё
    {
      tikInt_S1 = NewOrder(OP_SELLSTOP, Lot, Low[Lowest(Symbol(), PERIOD_H1, MODE_LOW, 9, 0)],Low[Lowest(Symbol(), PERIOD_H1, MODE_LOW, 9, 0)]-TakeProfit*0.00001,0,TimeCurrent()+21600);
    }
    is1=is1+1;
   }
      }
   //++++   конец выставления ордеров ++++
     
   return(0);
  }
//+------------------------------------------------------------------+
double GetLot(int Risk)
{
 double Free    =AccountFreeMargin();
 double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
 double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
 double Step    =MarketInfo(Symbol(),MODE_LOTSTEP);
 double Lot     =MathFloor(Free*Risk/100/One_Lot/Step)*Step;
 if(Lot<Min_Lot) Lot=Min_Lot;
 if(Lot>Max_Lot) Lot=Max_Lot;
 if(Lot*One_Lot>Free) return(0.0);
return(Lot);
}
//+------------------------------------------------------------------+
int NewOrder(int Cmd,double Lot,double PR=0,double TP=0,double SL=0,int TimeLife=0)
{
 while(!IsTradeAllowed()) Sleep(100);
 if(Cmd==OP_BUY)
   {PR=Ask;
    if(TakeProfit>0) TP=Ask+TakeProfit*Point;
    if(StopLoss>0) SL=Ask-StopLoss*Point;}
 if(Cmd==OP_SELL)
   {PR=Bid;
    if(TakeProfit>0) TP=Bid-TakeProfit*Point;
    if(StopLoss>0) SL=Bid+StopLoss*Point;}
 
 int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP,"ордер советника",676,TimeLife,CLR_NONE);
 if(tic<0) Print("Ошибка открытия ордера: ",GetLastError());
return(tic);
}

Пробовал гуглить по ошибкам. Про 130-ю - всё понятно, но не понятно почему она вылазит, ведь при запуске советника всё нормально ставиться...



Сергей
728
Сергей 2012.07.13 15:06  

unmatched data error - ошибки в котировках.

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

nick90
13
nick90 2012.07.13 15:25  
Спасибо! Помогло!
nick90
13
nick90 2012.07.13 19:48  
Ан нет... Поторопился я с благодарностью((
2012.07.13 23:45:05 TestGenerator: unmatched data error (high value 0.96320 at 2000.03.30 22:00 is not reached from the least timeframe, high price 0.96290 mismatches)
Dmitiry Ananiev
6330
Dmitiry Ananiev 2012.07.14 00:34  
ошибка в исторических данных. перезалейте историю
_SERG_
84
_SERG_ 2012.07.15 09:42  
рекомендую для тестера, везде где у Вас есть double значения добавить NormalizeDouble (Ask(или Bid), Digits); или расчитыватся стоп ордера.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий