Множественное открытие ордеров одновременно MQL5 - страница 2

 
Alexey Loginov:

Это оператор, завершающий выполнение метода, в котором он присутствует и возвращающий некое типизированное значение; в данном случае return пустой, а значит возвращает только инфу о том, что метод должен прекратить работу. Так что нет разницы, куда будет возвращено значение.

@Evgeniy Zhdan, возможно, косяк только в том, что вы ошиблись с определением условий в конструкциях if. Попробуйте через Print() выводить все действия в лог, чтобы задетектить ошибку. Потом лог зальете сюда, и там посмотрим. 

Это может занять неделю-две. Ибо советник работал 10 дней нормально и понеслось. Техподдержка Альпари говорит что твой советник столько и подавал запросов на открытие ордеров. На скрине Эксперты вроде это подтверждается. Вот и думаю, что за фигня. 

 
Alexey Loginov:

Это оператор, завершающий выполнение метода, в котором он присутствует, и возвращающий некое типизированное значение; в данном случае return пустой, а значит возвращает только инфу о том, что метод должен прекратить работу. Так что нет разницы, куда будет возвращено значение.

@Evgeniy Zhdan, возможно, косяк только в том, что вы ошиблись с определением условий в конструкциях if. Попробуйте через Print() выводить все действия в лог, чтобы задетектить ошибку. Потом лог зальете сюда, и там посмотрим. 

имею в виду,что нужна часть кода с которой мы начинаем после return

 
Nikolay Gaylis:

имею в виду,что нужна часть кода с которой мы начинаем после return

Очевидно, что это следующий метод, ожидающий выполнения. Однако возникает справедливый вопрос, а зачем он нам? Хм, хотя возможно, что следующий из очереди метод вызывает тот метод, кусок кода которого мы сейчас обсуждаем. Но, судя по этому сообщению:

Evgeniy Zhdan:

Как я понимаю, в начало OnTick()

 - , кусок кода вырван из OnTick(), а он вызывается платформой. Поэтому другого кода нам и не надо. 


Evgeniy Zhdan:

Это может занять неделю-две. Ибо советник работал 10 дней нормально и понеслось. Техподдержка Альпари говорит что твой советник столько и подавал запросов на открытие ордеров. На скрине Эксперты вроде это подтверждается. Вот и думаю, что за фигня. 

Мда, печально. С кодом сейчас попробуем разобраться. Но я бы на всякий случай задебажил. 

 
if(CalculatePositions()==0&&!trade.Sell(Lot,_Symbol,lastBid,sl,tp,"")) -верно!

Мои мозги дальше решения Nikolay Gaylis не двигаются. Везде все ОК, кроме этого момента.

 
Alexey Loginov:

Мои мозги дальше решения Nikolay Gaylis не двигаются. Везде все ОК, кроме этого момента.

Да их вообще разнести нужно по хорошему.

//продажа
if(!CalculatePositions() && _price[candle]<_loverBand[candle] && _price[candle+1]>_loverBand[candle+1])
{
   double sl =  lastBid + _atr[0]*2;
   double tp =  lastBid - _atr[0]*2;
   sl = NormalizeDouble(sl,_Digits);
   tp = NormalizeDouble(tp,_Digits);

   if(!trade.Sell(Lot,_Symbol,lastBid,sl,tp,""))
   {
      Print("Метод Sell() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            //if(!trade.Sell(Lot,_Symbol,lastBid,0,0,"")) Print("Метод Sell() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription(),"; sl: ",sl,"; tp: ",tp);
            return;
   }
   else
   {
      Print("Метод Sell() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
            return;
   }
}
 

Alexey Valeev, нужно? А зачем? Какая разница между этим

if(!CalculatePositions() && _price[candle]<_loverBand[candle] && _price[candle+1]>_loverBand[candle+1])
{
        if(!trade.Sell(Lot,_Symbol,lastBid,sl,tp,""))
        {

и этим?

if(_price[candle]<_loverBand[candle] && _price[candle+1]>_loverBand[candle+1])
{
        if(CalculatePositions()==0 && !trade.Sell(Lot,_Symbol,lastBid,sl,tp,"")) 
        {
 
Evgeniy Zhdan:

Всем привет. Появилась проблема. Возникает не часто, но бывает. Советник открывает  множество позиций, тогда как должа быть только одна.

Сделайте так:

     //покупка
      if(CalculatePositions()==0 &&time()==true)
        {
         if(_price[candle]>_upperBand[candle] && _price[candle+1]<_upperBand[candle+1])
           {
            double sl = lastAsk - _atr[0]*2;
            double tp = lastAsk + _atr[0]*2;

            sl = NormalizeDouble(sl,_Digits);
            tp = NormalizeDouble(tp,_Digits);

            if(!trade.Buy(Lot,_Symbol,lastAsk,sl,tp,""))
              {
               Print("Метод Buy() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
                     // if(!trade.Buy(Lot,_Symbol,lastAsk,0,0,"")) Print("Метод Buy() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
                     ". Описание кода: ",trade.ResultRetcodeDescription(),"; sl: ",sl,"; tp: ",tp);
                     return;
              }
            else
              {
               Print("Метод Buy() выполнен успешно. Код возврата=",trade.ResultRetcode(),
                     " (",trade.ResultRetcodeDescription(),")");
                     return;
              }
           }
         //продажа
         if(_price[candle]<_loverBand[candle] && _price[candle+1]>_loverBand[candle+1])
           {
            double sl =  lastBid + _atr[0]*2;
            double tp =  lastBid - _atr[0]*2;
            sl = NormalizeDouble(sl,_Digits);
            tp = NormalizeDouble(tp,_Digits);

            if(!trade.Sell(Lot,_Symbol,lastBid,sl,tp,""))
              {
               Print("Метод Sell() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
                     //if(!trade.Sell(Lot,_Symbol,lastBid,0,0,"")) Print("Метод Sell() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
                     ". Описание кода: ",trade.ResultRetcodeDescription(),"; sl: ",sl,"; tp: ",tp);
                     return;
              }
            else
              {
               Print("Метод Sell() выполнен успешно. Код возврата=",trade.ResultRetcode(),
                     " (",trade.ResultRetcodeDescription(),")");
                     return;
              }
           }
        }

int CalculatePositions()
  {
   int count=0;

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==_Symbol && m_position.Magic()==MagicNumber)
           {
            count++;
           }
   return(count);
  }
 
Alexey Loginov:

Alexey Valeev, нужно? А зачем? Какая разница между этим

и этим?

Будет писать Лог неверно, если есть позиции.

Print("Метод Sell() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
                     //if(!trade.Sell(Lot,_Symbol,lastBid,0,0,"")) Print("Метод Sell() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
                     ". Описание кода: ",trade.ResultRetcodeDescription(),"; sl: ",sl,"; tp: ",tp);
                     return;
 
Alexey Valeev:

Будет писать Лог неверно, если есть позиции.

Действительно. Понял, спасибо. 

 
Vladimir M.:

Сделайте так:

А изнчально так:

   if(CalculatePositions()==0)
     {
      double lastBid=0;
      double lastAsk=0;
      if(SymbolInfoTick(Symbol(),last_tick))
        {
         lastBid=last_tick.bid;
         lastAsk=last_tick.ask;
        }
      //покупка
      if(time()==true)
        {
         if(_price[candle]>_upperBand[candle] && _price[candle+1]<_upperBand[candle+1])
           {
            double sl = lastAsk - _atr[0]*2;
            double tp = + lastAsk + _atr[0]*2;

            sl = NormalizeDouble(sl,_Digits);
            tp = NormalizeDouble(tp,_Digits);

            if(!trade.Buy(Lot,_Symbol,lastAsk,sl,tp,"") && CalculatePositions()==0)
              {
               Print("Метод Buy() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
                     // if(!trade.Buy(Lot,_Symbol,lastAsk,0,0,"")) Print("Метод Buy() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
                     ". Описание кода: ",trade.ResultRetcodeDescription(),"; sl: ",sl,"; tp: ",tp);
                     return;
              }
            else
              {
               Print("Метод Buy() выполнен успешно. Код возврата=",trade.ResultRetcode(),
                     " (",trade.ResultRetcodeDescription(),")");
                     return;
              }
           }
         //продажа
         if(_price[candle]<_loverBand[candle] && _price[candle+1]>_loverBand[candle+1])
           {
            double sl =  lastBid + _atr[0]*2;
            double tp =  lastBid - _atr[0]*2;
            sl = NormalizeDouble(sl,_Digits);
            tp = NormalizeDouble(tp,_Digits);

            if(!trade.Sell(Lot,_Symbol,lastBid,sl,tp,"") && CalculatePositions()==0)
              {
               Print("Метод Sell() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
                     //if(!trade.Sell(Lot,_Symbol,lastBid,0,0,"")) Print("Метод Sell() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
                     ". Описание кода: ",trade.ResultRetcodeDescription(),"; sl: ",sl,"; tp: ",tp);
                     return;
              }
            else
              {
               Print("Метод Sell() выполнен успешно. Код возврата=",trade.ResultRetcode(),
                     " (",trade.ResultRetcodeDescription(),")");
                     return;
              }
           }
        }
     }

Тут не ясно, почему после октрытия позиции, код лезет выполняться опять внутрь этого:

if(CalculatePositions()==0)
{
        Вот сюда лезет, когда позиция уже есть
}
Причина обращения: