Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 81

 
oldiol: Я пишу в коде: if(!m_Trade.PositionClose(_Symbol,100))//--- закрываем позицию по текущему символу. Результат - позиция переворачивается! Буду очень благодарен за подсказку, как же мне закрыть позицию?
Позиция переворачивается потому, что программа отправляет на сервер два идентичных запроса. Программа же отправляет на сервер два идентичных запроса потому, что её код не предусматривает проверку на наличие ранее отправленного запроса (а также не предусматривает проверку результата обработки этого запроса на сервере).
 
Yedelkin:
Позиция переворачивается потому, что программа отправляет на сервер два идентичных запроса. Программа же отправляет на сервер два идентичных запроса потому, что её код не предусматривает проверку на наличие ранее отправленного запроса (а также не предусматривает проверку результата обработки этого запроса на сервере).
Очень прошу исправить мой код на правильный...
 

Yedelkin пишет: что её код не предусматривает проверку на наличие ранее отправленного запроса. Подскажите пожалуйста, какая функция делает эту проверку?

 
oldiol: Очень прошу исправить мой код на правильный...

У каждого - своё понимание правильности кода. Поэтому "правильный" код придётся в итоге писать Вам. А в качестве ещё одной подсказки - попробуйте, работает ли вот такой код в нужном ключе (схематичное использование флага sentRequest):

bool sentRequest=false;  //задать на уровне глобальных переменных программы
...

   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      if(!sentRequest)
        {                           
         if(p_close1<buy_stop_level)
           {
            if(!m_Trade.PositionClose(_Symbol,100))
              Print("Метод PositionClose() потерпел неудачу. Код возврата=",m_Trade.ResultRetcode(),". Описание кода: ",m_Trade.ResultRetcodeDescription());
            else
               {
                Print("Метод PositionClose() выполнен успешно. Код возврата=",m_Trade.ResultRetcode()," (",m_Trade.ResultRetcodeDescription(),")");       
                sentRequest=true;
               }
            }  
         }
       else Print("Блок закрытия позиции: имеется POSITION_TYPE_BUY и ранее отосланный запрос на закрытие позиции");        
       }
    else 
      if(sentRequest) sentRequest=false;
 
Yedelkin:

У каждого - своё понимание правильности кода. Поэтому "правильный" код придётся в итоге писать Вам. А в качестве ещё одной подсказки - попробуйте, работает ли вот такой код в нужном ключе (схематичное использование флага sentRequest):

Огромное спасибо! Пробую...

 

Результат следующий: код исправно закрывает длинную позицию и не открывает короткую... Но! При повторном открытии лонга, эксперт не закрывает больше позу по условию. В окне эксперта всё время идут сообщения:   

Как же использовать этот код в теле эксперта, если он работает только 1 раз)? 

 

oldiol: При повторном открытии лонга, эксперт не закрывает больше позу по условию. В окне эксперта всё время идут сообщения:    Как же использовать этот код в теле эксперта, если он работает только 1 раз)?

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

 

Ура! Заработало))) Убрал     еlse   if(sentRequest) sentRequest=false; И написал перед блоком     if(PositionsTotal()==0) sentRequest=false;  Выражаю большую благодарность Yedelkin за помощь, УСПЕХОВ ВАМ!

 
oldiolУбрал   еlse   if(sentRequest) sentRequest=false; И написал перед блоком     if(PositionsTotal()==0) sentRequest=false; 
Т.е. в основном коде не было проверки на наличие позиции? Тогда добавлю, что позиция по конкретному символу выбирается при помощи функций PositionGetSymbol или PositionSelect.
 

oldiol: При повторном открытии лонга, эксперт не закрывает больше позу по условию. В окне эксперта всё время идут сообщения: Как же использовать этот код в теле эксперта, если он работает только 1 раз)?   Извиняюсь, моя ошибка... В коде есть ещё одно условие   

  if(PositionSelect(_Symbol)==true) // есть открытая позиция
     { 

 БЛОК ЗАКРЫТИЯ ПОЗИЦИИ 

          } // ... поэтому     

   еlse if(sentRequest) sentRequest=false;//  разместил за следующей скобкой и всё ОТЛИЧНО работает. Yedelkin СПАСИБО!