Вместо закрытия позы идет открытие

 

Здравствуйте 

 В советнике есть строки

 if(!mag(1))
          BUY(1,0.1);

   if(PositionProfit(1)<-3)
      if(!mag(2))
         BUY(2,0.1);

   if(PositionProfit(2)<-3)
      if(!mag(3))
         BUY(3,0.1);



   if(PositionProfit(1)+PositionProfit(2)+PositionProfit(3)>5);
     {

      mPositionClose(1);
      mPositionClose(2);
      mPositionClose(3);

     }
 

Почему то вместо закрытия идет открытие позиции .

Тут  описаны функции советника . 

 

//+------------------------------------------------------------------+
//|                                                     myscript.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+



void mPositionClose(int Magic)
  {
   CTrade mtrade;
   CPositionInfo pos;
   int total=PositionsTotal();
   for(int i=0; i<total; i++)
     {
      if(!pos.SelectByIndex(i))continue;
      if(pos.Magic()!=Magic)continue;
      if(pos.Symbol()!=_Symbol)continue;

      mtrade.PositionClose(pos.Identifier());

     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void BUY(int magick,double volume)
  {

   MqlTick last_tick={0};
   SymbolInfoTick(_Symbol,last_tick);

//--- готовим запрос 
   MqlTradeRequest request={0};
   request.action=TRADE_ACTION_DEAL;            // установка отложенного ордера 
   request.magic=magick;                           // ORDER_MAGIC 
                                                   // request.order=2111;                          // Тикет ордера 

   request.symbol=_Symbol;                      // инструмент 
   request.volume=volume;                          // объем в 0.1 лот 
   request.sl=0;                                // Stop Loss не указан 
   request.tp=0;                                // Take Profit не указан    
//--- сформируем тип ордера 
   request.type=ORDER_TYPE_BUY;                 // тип ордера 
//---сформируем цену для отложенного ордера 
   request.price=last_tick.bid; // оттолкнемся от цены Bid 
                                // цена для открытия 
//--- отправим торговый приказ 
   MqlTradeResult result={0};
   OrderSend(request,result);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double PositionProfit(int Magic)
  {
   CTrade trade;
   CPositionInfo pos;
   double prof;
   prof=0;
   int total=PositionsTotal();
   for(int i=0; i<total; i++)
     {
      if(!pos.SelectByIndex(i))continue;
      if(pos.Magic()!=Magic)continue;
      if(pos.Symbol()!=_Symbol)continue;
      // if(pos.Profit()>=Profit)
      //  {
      //    trade.PositionClose(pos.Identifier());
      //   }
      prof=pos.Profit();
     }
   return prof;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool mag(int Magic)
  {
   CTrade trade;
   CPositionInfo pos;
   bool m;
   m=false;
   int total=PositionsTotal();
   for(int i=0; i<total; i++)
     {
      if(!pos.SelectByIndex(i))continue;
      if(pos.Magic()!=Magic)continue;
      if(pos.Symbol()!=_Symbol)continue;
      m=true;
     }
   return m;
  }
//+------------------------------------------------------------------+
//| Возвращает true, если появился новый бар для пары символ/период  |
//+------------------------------------------------------------------+
 
bool isNewBar()
  {
//--- в статической переменной будем помнить время открытия последнего бара
   static datetime last_time=0;
//--- текущее время
   datetime lastbar_time=SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установим время и выйдем 
      last_time=lastbar_time;
      return(false);
     }

//--- если время отличается
   if(last_time!=lastbar_time)
     {
      //--- запомним время и вернем true
      last_time=lastbar_time;
      return(true);
     }
//--- дошли до этого места - значит бар не новый, вернем false
   return(false);
  }
//+------------------------------------------------------------------+
//| ПРОВЕРКА НОВОГО БАРА                                             |
//+------------------------------------------------------------------+
bool CheckNewBar()
  {
//--- Переменная для времени открытия текущего бара
   static datetime new_bar=NULL;
//--- Массив для получения времени открытия текущего бара
   static datetime time_last_bar[1]={0};
//--- Получим время открытия текущего бара
//    Если возникла ошибка при получении, сообщим об этом
   if(CopyTime(_Symbol,Period(),0,1,time_last_bar)==-1)
     { Print(__FUNCTION__,": Ошибка копирования времени открытия бара: "+IntegerToString(GetLastError())+""); }
//--- Если это первый вызов функции
   if(new_bar==NULL)
     {
      // Установим время
      new_bar=time_last_bar[0];
      Print(__FUNCTION__,": Инициализация ["+_Symbol+"][TF: "+TimeframeToString(Period())+"]["
            +TimeToString(time_last_bar[0],TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"]");
      return(false); // Вернём false и выйдем 
     }
//--- Если время отличается
   if(new_bar!=time_last_bar[0])
     {
      new_bar=time_last_bar[0]; // Установим время и выйдем 
      return(true); // Запомним время и вернем true
     }
//--- Дошли до этого места - значит бар не новый, вернем false
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string TimeframeToString(ENUM_TIMEFRAMES timeframe)
  {
   string str="";
//--- Если переданное значение некорректно, берем таймфрейм текущего графика
   if(timeframe==WRONG_VALUE|| timeframe== NULL)
      timeframe= Period();
   switch(timeframe)
     {
      case PERIOD_M1  : str="M1";  break;
      case PERIOD_M2  : str="M2";  break;
      case PERIOD_M3  : str="M3";  break;
      case PERIOD_M4  : str="M4";  break;
      case PERIOD_M5  : str="M5";  break;
      case PERIOD_M6  : str="M6";  break;
      case PERIOD_M10 : str="M10"; break;
      case PERIOD_M12 : str="M12"; break;
      case PERIOD_M15 : str="M15"; break;
      case PERIOD_M20 : str="M20"; break;
      case PERIOD_M30 : str="M30"; break;
      case PERIOD_H1  : str="H1";  break;
      case PERIOD_H2  : str="H2";  break;
      case PERIOD_H3  : str="H3";  break;
      case PERIOD_H4  : str="H4";  break;
      case PERIOD_H6  : str="H6";  break;
      case PERIOD_H8  : str="H8";  break;
      case PERIOD_H12 : str="H12"; break;
      case PERIOD_D1  : str="D1";  break;
      case PERIOD_W1  : str="W1";  break;
      case PERIOD_MN1 : str="MN1"; break;
     }
//---
   return(str);
  }
//+------------------------------------------------------------------+
Файлы:
expert-my.mq5  9 kb
 
На mql4 такая конструкция работает нормально.
 

Народ , кто разобрался с закрытием поз ?

Или торгуете не закрывая :)))

 
stark2004:

Народ , кто разобрался с закрытием поз ?

Или торгуете не закрывая :)))

E У вас явно с логикой совы что-то не то. И не указано на каком типе счета запускаете неттинг или хедж
 

Сергей привет.

Мне нужно закрыть позу , вызвав функцию

 mPositionClose(int Magic)

Вместо этого идет массовое открытие поз на каждом баре.


void mPositionClose(int Magic)
  {
   CTrade mtrade;
   CPositionInfo pos;
   int total=PositionsTotal();
   for(int i=0; i<total; i++)
     {
      if(!pos.SelectByIndex(i))continue;
      if(pos.Magic()!=Magic)continue;
      if(pos.Symbol()!=_Symbol)continue;

      mtrade.PositionClose(pos.Identifier());

     }
  }

Это похоже на автомобиль ,у которого нажатие на тормоз вызывает  ,

вместо остановки   ускорение .

То есть в машине две педали ГАЗ .

Одна замаскирована под тормоз.





 
 



 Успешное нажатие на педаль тормоза не всегда означает успешное торможение.

Необходимо убедится , что ВЫ не врубились в препятсвие , проверкой автомобиля не целостность .




 
Sergey Gritsay:
E У вас явно с логикой совы что-то не то. И не указано на каком типе счета запускаете неттинг или хедж

    Счет хеджевый в Альпари. Открывался  осознанно. Ставил галку при открытии счета , что мне нужен хедж.

 Логика такая , что при вызове

 mtrade.PositionClose(pos.Identifier());

я ожидаю закрытие позы.

 
 Там ,  у них такие же проблемы https://www.mql5.com/en/forum/3648
How to close BUY and SELL position?
How to close BUY and SELL position?
  • отзывов: 7
  • www.mql5.com
I have EA that trades every day once or twice.
 
stark2004:



 Успешное нажатие на педаль тормоза не всегда означает успешное торможение.

Необходимо убедится , что ВЫ не врубились в препятсвие , проверкой автомобиля не целостность .




 

    Счет хеджевый в Альпари. Открывался  осознанно. Ставил галку при открытии счета , что мне нужен хедж.

 Логика такая , что при вызове

я ожидаю закрытие позы.

Похоже, что вы цитируете справку, а сами её не читаете. Для закрытия позиции по номеру на хеджевом счете используется метод PositionCloseByTicket, а у вас в коде - PositionClose(pos.Identifier()) - здесь даже тип параметра не совпадает - должна быть строка с именем символа.
 
Станислав спасибо . Действительно не вник в суть написанного.
Причина обращения: