Caractéristiques du langage mql5, subtilités et techniques - page 190

 
Vladimir Pastushak:

Est-il possible de distinguer un objet graphique créé manuellement d'un objet créé par un indicateur ou un EA ?

Dans la fonction

OBJPROP_HIDDEN

Barrer le nom d'un objet graphique à partir du menu du terminal "Graphiques" - "Objets" - "Liste des objets". La valeur true permet de masquer un objet inutile de la liste. Par défaut, true est défini pour les objets qui affichent les événements du calendrier, l'historique des transactions, ainsi queceux créés à partir du programme MQL5. Pour voir ces objetsgraphiques et accéder à leurs propriétés, cliquez sur "Tous" dans la fenêtre "Liste des objets".

bool

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов...
 
C'est probablement une chose connue, mais je n'étais pas conscient de cette nuance moi-même.

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

Bibliothèques : Expert

fxsaber, 2020.10.09 04:55

bool ReloadChart( const long Chart )
{
  return (ChartSaveTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") &&
          ChartApplyTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") && // Поставили задание в очередь чарта.
          ChartGetInteger(Chart, CHART_WINDOW_HANDLE));                 // Заставляем двигаться очередь.
}

J'ai mis en évidence un endroit important du code. Sans elle, il n'y a pas d'application du motif jusqu'à la fin du script.

 
À propos du premier paramètre d'entrée dans EventChartCustom

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

MT5 et la vitesse en action

Anton, 2020.10.08 11:00

Une signification différente et un mécanisme d'exécution différent. 0 - événement dans la file d'attente du "propre" tableau. -1 - événement dans sa propre file d'attente.

 
Vladimir Pastushak:

A la fin de la semaine, ma tête n'est déjà pas bonne.

J'ai un ticket d'une position ouverte sur une couverture dans mt5, par exemple 123456.

Je veux calculer un bénéfice après la fermeture de la position, et je ne peux pas le faire.

Je le fais, mais je ne touche qu'une commission...

Comment obtenir le bénéfice d'une position fermée avec un ticket ?

Essayez de mieux sélectionner les transactions en utilisant HistorySelectByPosition().

Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть  в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
 

Il était nécessaire de savoir à l'intérieur d'un mqh si quelque chose avait été appelé auparavant depuis un autre mqh. Le mqh n'est pas conscient de la présence de l'autre. L'un d'eux peut être dans le coup et l'autre non.

En somme, le problème est inhabituel (pour moi). Je l'ai résolu d'une manière plutôt maladroite.

void f1()
{
  SetUserError(0);
}

void f2()
{
  if (_LastError == ERR_USER_ERROR_FIRST)
    Print("f1() была вызвана.");
  else
    Print("f1() не была вызвана");
}

void OnStart()
{
  f1();
  f2();
}

Je pense que c'est une très mauvaise pratique, mais ça marche.

 
Si quelqu'un a besoin de fermer la fenêtre d'alerte.
// Закрытие Alert-окна
bool CloseAlert()
{  
  const long Chart = ChartOpen(_Symbol, _Period);  
  const bool Res = Chart && !ChartSaveTemplate(Chart, NULL);
                            
  if (Chart)
    ChartClose(Chart);
    
  return(Res);  
}
 
fxsaber:

Il était nécessaire de savoir à l'intérieur d'une mqh si quelque chose avait été appelé auparavant depuis une autre mqh. Le mqh n'est pas conscient de la présence de l'autre. L'un d'eux peut être dans le coup et l'autre non.

En somme, le problème est inhabituel (pour moi). Je l'ai résolu d'une manière plutôt maladroite.

Je pense que c'est une très mauvaise pratique, mais ça marche.

L'utilisation de _LastError présente un problème insoluble : lors de la connexion de bibliothèques tierces, il existe une probabilité non nulle de collision des codes d'erreur des utilisateurs. Comme alternative à la gestion de votre propre lastError. Soit une variable globale, enveloppée dans includeguard dans tous les mqh, soit une variable unique.
 

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

MT5 et la vitesse en action

fxsaber, 2020.10.20 12:28

Total intermédiaire pour une machine à déchargement rapide.

La pertinence des données sur les prix est très ambiguë pour ceux qui négocient en utilisant des barres et des indicateurs.

Les tiques et les culbutes sont difficiles à être en temps réel.

 
Dans MT5 Sleep(0) == Sleep(1). C'est la raison pour laquelle il n'y a pas d'énorme charge CPU lors de l'utilisation de Sleep(0) comme c'est le cas dans MT4.

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

Particularités de mql5, trucs et astuces

Slava, 2018.09.20 15:40

PS. La fonction Sleep() de MQL5 n'est pas une redirection vers la fonction win api ::Sleep(). Pour être plus exact, si la valeur est inférieure à 100, il s'agit d'une redirection. Mais au-delà de 100, il s'agit d'une boucle dans laquelle se glisse win api, de sorte qu'elle peut être interrompue par IsStopped.

Il y a un point plus subtil. Si les millisecondes <=0, nous ajoutons 1. C'est-à-dire que nous n'appelons jamais ::Sleep(0).

Il a déjà été oublié. Vrai seulement pour MT5. Dans MT4 Sleep(0) peut suspendre le terminal.

 
J'ai eu l'idée de changer Virtual en pointeurs afin de ne pas avoir à vérifier une condition supplémentaire à chaque appel.
  static double VirtualSymbolInfoDouble( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )
  {
    return(VIRTUAL::SelectOrders ? VIRTUAL::SelectOrders.SymbolInfoDouble(Symb, Property) : ::SymbolInfoDouble(Symb, Property));
  }


Mais j'ai décidé de comparer d'abord les performances, en utilisant un exemple simple.

// Сравнение производительности функции с доп. условием и указателя на функцию.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

typedef double (*TFunc)( const int ); // Определяем нужный тип указателя на функцию.

double Prices[];

double GetPrices2( const int Pos )
{
  return(Prices[Pos]);
}

double GetPrices( const int Pos )
{
  return(Pos >= 0 ? GetPrices2(Pos) : 0); // Специально введено доп. условие, чтобы уменьшить производительность.
}

void OnStart()
{
  const int Size = ArrayResize(Prices, 1 e7);
  
  double Sum1 = 0;
  double Sum2 = 0;

  TFunc Func = GetPrices2;
    
  // Замер производительности через указатель функции.
  _BV(
  for (int i = 0; i < Size; i++)
    Sum2 += Func(i);
      , 1)


  // Замер производительности через функцию с доп. условием.
  _BV(
  for (int i = 0; i < Size; i++)
    Sum1 += GetPrices(i);
      , 1)  

  Print(Sum1);
  Print(Sum2);
}


Le résultat.

2020.10.21 01:07:00.745 Test9 (AUDCAD,H1)       Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 29 in OnStart: for(inti=0;i<Size;i++)Sum2+=Func(i);] = 33906 mcs.
2020.10.21 01:07:00.756 Test9 (AUDCAD,H1)       Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 36 in OnStart: for(inti=0;i<Size;i++)Sum1+=GetPrices(i);] = 10923 mcs.


La variante typedef perd par un facteur de trois. J'ai refusé de l'utiliser là où c'est crucial. Par exemple, pour TC, le même OrdersTotal est appelé au moins une fois à chaque tick de passage de l'optimiseur.


En mode débogage, la situation est inversée. Il est donc logique d'utiliser le typedef dans MT4 pour l'accélération.

Raison: