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

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

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

Yedelkin
4193
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;
oldiol
16
oldiol  
Yedelkin:

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

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

 

oldiol
16
oldiol  

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

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

Yedelkin
4193
Yedelkin  

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

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

oldiol
16
oldiol  

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

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

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

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

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

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

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