Вместо закрытия позы идет открытие - страница 4

 

Почему-то не закрывает

//+------------------------------------------------------------------+
//|                                                    expert-my.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#include<Trade\Trade.mqh>
#include<Trade\PositionInfo.mqh>
 

static datetime last_time=0;
 
CTrade  myTrade;
CPositionInfo myPositionInfo;

datetime counted_bar=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   counted_bar=0; // если нужно, чтоб при перезапуске последний бар был проанализирован
   CheckNewBar();
//---
   return(INIT_SUCCEEDED);
  }
 
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---



 
   if(!isNewBar())
     {
      return;
     }
     
    
     

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

 
  

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

  
  

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

      mPositionClose2(1);  
      mPositionClose2(2);   
      mPositionClose2(3);  

     }



  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//|                                                     myscript.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
void mPositionClose2(int Magic)
  {
  CTrade trade;
    long ticket_position_by_close=0;
     MqlTick tick;
   MqlTradeRequest request;
   MqlTradeResult tradeResult;
   MqlTradeCheckResult checkResult;

  
  
    for(int i=0;i<PositionsTotal();i++)
     {
      ResetLastError();
      if(PositionGetSymbol(i)==NULL)
        {
         Print("Error #",GetLastError());
         return;
        }
      long POSITION_ticket=PositionGetInteger(POSITION_MAGIC);
      if(POSITION_ticket==ticket_position_by_close)
        {
         trade.PositionClose(ticket_position_by_close);
         return;
        }
     }
  
  /*
  int mm ;
  ENUM_POSITION_TYPE ttype ;
  
   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;
        mm =   pos.Magic() ;
       ttype =  pos.PositionType() ; 
       
       
       
        request.action       = TRADE_ACTION_DEAL;
                  request.symbol       = Symbol();
                  request.volume       =  0.1 ;// getLot();
                //  request.deviation    = DEV;
                  request.type_filling = ORDER_FILLING_FOK;
                  request.type_time    = ORDER_TIME_GTC;
                  request.comment      = "";
                   request.type=ORDER_TYPE_SELL;                 // тип ордера 
               //   request.magic        = MAGIC_NUMBER;
               
 
       
      mtrade.PositionClose(pos.Identifier());

      }*/
  }


void mPositionClose(int Magic)
  {
  
     MqlTick tick;
   MqlTradeRequest request;
   MqlTradeResult tradeResult;
   MqlTradeCheckResult checkResult;

  
  int mm ;
  ENUM_POSITION_TYPE ttype ;
  
   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;
        mm =   pos.Magic() ;
       ttype =  pos.PositionType() ; 
       
       
       
        request.action       = TRADE_ACTION_DEAL;
                  request.symbol       = Symbol();
                  request.volume       =  0.1 ;// getLot();
                //  request.deviation    = DEV;
                  request.type_filling = ORDER_FILLING_FOK;
                  request.type_time    = ORDER_TIME_GTC;
                  request.comment      = "";
                   request.type=ORDER_TYPE_SELL;                 // тип ордера 
               //   request.magic        = MAGIC_NUMBER;
               
                Sleep(1000 ) ; 
               /*
                    if(OrderCheck(request,checkResult))
                    {
                     OrderSend(request,tradeResult);
                    }
                  else
                    {
                     Print("Error: ",checkResult.retcode);
                    }
       
       */
       //if (ttype ==  POSITION_TYPE_BUY ) 
       //{
       //}
       
       /*
                  request.action       = TRADE_ACTION_DEAL;
                  request.symbol       = Symbol();
                  request.volume       = getLot();
                  request.deviation    = DEV;
                  request.type_filling = ORDER_FILLING_FOK;
                  request.type_time    = ORDER_TIME_GTC;
                  request.comment      = "";
                  request.magic        = MAGIC_NUMBER;
                  if(OrderCheck(request,checkResult))
                    {
                     OrderSend(request,tradeResult);
                    }
                  else
                    {
                     Print("Error: ",checkResult.retcode);
                    }       
       */
       
      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);
  }
//+------------------------------------------------------------------+
 
samsuser3:

Почему-то не закрывает

Для начала исправьте все ошибки:

empty controlled statement found
variable 'tick' not used
possible loss of data due to type conversion
variable 'tick' not used
return value of 'OrderSend' should be checked
declaration of 'last_time' hides global declaration at line
possible loss of data due to type conversion
 
Karputov Vladimir:

Для начала исправьте все ошибки:

  ОК
 

 

 Убрал все лишнее.

//+------------------------------------------------------------------+
//|                                                    expert-my.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#include<Trade\Trade.mqh>
#include<Trade\PositionInfo.mqh>
 

static datetime last_time=0;
 
CTrade  myTrade;
CPositionInfo myPositionInfo;

datetime counted_bar=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
 
   return(INIT_SUCCEEDED);
  }
 
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 

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

 
  

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

  
  

   if(PositionProfit(1)+PositionProfit(2)+PositionProfit(3)>15) 
     {

      mPositionClose2(1);  
      mPositionClose2(2);   
      mPositionClose2(3);  

     }



  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//|                                                     myscript.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
void mPositionClose2(int Magic)
  {
  CTrade trade;
    long ticket_position_by_close=0;
   //  MqlTick tick;
   MqlTradeRequest request;
   MqlTradeResult tradeResult;
   MqlTradeCheckResult checkResult;

  
  
    for(int i=0;i<PositionsTotal();i++)
     {
      ResetLastError();
      if(PositionGetSymbol(i)==NULL)
        {
         Print("Error #",GetLastError());
         return;
        }
      long POSITION_ticket=PositionGetInteger(POSITION_MAGIC);
      if(POSITION_ticket==ticket_position_by_close)
        {
         trade.PositionClose(ticket_position_by_close);
         return;
        }
     }
  
 
  }


void mPositionClose(int Magic)
  {
  
   //  MqlTick tick;
   MqlTradeRequest request;
   MqlTradeResult tradeResult;
   MqlTradeCheckResult checkResult;

  
 // int mm ;
  ENUM_POSITION_TYPE ttype ;
  
   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;
          pos.Magic() ;
       ttype =  pos.PositionType() ; 
       
       
       
        request.action       = TRADE_ACTION_DEAL;
                  request.symbol       = Symbol();
                  request.volume       =  0.1 ;// getLot();
                //  request.deviation    = DEV;
                  request.type_filling = ORDER_FILLING_FOK;
                  request.type_time    = ORDER_TIME_GTC;
                  request.comment      = "";
                   request.type=ORDER_TYPE_SELL;                 // тип ордера 
               //   request.magic        = MAGIC_NUMBER;
               

       
      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};
   if (  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, если появился новый бар для пары символ/период  |
//+------------------------------------------------------------------+
 
 
 
 
 

В тестере нужно смотреть в Журнал. А там тьма ошибок:

2016.06.07 14:03:04.470 2016.02.03 11:36:27   requote 1.09094 / 1.09101 / 1.09094 (instant buy 0.10 EURUSD at 1.09094)
 

Что это?

void BUY(int magick,double volume)
  {
   MqlTick last_tick={0};
   SymbolInfoTick(_Symbol,last_tick);

//--- готовим запрос 

 

Должно быть

void BUY(int magick,double volume)
  {
   MqlTick last_tick;
   SymbolInfoTick(_Symbol,last_tick);

//--- готовим запрос 
 
 Попробовал  , все равно не закрывает
 MqlTick last_tick;
 
samsuser3:
 Попробовал  , все равно не закрывает

Что бы что-то закрыть, для начала нужно это "что-то" открыть. Позиция BUY открывается по цене ask, а не bid^

//--- сформируем тип ордера 
   request.type=ORDER_TYPE_BUY;                 // тип ордера 
//---сформируем цену для отложенного ордера 
   request.price=last_tick.ask; // оттолкнемся от цены Ask
                                // цена для открытия 
//--- отправим торговый приказ 
   MqlTradeResult result={0};
   if(OrderSend(request,result))
 

Если позицию выбираете по её Magic Number, то не забывайте получить тикет позиции - так как закрытие идёт по тикету:

void mPositionClose2(int Magic)
  {
   CTrade trade;
//  MqlTick tick;
   MqlTradeRequest request;
   MqlTradeResult tradeResult;
   MqlTradeCheckResult checkResult;

   for(int i=0;i<PositionsTotal();i++)
     {
      ResetLastError();
      if(PositionGetSymbol(i)==NULL)
        {
         Print("Error #",GetLastError());
         return;
        }
      long POSITION_magik=PositionGetInteger(POSITION_MAGIC);
      long POSITION_ticket=PositionGetInteger(POSITION_TICKET);
      if(POSITION_magik==Magic)
        {
         trade.PositionClose(POSITION_ticket);
         return;
        }
     }
  }
Файлы:
expert-my.mq5  7 kb
 

Опасная стратегия: если позиции в убытке, то они не закрываются.

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