초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 854

 
나는 CTrade::PositionClose (const ulong ticket, const ulong 편차=ULONG_MAX)를 만지작거리고 있는데 내부에서 잘 정리되어 있지 않다는 것을 알고 있습니다. bool 및 ResultRetcode()의 2가지 반환 코드에 관한 것입니다. RetCode는 false를 반환하기 전에 내부적으로 항상 0이 아니므로 PositionClose가 false로 평가되면 RetCode가 TRADE_RETCODE_DONE을 반환할 수 있습니다. 개발자는 이 2개의 반환 값을 어떻게 동기화할까요?
 
. ... Rick D. ... . :
나는 CTrade::PositionClose(const ulong ticket, const ulong deviation=ULONG_MAX)를 만지작거리고 있는데 내부가 잘 정리되어 있지 않다는 것을 이해합니다. bool 및 ResultRetcode()의 2가지 반환 코드에 관한 것입니다. RetCode는 false를 반환하기 전에 내부적으로 항상 0이 아니므로 PositionClose가 false로 평가되면 RetCode가 TRADE_RETCODE_DONE을 반환할 수 있습니다. 개발자는 이 2개의 반환 값을 어떻게 동기화할까요?

코드 + 예제 + 로그.

 
이상한 버그를 하나 발견했습니다. 어쩌면 나만.

COOrderInfo::OrderType()은 항상 0을 반환합니다.

확인을 위해 보류 중인 주문 (BuyStop, SellStop, ...)을 수동으로 배치할 수 있습니다.
그런 다음 스크립트에 티켓을 입력하십시오.
 #include <Trade\Trade.mqh>

COrderInfo m_order;

void OnStart ()
{
   ulong ticket = 250262937 ; //здесь ваш тикет
  
   if (!m_order.Select(ticket))
  {
     PrintFormat ( "COrderInfo::Select(#%I64u) failed" , ticket);
     return ;
  }
  
   PrintFormat ( "OrderType= %d" , m_order.Type());
}

아마도 가상 기능 테이블과 함께 뭔가? 디버깅에서는 가상 int CObject::Type()에만 들어갑니다.

추신. 나는 이미 그것을 스스로 알아 냈습니다. COrderInfo에는 Type() 및 OrderType()의 2가지 유사한 메서드가 있습니다.

 
Vladimir Karputov :

코드 + 예제 + 로그.

무슨 상황인지 보세요.

 #include <Trade\Trade.mqh>

CTrade m_trade;

void OnStart ()
{ 
   int LErr;
   bool bRC;
   double price;

   ResetLastError ();
  
  price = 0.0 ;
  bRC = m_trade.Buy( 0.1 , "EURUSD" , price, 0.0 , 0.0 );

  LErr = GetLastError ();

   PrintFormat ( "! Buy:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)" ,
    ticket,
    ( string )bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
   //В m_trade.ResultRetcode() теперь TRADE_RETCODE_DONE
  
   //---

   ulong ticket = 1 ; //Позиции с таким тикетом нет
  
   ResetLastError ();

  bRC = m_trade.PositionClose(ticket);  

  LErr = GetLastError ();
  
   PrintFormat ( "! Close #%I64u:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)" ,
    ticket,
    ( string )bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
   //В m_trade.ResultRetcode() все еще TRADE_RETCODE_DONE
}

CTrade 에서 SetResultRetcode 및 SetResultComment 메서드가 각각의 새 작업 전에 재설정하는 것을 볼 수 없습니다.

하나의 단일 메서드가 추가된 클래스를 상속해야 합니다.


 class CTradeEx : public CTrade
{
public :
   void SetResult( MqlTradeResult & result)
  {
    m_result = result;
  }  
};
 
. ... Rick D. ... . :

무슨 상황인지 보세요.

CTrade에서 SetResultRetcode 및 SetResultComment 메서드가 각각의 새 작업 전에 재설정하는 것을 볼 수 없습니다.

무엇 때문에? 완전히 불필요한 기능.

첫째: 당신은 공중에서 쏘고 - 첫 번째 확인 없이 거래 주문을 보냅니다 - 작업이 반환된 것을 확인하지 않고. 도움말 보기: PositionClose 는 bool 유형입니다.

두 번째: 위치 닫기 체인을 살펴봅니다. 위치를 찾을 수 없는 경우(지정된 티켓으로 선택할 수 없음) "거짓"이 반환됩니다.

 //+------------------------------------------------------------------+
//| Close specified opened position                                  |
//+------------------------------------------------------------------+
bool CTrade::PositionClose( const ulong ticket, const ulong deviation)
  {
//--- check stopped
   if ( IsStopped ( __FUNCTION__ ))
       return ( false );
//--- check position existence
   if (! PositionSelectByTicket (ticket))
       return ( false );
   string symbol= PositionGetString ( POSITION_SYMBOL );
//--- clean

동시에 구조는 아무데도 지워지지 않습니다. 이것은 의미가 없기 때문에 결국, 그 전에는 위치를 선택할 수 없었으므로 구조에 정보가 없습니다.

 
Vladimir Karputov :

무엇 때문에? 완전히 불필요한 기능.

첫째: 당신은 공중에서 쏘고 - 첫 번째 확인 없이 거래 주문을 보냅니다 - 작업이 반환된 것을 확인하지 않고. 도움말 보기: PositionClose 는 bool 유형입니다.

두 번째: 위치 닫기 체인을 살펴봅니다. 위치를 찾을 수 없는 경우(지정된 티켓으로 선택할 수 없음) "거짓"이 반환됩니다.

동시에 구조는 아무데도 지워지지 않습니다. 이것은 의미가 없기 때문에 결국, 그 전에는 위치를 선택할 수 없었으므로 구조에 정보가 없습니다.

1) 동일한 성공으로 ResetLastError()가 절대적으로 불필요한 함수라고 말할 수 있습니다.

2) 반환된 결과에 대한 확인이 있습니다. 유추하여 일부 WinAPI 함수를 호출하고 오류를 반환하고 GetLastError()(ResultRetcode와 유사)가 모든 마지막 코드를 반환한다고 상상해 보십시오.

PositionClose를 호출하기 전에 몇 가지 검사를 추가하면(하나를 추가할 것입니다) RetCode가 변경되지 않을 때 다른 호출 전에 다른 검사를 무시하지 않습니다.

My Expert Advisor는 로그에 정보를 기록합니다. 내가 필요한 것은 일부 호출이 false를 반환한 경우 정상적인 ResultRetcode 및 ResultComment를 로그에 작성하는 것입니다.

 
. ... Rick D. ... . :

1) 동일한 성공으로 ResetLastError()가 절대적으로 불필요한 함수라고 말할 수 있습니다.

2) 반환된 결과에 대한 확인이 있습니다. 유추하여 일부 WinAPI 함수를 호출하고 오류를 반환하고 GetLastError()(ResultRetcode와 유사)가 모든 마지막 코드를 반환한다고 상상해 보십시오.

PositionClose를 호출하기 전에 몇 가지 검사를 추가하면(하나를 추가할 것입니다) RetCode가 변경되지 않을 때 다른 호출 전에 다른 검사를 무시하지 않습니다.

My Expert Advisor는 로그에 정보를 기록합니다. 내가 필요한 것은 일부 호출이 false를 반환한 경우 정상적인 ResultRetcode 및 ResultComment를 로그에 작성하는 것입니다.

필요할 때 CTrade 클래스의 거래 작업에 대한 도움말을 읽으십시오.   ResultRetcode() 메서드 를 호출하여 거래 요청(거래 서버 반환 코드) 실행 결과를 확인합니다 .

 
Vladimir Karputov :

필요할 때 CTrade 클래스의 거래 작업에 대한 도움말을 읽으십시오.   ResultRetcode() 메서드 를 호출하여 거래 요청(거래 서버 반환 코드) 실행 결과를 확인합니다 .

라고 주장할 수 있습니다.

1) PositionClose가 false를 반환하면 Retcode가 채워지지 않습니까?

2) PositionClose가 true를 반환하면 Retcode가 항상 채워집니까?

 
Vladimir Karputov :

주문 -> 거래 -> 포지션. 위치에서 시작 가격 을 가져옵니다.

주문 -> 딜 -> 포지션과 같은 사진을 보여주시면 됩니다. 딜이 쓰여진 아래쪽에서 복사가 안되는 부분입니다.


 
Seric29 :

주문 -> 딜 -> 포지션과 같은 사진을 보여주시면 됩니다. 딜이 쓰여진 아래쪽에서 복사가 안되는 부분입니다.


질문을 다시 쓰거나 구두점을 표시하거나 더 나은 방법으로 사진에 무엇을, 어디에, 누구를 추가하십시오. 그렇지 않으면 익숙한 글자가 보이지만 그 의미와 생각을 이해할 수 없습니다.

사유: