Caractéristiques du langage mql4, subtilités et techniques - page 10

 
Alexey Viktorov:

Je ne comprends pas quelle est la surprise. Il existe une valeur int du type d'ordre dans la documentation.

OP_BUY

0

Acheter

OP_SELL

1

Vendez

OP_BUYLIMIT

2

Ordre en attente BUY LIMIT

OP_SELLLIMIT

3

Ordre SELL LIMIT en attente

OP_BUYSTOP

4

Ordre BUY STOP en attente

OP_SELLSTOP

5

Ordre SELL STOP en attente


#define OP_BALANCE 6
#define OP_CREDIT 7

Ainsi, avec un réseau de 6 cellules, vous pouvez parfois aller trop loin.

 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Je veux déplacer le commentaire de l'EA du coin gauche au coin droit ?

fxsaber, 2018.07.10 15:13

// Вывод комментария по примерным координатам
void CommentXY( string Str, const uint X = 0, const uint Y = 0 )
{
  string Shift = NULL;
  
  StringInit(Shift, X >> 2, ' ');
  
  if (StringLen(Shift))
  {
    StringReplace(Str, "\n", "\n" + Shift);
    
    Str = Shift + Str;
  }
  
  if (Y)
  {
    StringInit(Shift, Y / 14, '\n');
    
    Str = Shift + Str;
  }
  
  Comment(Str);  
}


Application

void OnStart()
{
  const uint Height = 200;
  const uint Width = 200;
  
  while (!IsStopped())
  {
    CommentXY("Hello World!\nCommentXY", MathRand() * Width / SHORT_MAX, MathRand() * Height / SHORT_MAX); // Вывод комментария со сдвигом (ноль - левый-верхний угол).
    
    Sleep(200);
  }
}
 
fxsaber:

Avez-vous une réponse officielle des développeurs ? Jusqu'à présent, je ne peux que constater que vous avez cherché, réfléchi et décidé.

 
Artyom Trishkin:

Avez-vous une réponse officielle des développeurs ? Jusqu'à présent, je ne peux que constater que vous avez cherché, réfléchi et décidé par vous-même.

Ma conclusion sur le niveau d'"autosuffisance" n'est pas meilleure que celle du début de ce fil de discussion.

Pas besoin de souffrir d'absurdité/paranoïa.

 
fxsaber:

Ma conclusion sur le niveau d'"autonomie" n'est pas plus grande que celle du début de ce fil de discussion.


Il n'est pas nécessaire de souffrir d'absurdité/paranoïa.

Vous avez dû manquer le moment où la plupart de ceux qui ne souffraient pas de "paranoïa" ont réécrit d'urgence leurs codes alors que les EA s'effondraient du jour au lendemain. A cause de la dépendance au triage. C'était il y a longtemps, mais les gens ont encore des souvenirs. Ceux qui ont eu des problèmes ont commencé à écrire des codes indépendants du tri. Je n'ai pas eu de problème - je l'ai simplement lu sur le forum et l'ai pris à cœur.

 
Artyom Trishkin:

Vous avez dû manquer l'époque où la plupart de ceux qui ne souffraient pas de "paranoïa" réécrivaient d'urgence leurs codes alors que les EA s'effondraient du jour au lendemain. A cause de la dépendance au triage. C'était il y a longtemps, mais les gens ont encore des souvenirs. Ceux qui ont eu des problèmes ont commencé à écrire des codes indépendants du tri. Je n'ai pas eu de problème - je l'ai simplement lu sur le forum et l'ai pris à cœur.

Malheureusement, ce mythe ne trouve aucun appui dans l'histoire du forum. De plus, les développeurs ont toujours clairement indiqué leur position selon laquelle de tels changements ne peuvent pas être effectués par principe.


Par exemple, vous pouvez vous sentir libre d'écrire

if (OrderType() <= OP_SELL)
  ReverseType = 1 - OrderType();


au lieu de

if ((OrderType() == OP_BUY) || (OrderType() == OP_SELL))
  ReverseType = (OrderType() == OP_BUY) ? OP_SELL : OP_BUY;


Vous pouvez vous sentir libre d'écrire

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Particularités du langage mql4, trucs et astuces

fxsaber, 2018.04.03 16:15

double Lots[] = {0, 0, 0, 0, 0, 0, 0, 0};

for (int i = OrdersTotal() - 1; i >= 0; i--)
  if (OrderSelect(i, SELECT_BY_POS))
    Lots[OrderType()] += OrderLots();

etc.

 
fxsaber:

Malheureusement, ce mythe ne trouve aucun appui dans l'histoire du forum. De plus, les développeurs ont toujours clairement indiqué leur position selon laquelle de tels changements ne peuvent pas être effectués par principe.

Par exemple, vous pouvez vous sentir libre d'écrire comme suit


Pourquoi toutes ces pseudo-optimisations, dont il faut constamment garder les nuances à l'esprit ? Est-il vraiment si difficile d'écrire un code qui ne dépend pas de telles hypothèses (signification d'une constante nommée) ? Quel est l'intérêt de telles constructions, à part montrer une certaine connaissance des nuances du compilateur, mais pas du tout qu'elles sont plus faciles à comprendre ?

 
Ihor Herasko:

Pourquoi toutes ces pseudo-optimisations, dont les nuances doivent être constamment gardées à l'esprit ? Est-il vraiment si difficile d'écrire un code qui ne dépend pas de telles hypothèses (quelle est la signification de telle ou telle constante nommée) ? Quel est d'ailleurs l'intérêt de telles constructions, si ce n'est de montrer une certaine connaissance des nuances du compilateur, mais pas du tout qu'elles sont plus faciles à comprendre ?

C'est étrange, je n'ai aucun problème à lire un tel code. De plus, sa lecture et sa compréhension sont plus rapides que celles du code "canonique".

Eh bien, l'exemple ci-dessus avec Lots[] est un trésor qui montre comment le code peut être super-laconique et clair en même temps. Et attention, ce n'est pas du tout "canonique".

Il est probable que si vous examinez le code source de nombreux emplois de Market/Freelance, vous ne rencontrerez pas seulement des lambeaux de code "canonique", mais aussi une terrible inefficacité des performances et un facteur non négligeable - la compréhension du code pendant la lecture.


Le même amour inextinguible de la poursuite est un manque total de respect pour les possibilités de la langue. Un code de 100 lignes est bien mieux perçu qu'un code de 200 lignes faisant la même chose. C'est la raison pour laquelle les gens se sont initialement plaints de MQL5. Regardez la refonte du code de MT4 dans QB pour MT5 - il est très difficile de comprendre la logique de TC (le code est beaucoup plus grand). Il est plus facile d'aller sur le MT4 original et de regarder le code.

 
fxsaber:

Étrangement, je n'ai aucun problème à lire un tel code. De plus, sa lecture et sa compréhension sont plus rapides que celles du code "canonique".

Dans de nombreuses entreprises de logiciels, ce type de code se ferait frapper les doigts. La première chose à faire, toujours et partout, est d'éviter les "lectures inutiles". Par exemple, si vous utilisez une condition lors de la saisie d'une fonction :

if (<условие>)
{
}

il est recommandé d'écrire :

if (!<условие>)
   return;

Cette approche permet vraiment d'éviter la fixation de conditions.

L'exemple ci-dessus avec Lots[] est un véritable trésor, qui montre comment le code peut être à la fois super-laconique et totalement compréhensible. Et attention, ce n'est pas du tout "canonique".

Encore une fois, c'est un casse-tête. Parce que personne n'a vérifié ce que la fonction OrderType() a retourné. Ou peut-être que ça a donné -1 ou 6 ? Il s'agit d'un exemple d'utilisation des propriétés du compilateur dont il faut toujours se méfier. Vous citez vous-même de nombreux exemples de code multiplateforme. Alors pourquoi vous en écarter dans ce cas ? Un nouveau compilateur MQ sortira et ce code ne fonctionnera plus correctement.

Le même amour inextinguible de la poursuite est un mépris total pour les possibilités de la langue. Un code de 100 lignes est beaucoup mieux compris qu'un code de 200 lignes faisant la même chose. C'est la raison pour laquelle les gens se sont initialement plaints de MQL5. Regardez la refonte du code de MT4 dans QB pour MT5 - il est très difficile de comprendre la logique de TC (le code est plusieurs fois plus grand). Il est plus facile d'aller sur le MT4 original et de regarder le code.

Avec la poursuite, c'est la même situation. Code comme :

if (OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == m_nMagicNumber)
{
}

est plus difficile à lire que :

if (!OrderSelect(i, SELECT_BY_POS))
   continue;

if (OrderSymbol() != Symbol())
   continue;

if (OrderMagicNumber() != m_nMagicNumber)
   continue;
Et pourtant, l'efficacité de l'exécution est la même dans les deux cas.
Raison: