Discussion sur la mise en place des conseillers. - page 2

 
Georgiy Merts:

Je ne comprends pas comment cela fonctionne. D'ailleurs, ce forumer lui-même, lorsqu'on lui a posé la question, a dit qu'il ne s'en souvient plus, mais que ce code a déjà été testé de nombreuses fois et qu'on peut lui faire confiance.

Eh bien, si j'ai l'occasion de remplacer ces stupides "questions" par de vraies déclarations "si", je trouverai comment faire... Pour l'instant...

Au fait, j'ai jeté un œil à cette horreur aujourd'hui.

Voici ce que cela signifie :

ENUM_ORDER_TYPE_FILLING otfMyRes  = WRONG_VALUE;   

if(iFillingMode == 0 || (otfFilingType >= ORDER_FILLING_RETURN) || ((iFillingMode & (otfFilingType + 1)) != otfFilingType + 1))
	{
        if(steExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE || steExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)
                otfMyRes = ORDER_FILLING_RETURN;
        else   
                if(iFillingMode == SYMBOL_FILLING_IOC)
                        otfMyRes = ORDER_FILLING_IOC;
                else
                        otfMyRes = ORDER_FILLING_FOK;
        }
   else      
        otfMyRes = otfFilingType;

return(otfMyRes);  

À mon avis, c'est beaucoup plus clair sans ces "questions", avec des "si" et des retraits. Bien que l'efficacité du code soit absolument la même.

D'ailleurs, vous pouvez voir immédiatement que l'auteur s'en est tenu aux valeurs numériques de iFillingMode et otfFilingType, ce qui, à mon avis, n'est pas une bonne pratique.

 
Georgiy Merts:

Au fait, j'ai jeté un œil à cette horreur aujourd'hui.

Voici ce que cela signifie :

À mon avis, c'est beaucoup plus clair sans ces "questions", avec des "si" et des retraits. Bien que l'efficacité du code soit absolument la même.

À propos, vous pouvez voir immédiatement que l'auteur s'en est tenu aux valeurs numériques de iFillingMode et otfFilingType, ce qui, à mon avis, n'est pas une bonne pratique.

Dans ma librairie, c'est comme ça :

#ifdef __MQL5__
   ENUM_ORDER_TYPE_FILLING COrder::GetFilling(ENUM_FILLING_MODE mFilling){
      if (!_fillingMode) return ORDER_FILLING_RETURN;
      else if (mFilling==FILLING_AUTO||mFilling==FILLING_FOK) return !(_fillingMode&SYMBOL_FILLING_FOK)?ORDER_FILLING_IOC:ORDER_FILLING_FOK;
      else return  !(_fillingMode&SYMBOL_FILLING_IOC)?ORDER_FILLING_FOK:ORDER_FILLING_IOC;}
#endif

_fillingMode est une macro qui s'étend sur le déréférencement de ce champ.

fillingMode=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
 
Georgiy Merts:

C'est une autre chose.

En y réfléchissant, il m'arrive de regarder mon propre code et de ne pas comprendre pourquoi il est écrit à cet endroit précis. C'est pourquoi j'essaie de commenter ces endroits en détail, en essayant de mentionner tous les détails. Mais je constate encore régulièrement que je n'ai pas envisagé certaines choses.

De plus, j'utilise le code suivant (pour déterminer le type d'exécution), qui a été écrit par un utilisateur du forum faisant autorité :

Je ne comprends pas comment cela fonctionne. D'ailleurs, ce forumer lui-même a dit, lorsqu'on lui a demandé, qu'il ne se souvient plus, c'est juste que ce code a déjà été testé de nombreuses fois et qu'on peut lui faire confiance .

Eh bien, si j'ai l'occasion de remplacer ces stupides "questions" par de vraies déclarations "si", je trouverai comment faire... Pour l'instant...

Jaune - très étrange qu'une personne ne puisse pas comprendre immédiatement le code trivial qu'elle a écrit elle-même.

Red - Je n'étais pas trop paresseux et j'ai vérifié à nouveau, lors de l'exécution sur le marché, je ne peux pas ORDER_FILLING_RETURN, c'est seulement pour le stock (il y a une erreur dans les docks), et c'est ce que le respecté propriétaire du forum a retourné))))

 
Vladimir Simakov:

Jaune - il est très étrange qu'une personne ne puisse pas comprendre un code trivial, qu'elle a écrit elle-même.

Red - Je ne me suis pas senti paresseux et j'ai vérifié à nouveau, lors de l'exécution sur le marché, vous ne pouvez pas ORDER_FILLING_RETURN, c'est seulement pour l'échange (il y a une erreur dans les docks), et c'est ce que le membre respecté du forum retourne))))

Je ne sais pas, je ne sais pas. à quel point ce code est "trivial" dans une telle entrée. Il m'a fallu au moins 15 minutes pour comprendre sa logique, et ce n'est qu'en écrivant les "si" que j'ai compris.

Et à propos de "il y a une erreur dans la documentation" - pouvez-vous nous en dire plus ?

 
Georgiy Merts:

Je ne sais pas, je ne sais pas à quel point ce code est "trivial" dans un post comme celui-ci. Il m'a fallu au moins 15 minutes pour comprendre la logique de son fonctionnement, et ce n'est qu'en écrivant les "si" que cela m'est apparu clairement.

Et à propos de "l'erreur dans les docks" - pouvez-vous m'en dire plus ?

Lors de l'exécution de l'échange

SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE)

il renvoie 0, mais au marché (j'ai vérifié chez Alpari)

SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK

J'ai vérifié avec Alpari et il retourne 0x3. Si vous essayez de cette façon

MqlTradeRequest::filling_mode=ORDER_FILLING_RETURN

Si vous essayez, ça ne s'ouvrira pas.

 
Vladimir Simakov:

alors il ne s'ouvrira pas.

J'ai vérifié la fonction d'origine.

#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  if (!OrdersTotal())
  {
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, ORDER_FILLING_FOK, 0, 0);    
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, ORDER_FILLING_IOC, 0, 0);    
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, ORDER_FILLING_RETURN, 0, 0);    
  }  
}

Ça marche.

 
fxsaber:

J'ai vérifié la fonction d'origine.

Ça marche.

Essayez-le sur l'exécution du marché plutôt que sur l'exécution de la bourse).

UPD : correction, sur l'exécution immédiate, celle qui

SYMBOL_TRADE_EXÉCUTION_INSTANTANÉE

 
Vladimir Simakov:

Essayer l'exécution sur le marché plutôt que sur la bourse)

UPD : correction, sur l'exécution immédiate, celle qui

SYMBOL_TRADE_EXÉCUTION_INSTANTANÉE

Test EA ci-dessus. Essayez-le.

 
Vladimir Simakov:

Essayer l'exécution sur le marché plutôt que l'exécution en bourse)

UPD : correction, sur l'exécution immédiate, celle qui

SYMBOL_TRADE_EXÉCUTION_INSTANTANÉE

Ce sont par exemple des comptes de type standard dans A-ri, non ?

Et les courtiers qui négocient ont toujours ce genre d'exécution, non ?

Juste pour clarifier.

 

A quoi bon ?

Utilisez des classes standard et n'avez pas besoin de remplir des structures(MqlTradeRequest) et n'avez pas besoin de connaître les remplissages et les instants :


#include<Trade\SymbolInfo.mqh>
#include<Trade\AccountInfo.mqh>
#include<Trade\Trade.mqh>

CTrade  
CAccountInfo 
CPositionInfo