요새. 실행 질문 - 페이지 7

 

안녕하세요!

"킹덤"에 문제가 있습니다.

하나

작업에 진전이 있습니까?

 
Mikalas :

안녕하세요!

"킹덤"에 문제가 있습니다.

작업에 진전이 있습니까?

예, 큰 발전입니다.

이번 주에 우리는 새로운 빌드를 출시할 예정이며 서버가 업데이트되면 가속을 보게 될 것입니다. 작업은 계속 진행 중입니다.

 
Renat :

예, 큰 발전입니다.

이번 주에 우리는 새로운 빌드를 출시할 예정이며 서버가 업데이트되면 가속을 보게 될 것입니다. 작업은 계속 진행 중입니다.

잘하셨어요! 기대해!
 

좋은 오후입니다, 레나트!

미국의 중개인이 MT5를 사용합니까?

선물 거래?

 
아직 아님.
 
Renat :
아직 아님.
그리고 그 계획은 멀거나 가까운 미래에 있습니까?
 
Mikalas :
당신의 계획은 장기적입니까, 아니면 가까운 미래입니까?
소식이 들어오는 대로 바로 공개하도록 하겠습니다.
 

좋은 오후입니다, 레나트!

OnTradeTransaction 핸들러를 개선할 계획입니까?

 
무슨 뜻이에요?
 
Renat :
무슨 뜻이에요?

안녕하세요!

그림에서 보류 중인 주문이 있는 작업 로그:

 void OnTradeTransaction ( const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result )
{
   Print ( "Type = " , EnumToString (trans.type), "; State = " , EnumToString ( trans.order_state ), "; Retcode = " , result.retcode );
}

설치 --> 수정 --> 제거

중복되는 이유(빨간색 원)?

그리고 반환 코드가 없습니다.

예를 들어, 나는 주문을 삭제할 수 있지만 중개인은 삭제할 수 있거나 주문이 만료되었을 수 있습니다.

알아내는 방법?

이제 보류 중인 주문을 고려하십시오.

OrderSendAsync 명령을 전송하여 요청 번호 req_id = result.request_id를 얻습니다.

 if ( OrderSendAsync ( request, result ) )
  {
     if ( result.retcode == TRADE_RETCODE_PLACED ) 
    {
      req_id = result.request_id;
    }
  }

OnTradeTransaction에서 주문이 접수되었는지(티켓을 받았는지) 여부에 관계없이 즉시 응답(result.retcode)을 받습니다.

 void OnTradeTransaction ( const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result )
{
 // Print( "Type = ", EnumToString(trans.type), "; State = ", EnumToString( trans.order_state ), "; Retcode = ", result.retcode );

   switch ( trans.type )
  {
     case TRADE_TRANSACTION_REQUEST :       if ( trans.order_state == ORDER_STATE_STARTED )
                                         {
                                           if ( ( req_id != 0 ) && ( result.request_id == req_id ) )
                                           {
                                             if ( result.retcode == TRADE_RETCODE_PLACED )
                                             {
                                               ticket = result.order;
                                             }
                                             req_id = 0 ;   
                                           }
                                         }
                                         break ; 
}    

3개의 메시지가 더 필요한 이유는 무엇입니까?

EI       0        20 : 45 : 15.932     Forts_trader (SBRF- 3.15 ,H1)     Type = TRADE_TRANSACTION_ORDER_ADD ; State = ORDER_STATE_STARTED ; Retcode = 0
GD       0        20 : 45 : 15.932     Forts_trader (SBRF- 3.15 ,H1)     Type = TRADE_TRANSACTION_ORDER_UPDATE ; State = ORDER_STATE_REQUEST_ADD ; Retcode = 0
KI       0        20 : 45 : 15.961     Forts_trader (SBRF- 3.15 ,H1)     Type = TRADE_TRANSACTION_ORDER_UPDATE ; State = ORDER_STATE_PLACED ; Retcode = 0

우리가 이미 그것을 알아 냈다면?

다음으로 수정입니다.

왜 메시지,

KI       0        20 : 45 : 36.879     Forts_trader (SBRF- 3.15 ,H1)     Type = TRADE_TRANSACTION_ORDER_UPDATE ; State = ORDER_STATE_REQUEST_MODIFY ; Retcode = 0

여전히 이 작업의 결과를 모르는 경우( Retcode = 0 )?

주문을 수정하라는 명령을 보내면 주문의 경우와 마찬가지로 수정되고 있음을 이미 알고 있습니다(티켓을 다시 받았고 result.retcode == TRADE_RETCODE_PLACED ).

메시지에 Retcode = MODIFY_DONE을 추가하는 것이 훨씬 더 유익할 것입니다.

RN       0        20 : 45 : 36.895     Forts_trader (SBRF- 3.15 ,H1)     Type = TRADE_TRANSACTION_ORDER_UPDATE ; State = ORDER_STATE_PLACED ; Retcode = MODIFY_DONE
Ну и с удалением ордера та же история, получив TRADE_TRANSACTION_REQUEST и result.retcode == TRADE_RETCODE_PLACED мы уже знаем, что ордер в состоянии удаления.
Да и вообще, зачем знать переходные состояния ордера, если с ним, в этот момент, ничего нельзя сделать? 
Т.е для отслеживания команд и состояния ордера
достаточно Type = TRADE_TRANSACTION_REQUEST и   result.retcode ==  TRADE_RETCODE_PLACED для понимания, что команда исполнена и происходит действие
 А для результата действия достаточно  Type = TRADE_TRANSACTION_ORDER_UPDATE ; State = ORDER_STATE_PLACED ; Retcode = PLACE_DONE | MODIFY_DONE | CANCELED_DONE | OTHER_ERRORS