Тестер выдает реквоты

 

Добрый день.

Написал свой первый робот на MQL5. Суть робота - при пересечении скользящих открываться в направлении тренда на открытии нового бара.

При тестах получаю реквоты. Понимаю, что где-то допустил ошибку, но где, найти не могу.


Буду благодарен за подсказку.


#property copyright "MM"
#property link      "https://www.mql5.com"
#property version   "1.00"


#include <Trade\Trade.mqh>



input double   Lot      = 0.1;      //Лоти
input int   SL       = 30;          // SL
input int   TP       = 90;          // TP

input int   MA_FastPeriod  = 12;    // Період швидкої ковзної
input int   MA_FastShift   = 6;     // Зсув швидкої ковзної

input int   MA_SlowPeriod    = 30; // Період повільної ковзної
input int   MA_SlowShift     = 6;  // Зсув повільної ковзної


int MA_fast;   // хендл індикатора MA_fast
int MA_slow;   // хендл індикатора MA_slow
//---------

CTrade         Trade;              
 



//#define Magic 1234567



//+------------------------------------------------------------------+
//| Check for new bar                                                |
//+------------------------------------------------------------------+
bool NewBar ()
{
static datetime time;   // старий час
datetime newTime[1];       // новий час 

bool flag = false;

int timecount = CopyTime(_Symbol,_Period,0,1,newTime);


   if (timecount>0)                 // дані скопійовано
   {
      
      if (time != newTime[0])    // старий час не дорівнює новому
      {   
         if(time != 0)           // якщо не перший запуск, то новий бар
         flag = true;
                 
                  
         time = newTime[0];      // запам'ятовуємо час нового бару
      } 
   }
return (flag);

}


//+------------------------------------------------------------------+
//| Check for open position conditions                               |
//+------------------------------------------------------------------+
void CheckForOpen(void)
  {
   MqlRates          rt[2];
   
   
//--- go trading only for first ticks of new bar
   if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(rt[1].tick_volume>1)
      return;
//--- get current Moving Average 
   double   ma_f[3], ma_s[3];
   
   if(CopyBuffer(MA_fast,0,0,3,ma_f)!=3)
     {
      Print("CopyBuffer from iMA failed, no data");
      return;
     }
     
     if(CopyBuffer(MA_slow,0,0,3,ma_s)!=3)
     {
      Print("CopyBuffer from iMA failed, no data");
      return;
     }
     
    
//--- check signals
   ENUM_ORDER_TYPE signal=WRONG_VALUE;

   if(ma_s[2]<ma_f[2] && ma_s[1]>ma_f[1] && rt[0].open<ma_f[0])
      signal=ORDER_TYPE_SELL;    // sell conditions
   else
     {
      if(ma_s[2]>ma_f[2] && ma_s[1]<ma_f[1] && rt[0].open>ma_f[0])
         signal=ORDER_TYPE_BUY;  // buy conditions
     }
//--- additional checking
   if(signal==ORDER_TYPE_SELL)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         Trade.PositionOpen(_Symbol,signal,Lot,SYMBOL_BID,0,0,NULL);  // Open SellOrder
         //Trade.PositionOpen(_Symbol,signal,Lot,SYMBOL_BID, /*NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK)+SL*_Point,_Digits)*/ 0,/*NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK)-TP*_Point,_Digits)*/ 0);  // Open SellOrder
     }
     
      if(signal==ORDER_TYPE_BUY)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         Trade.PositionOpen(_Symbol,signal,Lot,SYMBOL_ASK,0,0,NULL);  // Open BuyOrder
//     Trade.PositionOpen(_Symbol,signal,Lot,SYMBOL_ASK, /*NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK)-SL*_Point,_Digits)*/  0, /*NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK)+TP*_Point,_Digits)*/ 0);  // Open BuyOrder
     
     }
     
//---
  }




//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{

MA_fast  = iMA(_Symbol,_Period,MA_FastPeriod,MA_FastShift,MODE_SMA,PRICE_CLOSE);
MA_slow  = iMA(_Symbol,_Period,MA_SlowPeriod,MA_SlowShift,MODE_SMA,PRICE_CLOSE);
   
//Trade.SetExpertMagicNumber(Magic);



return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{

   if (NewBar())
   {
      if(PositionSelect(_Symbol))
      return;
      
      else
      CheckForOpen();
   }
   
}   

//+------------------------------------------------------------------+


Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 

А что такое у Вас "SYMBOL_BID" и "SYMBOL_ASK"?

Хотите использовать PositionOpen - потрудитесь получить цены. Не хотите получать цены - используйте простые и доступные методы:

//--- additional checking
   if(signal==ORDER_TYPE_SELL)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         Trade.Sell(Lot);  // Open Sell
     }

   if(signal==ORDER_TYPE_BUY)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         Trade.Buy(Lot);  // Open Buy
     }
 
Vladimir Karputov:

А что такое у Вас "SYMBOL_BID" и "SYMBOL_ASK"?

Хотите использовать PositionOpen - потрудитесь получить цены. Не хотите получать цены - используйте простые и доступные методы:


Большое спасибо! Буду пробовать
 
MaksGroup:

Большое спасибо! Буду пробовать


Пробуйте. Этот вариант

//--- additional checking
   if(signal==ORDER_TYPE_SELL)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         Trade.Sell(Lot);  // Open Sell
     }

   if(signal==ORDER_TYPE_BUY)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         Trade.Buy(Lot);  // Open Buy
     }

позволяет быстро выдавать приказы на покупку.продажу - просто указав объём. То есть можно не указывать: символ, цену, sl и tp, комментарий.

 
Vladimir Karputov:


Пробуйте. Этот вариант

позволяет быстро выдавать приказы на покупку.продажу - просто указав объём. То есть можно не указывать: символ, цену, sl и tp, комментарий.


Я вот таким образом сделал так, как нужно было попробовать корректность стопов и тейк профита. Теперь все работает. Спасибо.


  if(signal==ORDER_TYPE_SELL)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         
        
         Trade.PositionOpen(_Symbol,signal,Lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK)+SL*_Point,_Digits),NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK)-TP*_Point,_Digits));  // Open SellOrder
         
         
     }
     
     
      if(signal==ORDER_TYPE_BUY)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         Trade.PositionOpen(_Symbol,signal,Lot,SymbolInfoDouble(_Symbol,SYMBOL_ASK),NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK)-SL*_Point,_Digits),NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK)+TP*_Point,_Digits));  // Open BuyOrder
     
     }
 
MaksGroup:


Я вот таким образом сделал так, как нужно было попробовать корректность стопов и тейк профита. Теперь все работает. Спасибо.



Можно и так, но когда на символах (фьючерсах или металлах) начнёте получать ошибку "неправильные стопы" - просто спросите - там нужно применять другое решение.
 
Vladimir Karputov:

Можно и так, но когда на символах (фьючерсах или металлах) начнёте получать ошибку "неправильные стопы" - просто спросите - там нужно применять другое решение.

Ок, спасибо.
Причина обращения: