초보자의 질문 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 플래그의 도식적 사용).

정말 감사합니다! 노력하고있어...

 

결과는 다음과 같습니다. 코드는 롱 포지션을 올바르게 닫고 숏 포지션을 열지 않습니다... 하지만! 롱 포지션을 재개설할 때 전문가는 조건에 따라 더 이상 포지션을 청산하지 않습니다. 전문가 창에는 항상 다음과 같은 메시지가 있습니다.

한 번만 작동하는 경우 Expert Advisor의 본문에서 이 코드를 사용하는 방법)?

 

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

이 문제에서 모든 것이 매우 간단해야 합니다. 도식 코드에서 오픈 포지션 이 매수 포지션이 아닌 경우 sentRequest 플래그는 0으로 설정되어야 합니다(코드의 마지막 라인). 오픈 포지션이 없거나 오픈 포지션 이 매수 포지션이 아닌 경우 코드 내의 이 플래그가 재설정되지 않는 이유를 확인하십시오.

 

만세! 획득))) 제거됨 lse if(sentRequest) sentRequest= false ; 그리고 블록 전에 썼습니다. if( PositionsTotal()==0 ) sentRequest=false; 나는 당신의 도움에 대해 Yedelkin에게 깊은 감사를 표합니다. SUCCESS TO YOU!

 
oldiol : 제거됨 lse if(sentRequest) sentRequest= false ; 그리고 블록 전에 썼습니다. if(PositionsTotal()==0) sentRequest=false;
저것들. 주 코드에서 위치의 존재에 대한 검사가 없었습니까? 그런 다음 특정 기호의 위치가 PositionGetSymbol 또는 PositionSelect 함수를 사용하여 선택되었음을 추가합니다.
 

oldiol : 롱 포지션을 다시 열 때 EA는 더 이상 해당 포지션을 조건부로 청산하지 않습니다. 전문가 창에는 항상 메시지가 있습니다. 한 번만 작동하는 경우 전문가 본문에서 이 코드를 사용하는 방법)? 죄송합니다, 제 실수입니다... 코드에 조건이 하나 더 있습니다.

if(PositionSelect(_Symbol)==true) // 열린 위치 가 있습니다.
{

포지션 클로징 블록

} // ... 그렇기 때문에

e lse if(sentRequest) sentRequest= false ;// 다음 괄호 뒤에 배치되고 모든 것이 훌륭하게 작동합니다. 예델킨 감사합니다!

사유: