FORTS. Questions relatives à l'application de la loi - page 7

 

Bonjour !

Quelque chose ne va pas au Royaume.

1

Les travaux avancent-ils ?

 
Mikalas:

Bonjour !

Quelque chose ne va pas au Royaume

Les travaux avancent-ils ?

Oui, il y a eu beaucoup de progrès.

Nous publions une nouvelle version cette semaine et lorsque les serveurs seront mis à jour, vous verrez une accélération. Les travaux sont toujours en cours.

 
Renat:

Oui, le progrès est formidable.

Nous allons publier une nouvelle version cette semaine et lorsque les serveurs seront mis à jour, vous verrez l'accélération. Les travaux sont toujours en cours.

Bien joué ! J'ai hâte d'y être !
 

Bonjour, Renat !

Existe-t-il des courtiers aux États-Unis qui utilisent MT5 pour

Commerce à terme ?

 
Pas encore.
 
Renat:
Pas encore.
Les projets sont-ils lointains ou dans un avenir prévisible ?
 
Mikalas:
Les projets sont-ils lointains ou dans un avenir prévisible ?
Nous publierons les nouvelles au fur et à mesure qu'elles nous parviendront.
 

Bonne journée, Renat !

Prévoyez-vous d'améliorer le gestionnaire OnTradeTransaction?

 
Qu'est-ce que vous entendez exactement par là ?
 
Renat:
Qu'est-ce que vous entendez exactement par là ?

Bonjour !

L'image montre le journal de l'action avec un ordre en attente:

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

Installation --> Modification --> Suppression

Pourquoi la duplication (entourée en rouge) ?

Et il n'y a pas de codes de retour.

Par exemple, un ordre peut être supprimé par moi, mais il peut aussi être supprimé par le courtier, ou peut-être qu'un ordre a expiré.

Comment puis-je le savoir ?

Voyons maintenant comment définir un ordre en attente :

En envoyant la commande OrderSendAsync, nous obtenons le numéro de la requête req_id = result.request_id

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

Dans OnTradeTransaction nous obtenons immédiatement une réponse (result.retcode) que l'ordre soit fixé (nous obtenons son ticket) ou non.

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; 
}    

Pourquoi avons-nous besoin de 3 messages supplémentaires,

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

si nous avons déjà tout compris ?

Ensuite, la modification.

pourquoi avons-nous besoin du message,

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

si nous ne connaissons pas le résultat de cette action de toute façon(Retcode = 0) ?

En envoyant une commande de modification de l'ordre, on sait déjà, comme dans le cas de sa mise en place, qu'il est en train d'être modifié (on a obtenu le ticket de manière répétée etresult.retcode == TRADE_RETCODE_PLACED).

Il serait beaucoup plus informatif d'ajouterRetcode = MODIFY_DONE au message

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
Raison: