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

 
HistorySelect.

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

MT5 et la vitesse en action

fxsaber, 2020.09.02 00:32

Si quelqu'un essaie d'utiliser des bibliothèques partagées où le paramètre from-input ne correspond pas, vous obtiendrez des ralentissements.


L'autre HistorySelect.

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

MT5 et la vitesse en action

fxsaber, 2020.09.02 00:52

HistoryDealSelect et HistoryOrderSelect devraient nécessairement s'écrire ainsi.

  static bool HistorySelectOrder( const ulong Ticket )
  {
    return((::HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket) || ::HistoryOrderSelect(Ticket));
  }

  static bool HistorySelectDeal( const ulong &Ticket )
  {
    return((::HistoryDealGetInteger(Ticket, DEAL_TICKET) == Ticket) || ::HistoryDealSelect(Ticket));
  }

Sinon, vous êtes assuré de rencontrer des ralentissements.

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

MT5 et la vitesse en action

Renat Fatkhullin, 2020.09.02 00:40

Lorsque vous travaillez avec d'énormes volumes (et ce n'est pas pour rien que vous avez montré des milliers et des dizaines de milliers de transactions dans l'historique), qui nécessitent un accès atomique/snapshot, vous devez comprendre leur coût.

 
Si l'EA a MessageBox dans OnInit, il y a un certain nombre de choses à faire pour contourner le problème potentiel du relogging.
 
Il est sage de minimiser le nombre d'appels aux fonctions internes pour réduire la probabilité de rencontrer leurs décalages, qui ne sont pas rares.
 

Je ne peux pas gagner

2020.04.01 11:49:34 échec de la vente instantanée de 0.32 EURUSD à 1.09539 [Volume non valide].

J'ai un contrôle sur la limite du volume total sur le marché.

Je ne sais pas pourquoi j'ai eu une telle erreur.

Dans le validateur de marché
 
Vladimir Pastushak:

Je ne peux pas gagner

2020.04.01 11:49:34 échec de la vente instantanée de 0.32 EURUSD à 1.09539 [Volume non valide].

J'ai un contrôle sur la limite du volume total sur le marché.

Je ne comprends pas pourquoi j'ai obtenu une telle erreur.

Dans le validateur de marché

Vous n'avez pas pu atteindre la limite de commande ? Je pense que c'était comme ça.

 
Edgar Akhmadeev:

Auriez-vous pu vous heurter à une limite sur les mandats ? Je crois que oui.

Il indique un volume erroné, la disponibilité des fonds est vérifiée, le dépassement de la limite de lot est également vérifié. Continuez à creuser...

 
Vladimir Pastushak:

Il ne dit pas le bon volume.

Edgar Akhmadeev:

On dirait que je l'ai eu.

...qu'un petit volume n'a pas ouvert avec un grand dépôt. Je ne me souviens pas des détails, mais l'un des courtiers sur le cent avait une très petite limite d'ordre sur l'instrument.

 

Le problème suivant se pose dans MT5. J'ai besoin de tester le fonctionnement du panneau de négociation dans le testeur de stratégie en mode visuel. Le panneau de négociation comporte des champs de saisie (OBJ_EDIT). Lorsque vous modifiez le texte de la zone de saisie et que vous appuyez sur ENTRÉE, le nouveau texte n'apparaît pas, mais le texte original défini lors de la création de la zone de saisie. En d'autres termes, il n'est pas possible de modifier le texte du champ de saisie pendant le test visuel du panneau.

Comment cela peut-il être résolu ?

Exemple de code :

void OnTick()
  {
   string name="EDIT";
   if(ObjectFind(0,name)==-1)
     {
      ObjectCreate(0,name,OBJ_EDIT,0,0,0);
      ObjectSetString(0,name,OBJPROP_TEXT,"EURUSD");
      ObjectSetInteger(0,name,OBJPROP_XDISTANCE,50);
      ObjectSetInteger(0,name,OBJPROP_YDISTANCE,50);
      ObjectSetInteger(0,name,OBJPROP_XSIZE,50);
      ObjectSetInteger(0,name,OBJPROP_YSIZE,20);
      ObjectSetInteger(0,name,OBJPROP_READONLY,false);
      ObjectSetInteger(0,name,OBJPROP_COLOR,clrBlack);
      ObjectSetInteger(0,name,OBJPROP_BGCOLOR,clrWhite);
     }
  }
 

J'ai créé ce script auto-hotkey pour cacher les barres de titre pendant le codage. Il fonctionne pour toutes les fenêtres de Windows. Je ne suis pas sûr pour les autres plateformes.



; 
Hide borders, title bar 









#IfWinNotActive ahk_class Progman 









#IfWinNotActive ahk_class Shell_TrayWnd 









^] :: 









WinGet Style, Style, A 









if (Style & 0xC40000) { 









WinSet, Style, -0xC40000, A 









WinMaximize, A 













} 









else { 









WinSet, Style, + 0xC40000, A 









WinRestore, A 









} 









return 

Le résultat est un écran de bureau parfaitement rempli.

Il suffit de sauvegarder le fichier sous le nom de nom_fichier.ahk. Enregistrez-le dans votre répertoire préféré, puis téléchargez et installez https://www.autohotkey.com.

Créez un raccourci du script et coupez-le. Appuyez sur win + r

Tapez shell : startup et collez le raccourci dans la fenêtre pop.

De cette façon, le script démarrera avec les fenêtres après le redémarrage. Pour lancer le script maintenant, double-cliquez dessus, puis vous pouvez masquer les barres de titre des fenêtres avec ctrl +].

Assurez-vous que la fenêtre n'est pas maximisée lorsque vous utilisez le raccourci. Il ne sert à rien de maximiser une fenêtre maximisée, et je n'ai pas manipulé pour ce cas.

Profitez de

éditer :

Le formateur de code se comporte bizarrement. Il n'arrête pas d'étendre le code à un énorme espacement des lignes. Lol !

AutoHotkey
  • www.autohotkey.com
AutoHotkey provides a simple, flexible syntax allowing you to focus more on the task at hand rather than every single little technicality. It supports not only the popular imperative-procedural paradigm, but also...
Dossiers :
 

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

Bibliothèques : Benchmark

fxsaber, 2020.10.01 23:49

// Возвращает true в некоторых ситуациях, когда чарт не виден.
bool IsInvisible( long chartID = 0 )
{
  bool Res = ::ChartGetInteger(chartID, CHART_IS_MINIMIZED);
  
  if (!Res && !::ChartGetInteger(chartID, CHART_IS_MAXIMIZED) && ::ChartGetInteger(chartID, CHART_IS_DOCKED))
  {
    if (!chartID)
      chartID = ::ChartID();

    for (long Chart = ::ChartFirst(); (Chart != -1) && !Res; Chart = ::ChartNext(Chart))
      Res = (Chart != chartID) && ::ChartGetInteger(Chart, CHART_IS_MAXIMIZED);
  }
  
  return(Res);
}

Les panneaux de trading et les autres informations sur les graphiques ne sont pas mis à jour si le résultat est vrai.

Raison: