Советник не открывает сделки [Перехожу на MQL5]

 

Товарищи, посмотрите пожалуйста, какой-то принципиальный момент упущен. Советник не открывает сделки ни по одной из валют. Я своей ошибки не вижу, рассчитываю на вашу помощь. Мне кажется тут для профи пару минут, я уже второй день втыкаюсь. Пользовался статьями, но так и не увидел допущенной ошибки

Код советника:

#property copyright "UUT"
#property link      ".."
#property version   "1.00"
//внешние переменные
input string Sym0="NZDUSD";
input string Sym1="EURUSD";
input int Uplimit0=10;
input int Uplimit1=10;
input int Downlimit0=10;
input int Downlimit1=10;
input int StopBuy0=20;
input int StopBuy1=20;
input int StopSell0=20;
input int StopSell1=20;
input int Slippage=0;
input double lot0=0.1;
input double lot1=0.1;
int OType0;
int OType1;
double level0;
double level1;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   spread(Sym1);
   int Total=OrdersTotal();
   //проверка условия закрытия сделки
   if (Total!=0)
      {
       if (OType0==0)
          {
           if (delta(Sym0,level0)>=Uplimit0+spread(Sym0))BuyPositionClose(Sym0,Slippage);
           if (delta(Sym1,level1)<=Downlimit1+spread(Sym1))BuyPositionClose(Sym0,Slippage);
          }
       if (OType0==1)
          {
           if (delta(Sym1,level1)>=Uplimit1+spread(Sym1)) BuyPositionClose(Sym1,Slippage);
           if (delta(Sym0,level0)<=Downlimit0+spread(Sym0))SellPositionClose(Sym0,Slippage);
          }   
      } 
   //случайно формируем вид сделки
   MathSrand(TimeLocal());  
   //открываем сделки на мультивалютнике
   if (volume(Sym0)<2 && volume(Sym1)<2) 
      {
       
       if (MathRand()>32767/2) 
          {
           OType0=0;//buy
           OType1=1;//sell
          }
       else
          {
           OType0=1;//sell
           OType1=0;//buy
          } 
       if (Total!=0)   
       {
        if (OType0==0)
          {
           BuyPositionClose(Sym0,Slippage);
           BuyPositionClose(Sym0,Slippage);
          }
       if (OType0==1)
          {
           BuyPositionClose(Sym1,Slippage);
           SellPositionClose(Sym0,Slippage);
          }   
       }
       if (Total==0)
           {
            if (OType0==0) 
               {
                BuyPositionOpen (Sym0, Slippage,lot0);
                level0=SymbolInfoDouble(Sym0,SYMBOL_ASK);
                SellPositionOpen(Sym1, Slippage,lot1);
                level1=SymbolInfoDouble(Sym1,SYMBOL_BID);
               }
            if (OType0==1)
               {
                BuyPositionOpen(Sym1, Slippage,lot1);
                level1=SymbolInfoDouble(Sym0,SYMBOL_ASK);
                SellPositionOpen(Sym0, Slippage,lot0);
                level0=SymbolInfoDouble(Sym0,SYMBOL_BID);
               } 
            }    
       }
        

  }


int spread(string Symb_)
{
 return(SymbolInfoInteger(Symb_,SYMBOL_SPREAD));
}

double delta(string Symb_,double level)
{
 double bid=SymbolInfoDouble(Symb_,SYMBOL_BID);
 double point=SymbolInfoDouble(Symb_,SYMBOL_POINT);
 return((bid-level)/point);
}
double volume(string Symb_)
{
 return(SymbolInfoDouble(Symb_,SYMBOL_VOLUME_MAX));
}

bool BuyPositionOpen(const string symbol,ulong deviation, double volume)
  {
//----+
   //--- Объявление структур торгового запроса и результата торгового запроса
   MqlTradeRequest request;
   MqlTradeResult result;

   //--- проверка на наличие открытой позиции по активу для сделки
   if(PositionSelect(symbol))return(false);
   
   int digit = SymbolInfoInteger(symbol, SYMBOL_DIGITS);
   int stoplevel = SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL);
   double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
   
   //--- Инициализация структуры торгового запроса MqlTradeRequest для открывания BUY позиции
   request.type   = ORDER_TYPE_BUY;
   request.price  = SymbolInfoDouble(symbol, SYMBOL_ASK);
   request.action = TRADE_ACTION_DEAL;
   request.symbol = symbol;
   request.volume = volume;
   request.sl = 0.0;
   request.tp = 0.0;
   //---
   request.deviation = (deviation == ULONG_MAX) ? deviation : deviation;
   request.type_filling = ORDER_FILLING_AON;
   //---
   string word = "";
   StringConcatenate(word, "<<< ============ BuyPositionOpen():   Открываем Buy позицию по ",symbol, " ============ >>>");
   Print(word);
   return(true);
  }
  //+X================================================================X+
//| Close specified opened buy position.                             |
//| INPUT:  symbol    -symbol for fish,                              |
//|         deviation -deviation for price close.                    |
//| OUTPUT: true-if successful, false otherwise.                     |
//| REMARK: no.                                                      |
//+X================================================================X+
bool BuyPositionClose(const string symbol, ulong deviation)
  {
//----+
   //--- Объявление структур торгового запроса и результата торгового запроса
   MqlTradeRequest request;
   MqlTradeResult result;
   
   //--- Проверка на наличие открытой BUY позиции
   if(PositionSelect(symbol))
     {
      if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_BUY) return(false);
     }
    else  return(false);
    
   //--- Инициализация структуры торгового запроса MqlTradeRequest для закрывания BUY позиции
   request.type   = ORDER_TYPE_SELL;
   request.price  = SymbolInfoDouble(symbol, SYMBOL_BID);
   request.action = TRADE_ACTION_DEAL;
   request.symbol = symbol;
   request.volume = PositionGetDouble(POSITION_VOLUME);
   request.sl = 0.0;
   request.tp = 0.0;
   request.deviation = (deviation == ULONG_MAX) ? deviation : deviation;
   request.type_filling = ORDER_FILLING_AON;
   //---
   string word = "";
   StringConcatenate(word,
      "<<< ============ BuyPositionClose():   Закрываем Buy позицию по ",
                                                       symbol, " ============ >>>");
   Print(word);
   //----+
   return(true);
  }
//+X================================================================X+
//| Open sell position.                                              |
//| INPUT:  symbol    -symbol for fish,                              |
//|         deviation -deviation for price close.                    |
//| OUTPUT: true-if successful, false otherwise.                     |
//| REMARK: no.                                                      |
//+X================================================================X+
bool SellPositionOpen(const string symbol,ulong deviation,double volume)
  {
//----+
   //--- Объявление структур торгового запроса и результата торгового запроса
   MqlTradeRequest request;
   MqlTradeResult result;
   
   //--- проверка на наличие открытой позиции по активу для сделки
   if(PositionSelect(symbol))return(false);
   
   int digit = SymbolInfoInteger(symbol, SYMBOL_DIGITS);
   int stoplevel = SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL);
   double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
   //--- Инициализация структуры торгового запроса MqlTradeRequest для открывания SELL позиции
   request.type   = ORDER_TYPE_SELL;
   request.price  = SymbolInfoDouble(symbol, SYMBOL_BID);
   request.action = TRADE_ACTION_DEAL;
   request.symbol = symbol;
   request.volume = volume;
   request.sl = 0.0;
   request.tp = 0.0;
   request.deviation = (deviation == ULONG_MAX) ? deviation : deviation;
   request.type_filling = ORDER_FILLING_AON;
   
   //---
   string word = "";
   StringConcatenate(word,
      "<<< ============ SellPositionOpen():   Открываем Sell позицию по ",
                                                       symbol, " ============ >>>");
   Print(word);
   return(true);
  }

//+X================================================================X+
//| Close specified sell opened position.                            |
//| INPUT:  symbol    -symbol for fish,                              |
//|         deviation -deviation for price close.                    |
//| OUTPUT: true-if successful, false otherwise.                     |
//| REMARK: no.                                                      |
//+X================================================================X+
bool SellPositionClose(const string symbol, ulong deviation)
  {
//----+
   //--- Объявление структур торгового запроса и результата торгового запроса
   MqlTradeRequest request;
   MqlTradeResult result;

   //--- Проверка на наличие открытой BUY позиции
   if(PositionSelect(symbol))
    {
     if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_SELL)return(false);
    }
   else return(false); 

   //--- Инициализация структуры торгового запроса MqlTradeRequest для закрывания SELL позиции
   request.type   = ORDER_TYPE_BUY;
   request.price  = SymbolInfoDouble(symbol, SYMBOL_ASK);
   request.action = TRADE_ACTION_DEAL;
   request.symbol = symbol;
   request.volume = PositionGetDouble(POSITION_VOLUME);
   request.sl = 0.0;
   request.tp = 0.0;
   request.deviation  = (deviation == ULONG_MAX) ? deviation : deviation;
   request.type_filling = ORDER_FILLING_AON;
   //---
   string word = "";
   StringConcatenate(word, 
      "<<< ============ SellPositionClose():   Закрываем Sell позицию по ",
                                                       symbol, " ============ >>>");
   Print(word);
   return(true);
  } 
 
UUT:

Товарищи, посмотрите пожалуйста, какой-то принципиальный момент упущен. Советник не открывает сделки ни по одной из валют. Я своей ошибки не вижу, рассчитываю на вашу помощь. Мне кажется тут для профи пару минут, я уже второй день втыкаюсь. Пользовался статьями, но так и не увидел допущенной ошибки

Код советника:

Поменяйте

input int Slippage=0;

на что то более приемлемое, например размер спреда, а для заданного извне попробуйте 50.

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
Urain:

Поменяйте

на что то более приемлемое, например размер спреда, а для заданного извне попробуйте 50.

Я не понял. Поясните пожалуйста, slippage=0 потому что...

Slippage - это проскальзывание. Оно надо в случаях, когда нам позарез нужно открыть с делку в данный момент времени по цене около какого-то значения. В этом случае жертвуют частью прибыли, чтобы выиграть время.

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

 

 

У Вас в коде совершенно нет проверок на ошибки. За Вас это вряд ли кто сделает, чтобы определить проблемную зону.

 
Yedelkin:

У Вас в коде совершенно нет проверок на ошибки. За Вас это вряд ли кто сделает, чтобы определить проблемную зону.

Дело в том, что как в MQL4 через принты сделал, посмотрите процедуры,

 bool SellPositionOpen(const string symbol,ulong deviation,double volume

 пишет принты, что открывает сделки, т.е. заходит в  процедуру,а реально(в тестере) не открывает.

Я здесь не за халявой, реально на месте стою, не могу понять где ошибка. 

 
UUT:

Дело в том, что как в MQL4 через принты сделал, посмотрите процедуры,

 пишет принты, что открывает сделки, т.е. заходит в  процедуру,а реально(в тестере) не открывает.

Я здесь не за халявой, реально на месте стою, не могу понять где ошибка. 

Ещё раз. У Вас в коде совершенно нет проверок на ошибки. Ваш код я смотрел. "Print(word)" - это не проверка на ошибки. Ошибки в MQL5 проверяются с помощью конструкции ResetLastError() - GetLastError(), например:

   ResetLastError();
   filehandle=FileOpen("fractals.csv",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(),PERIOD_CURRENT);
      FileClose(filehandle);
      Print("FileOpen OK");
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());

 

UUT:

 пишет принты, что открывает сделки, т.е. заходит в  процедуру,а реально(в тестере) не открывает.

Первоначально про тестер вообще разговора не шло. Где у Вас фактически "открывает сделки", а где - "не открывает"?
 
UUT:

Товарищи, посмотрите пожалуйста, какой-то принципиальный момент упущен. Советник не открывает сделки ни по одной из валют. Я своей ошибки не вижу, рассчитываю на вашу помощь. Мне кажется тут для профи пару минут, я уже второй день втыкаюсь. Пользовался статьями, но так и не увидел допущенной ошибки

Код советника:

Вообще-то, структуры торгового запроса и результата торгового запроса надо бы обнулить после объявления!

//--- Объявление структур торгового запроса и результата торгового запроса
   MqlTradeRequest request;
   MqlTradeResult result;

//---- обнуление структур
   ZeroMemory(request);
   ZeroMemory(result);

 А так эксперт точно торговать не будет!

Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура результата торгового запроса - Документация по MQL5
 
GODZILLA:

Вообще-то, структуры торгового запроса и результата торгового запроса надо бы обнулить после объявления!

 А так эксперт точно торговать не будет!

Спасибо, за конкретное замечание! Я почитаю по этому поводу, не до конца разобрался.
 
Вообще-то, код просто изобилует ошибками и несуразицами.

 
UUT:
Спасибо, за конкретное замечание! Я почитаю по этому поводу, не до конца разобрался.
А еще лучше, используйте стандартную библиотеку, меньше потенциальных ошибок будет.
https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade
Правда она на ООП, но вам его необязательно полностью знать, достаточно уметь создавать объект и вызывать методы.
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade
  • www.mql5.com
Стандартная библиотека / Торговые классы / CTrade - Документация по MQL5
 
Valmars:
Вообще-то, код просто изобилует ошибками и несуразицами.

Если есть время и желание, укажите на них.
Причина обращения: