mql4 Нет закрытия

 

Здравствуйте. Тестирую советник на демо. Сделки открывает, но не закрывает. Может где ошибка?

//+------------------------------------------------------------------+
//|                                           Mirage KanalPoints.mq4 |
//|                                                         Mr. Gold |
//|                                         anna.furmanova@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Mr. Gold"
#property link      "anna.furmanova@yandex.ru"
#property version   "1.00"
#property strict

#define magic 888

extern string Kanal      = " Параметры Kanal ";
extern int BarsCount     = 500;
extern int MA_Period     = 55;
extern int MA_Shift      = 0;
extern int MA_Method     = 0;
extern int Applied_Price = 0;
extern int fontsize      = 7;
extern double Deviation  = 0.8;

extern string XPoints    = " Параметры XPoints ";
extern int per           = 3;
extern double xrate      = 1.5;
extern double xsize      = 5.0;
extern double xslope     = 0.0;
extern double xminupdn   = 10.0;
extern int xhour1        = 9;
extern int xhour2        = 19;
extern int xindent       = 15;

extern string Parametr   = " Параметры советника ";
extern double Risk       = 5.0; // процент риска для депозита
extern double Lot        = 0.01;
extern int Magic         = 888;
extern bool Clock        = true;
extern int TestingMode   = 1;

static int PreBars=0;
static int DT=0;

static int prevtime=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string CurDay()
  {
   string CurDay;
   switch(DayOfWeek())
     {
      case 0: CurDay = "Вс";break;
      case 1: CurDay = "Пн";break;
      case 2: CurDay = "Вт";break;
      case 3: CurDay = "Ср";break;
      case 4: CurDay = "Чт";break;
      case 5: CurDay = "Пт";break;
      case 6: CurDay = "Сб";break;
     }
   return(CurDay);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int i,tiket;

   double LOT=WorkingLot(Risk,Lot);
   LOT=NormalizeDouble(LOT,2);

   if(TestingMode>0)
     {
      if(TestingMode==1)
        {
         if(Bars == PreBars) return(0);
         else PreBars=Bars;
           } else {
         if(Bars!=PreBars)
           {
            DT=0;
            PreBars=Bars;
           }
         if(TimeCurrent() < Time[0]+DT) return(0);
         else DT=DT+Period()*60/TestingMode;
        }
     }
   if(Clock) ObjectSetText("Clock",TimeToStr(TimeCurrent(),TIME_MINUTES)+", "+CurDay(),20,"Tahoma",Maroon);
// можно менять на ходу 
   if(GlobalVariableCheck("g_TestingMode")==true)
      TestingMode=GlobalVariableGet("g_TestingMode");

   double Val_0=iCustom(Symbol(),0,"Kanal",BarsCount,MA_Period,MA_Shift,MA_Method,Applied_Price,fontsize,Deviation,0,0);
   double Val_1=iCustom(Symbol(),0,"Kanal",BarsCount,MA_Period,MA_Shift,MA_Method,Applied_Price,fontsize,Deviation,1,0);
   double Val_2=iCustom(Symbol(),0,"Kanal",BarsCount,MA_Period,MA_Shift,MA_Method,Applied_Price,fontsize,Deviation,2,0);

   double X0=iCustom(Symbol(),0,"XPoints",per,xrate,xsize,xslope,xminupdn,xhour1,xhour2,xindent,0,0);
   double X1=iCustom(Symbol(),0,"XPoints",per,xrate,xsize,xslope,xminupdn,xhour1,xhour2,xindent,1,0);
   double X2=iCustom(Symbol(),0,"XPoints",per,xrate,xsize,xslope,xminupdn,xhour1,xhour2,xindent,2,0);
   double X3=iCustom(Symbol(),0,"XPoints",per,xrate,xsize,xslope,xminupdn,xhour1,xhour2,xindent,3,0);
   double X4=iCustom(Symbol(),0,"XPoints",per,xrate,xsize,xslope,xminupdn,xhour1,xhour2,xindent,4,0);



//BUY===================================== 
   bool Open_Buy=(Val_1>X0 && X0>X2);
   bool Close_Buy=(Val_0<X1 && X1<X3);
   bool Open_SELL=(Val_0<X1 && X1<X3);
   bool Close_SELL=(Val_1>X0 && X0>X2);

      if(Open_Buy && !Close_Buy)
        {
         tiket=OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,Digits),3,0,0,"",Magic,0,clrNONE);
         if(tiket<0) { Print("Ошибка при выборе ордера BUY #",GetLastError());}
         PlaySound("alert.wav");
        }

   if(Close_Buy)
     {
      for(i=OrdersTotal()-1;i>=0;i--)
        {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
           {
            if(OrderSymbol()==Symbol())
              {
               if(OrderType()==OP_BUY)
                 {
                  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,Violet);
                  PlaySound("ok.wav");
                 }
              }
           }
        }
     }
//SELL================================

      if(Open_SELL && !Close_SELL)
        {
         tiket=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),3,0,0,"",Magic,0,clrNONE);
         if(tiket<0) { Print("Ошибка при выборе ордера SELL #",GetLastError());}
         PlaySound("alert.wav");
        }

   if(Close_SELL)
     {
      for(i=OrdersTotal()-1;i>=0;i--)
        {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
           {
            if(OrderSymbol()==Symbol())
              {
               if(OrderType()==OP_SELL)
                 {
                  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,Violet);
                  PlaySound("ok.wav");
                 }
              }
           }
        }
     }

   return(0);
  }
//+------------------------------------------------------------------+
/*
risk - процент риска
lots - если risk = 0, то лот будет равен lots
*/
double WorkingLot(double risk,double lots)
  {
   double Lots;
   double Free    = AccountFreeMargin();
   double One_Lot = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
   double Stepx   = MarketInfo(Symbol(),MODE_LOTSTEP);
   double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT);
   double Max_Lot = MarketInfo(Symbol(),MODE_MAXLOT);

   if(risk>0)
     {
      Lots=MathFloor(Free*risk/100/One_Lot/Stepx)*Stepx;
      if(Lots<Min_Lot) Lots=Min_Lot;
      if(Lots>Max_Lot) Lots=Max_Lot;
      //  return (Lots);
     }
   if(risk==0)
     {
      Lots=lots;
      if(Lots<Min_Lot) Lots=Min_Lot;
      if(Lots>Max_Lot) Lots=Max_Lot;
     }
//  ==========  наличие свободных денег для открытия ордеров   ===============
   if((Lots)*One_Lot>AccountFreeMargin())
     {
      Print("Нет свободных средств для открытия ордера");
      return(0);
     }
   return (Lots);
  }
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Возвращает количество позиций.                                            |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sym="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
 
  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sym) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }
        }
      }
    }
  }
  return(kp);
}
 
Anna_89:

Здравствуйте. Тестирую советник на демо. Сделки открывает, но не закрывает. Может где ошибка?

Вот это допишите, также,  как у Вас сделано с открытием ордера и посмотрите - что за ошибку выдает при закрытии:

tiket=OrderClose.............

if(tiket<0) { Print("Ошибка при закрытии ордера #",GetLastError());}

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

Причина обращения: