Questions des débutants MQL5 MT5 MetaTrader 5 - page 1474

 
Artyom Trishkin #:

Vous ne comprenez pas le sens de ma question. Vous n'avez pas besoin d'attendre le serveur lorsqu'il manque de mémoire et qu'il explose.

S'il y a une fuite d'objets dans le code, recompilez-le sur votre ordinateur local avec l'Expert Advisor en cours d'exécution - un message concernant le nombre et le type d'objets ayant fui devrait s'afficher dans les journaux. Vous pouvez également l'exécuter sur un graphique et le supprimer immédiatement - un message concernant la fuite devrait également s'afficher, s'il y en a une, bien sûr.

Il n'écrit rien lors de la compilation. Il l'efface et en installe un nouveau. C'est tout.

NM      0       00:18:47.545    Experts expert Comm (SBRF-12.23,M1) removed
JI      0       00:18:47.547    Experts expert Comm (SBRF-12.23,M1) loaded successfully
KQ      0       00:18:47.560    Experts expert Comm (RTS-12.23,M1) removed
EE      0       00:18:47.562    Experts expert Comm (RTS-12.23,M1) loaded successfully

Il fonctionne toujours sur le serveur. Je vais attendre, peut-être qu'il écrira quelque chose dans les logs.

 
Aleksandr Slavskii #:

J'ai essayé de faire un analogue du commentaire, mais les lettres étaient plus grandes.

Quelque temps après avoir lancé l'Expert Advisor avec un commentaire sur plusieurs graphiques, quelque chose de grave se produit, jusqu'à l'extinction de l'écran et le redémarrage du serveur))))).

Il est clair que je fais quelque chose de mal avec la classe CCanvas, mais je ne comprends pas ce qui ne va pas exactement.

Je pense que j'ai compris. Corrigez-moi si j'ai mal compris.

Dans mon code, à chaque tick, je crée une ressource avec des noms différents.

code de Canvas

      //--- generate resource name
      m_rcname="::"+name+(string)ChartID()+(string)(GetTickCount()+MathRand());
      //--- initialize data with zeros
      ArrayInitialize(m_pixels,0);
      //--- create dynamic resource
      if(ResourceCreate(m_rcname,m_pixels,width,height,0,0,0,clrfmt))

Et au prochain rafraîchissement de l'image, cette ressource n'est pas supprimée, apparemment.

L'objet est le même, mais les ressources y sont attachées différemment.

J'ai donc refait le code.

Je pense qu'il devrait être correct.

#include <Canvas\Canvas.mqh>
//+------------------------------------------------------------------+
void Comm(string txt, color clr = clrYellow, int FontSize = 20, string Font = "Consolas", int flag = FW_BOLD)
  {
   int shift = 0;
   if(ChartGetInteger(0, CHART_SHOW_ONE_CLICK))
      shift = 60;

   CCanvas canvas;
   canvas.FontNameSet(Font);
   canvas.FontFlagsSet(flag);
   canvas.FontSizeSet(FontSize);

   int width = 0, height = 0;
   string result[];
   int size = StringSplit(txt, StringGetCharacter("\n", 0), result);
   height = (int)(FontSize * 1.8 * size);

   for(int i = 0; i < size; i++)
     {
      int w = canvas.TextWidth(result[i]);
      if(width < w)
         width = w;
     }

   if(ObjectFind(0, "Comment") < 0)
      canvas.CreateBitmapLabel(0, 0, "Comment", 5, 20 + shift, width, height, COLOR_FORMAT_ARGB_NORMALIZE);
   else
      canvas.Attach(0, "Comment", width, height, COLOR_FORMAT_ARGB_NORMALIZE);
   canvas.Erase(0x00FFFFFF);

   for(int i = 0; i < size; i++)
      canvas.TextOut(0, (int)(FontSize * 0.8 * i), result[i], ColorToARGB(clr, 255));

   canvas.Update(true);
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii #:

Il n'écrit rien lors de la compilation. Il se désinstalle et se reconstruit. C'est tout.

Il fonctionne toujours sur le serveur. Je vais attendre, peut-être qu'il écrira quelque chose dans les logs.

"Magazine "Experts

 
Artyom Trishkin #:

Magazine des experts

Dans le Magazine des Experts, la propreté stérile.

//---

Nous avons généralement résolu la cause du problème.

Reste à savoir comment supprimer de la mémoire une ressource créée par kanvas à la fermeture du programme.

Je supprime l'objet, il a un nom, mais le nom de la ressource est "protected" et on ne peut en aucun cas la reconnaître.

Oui, la POO est une drôle de chose.

En fin de compte, j'ai dû déclarer canvas dans le global plutôt que dans le corps de la fonction et ajouter canvas.Destroy() au deinit ;

Le vol est très bien)

 

Bonjour et bonne humeur !

J'utilise depuis longtemps une fonction toute faite pour calculer le lot en fonction du risque, mais elle n'avait pas de liaison avec la taille du stop-loss. Aujourd'hui, j'ai décidé d'écrire ma propre fonction à partir de zéro sous la forme d'un script (pour faciliter la vérification), mais avec la prise en compte du stop loss. Voir la formule de calcul de la taille du lot (surlignée en jaune). J'ai peut-être oublié quelque chose.

Toutes sortes de vérifications concernant le lot minimum, maximum, le pas, etc., etc. n'ont pas été incluses, parce que je le ferai plus tard !

Cordialement, Vladimir.

//+------------------------------------------------------------------+
//|                                   Lot_Size_Depending_On_Risk.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
input double Risk=5;      // Размер риска
input uint Stop_Loss=500; // Размер стоп-лосса
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot_Size_Depending_On_Risk()
  {
   //--- определим валюту депозита
   string symbol="";
   string account_currency="";
   symbol=account_currency==AccountInfoString(ACCOUNT_CURRENCY) ? "EURUSDrfd" : "USDRUBrfd";
   double trading_account_currency=NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_BID),2);
   double lot=(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*Risk*0.01)/(Stop_Loss*trading_account_currency);
   return(lot);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Print(DoubleToString(Lot_Size_Depending_On_Risk(),2));
  }
//+------------------------------------------------------------------+
 
MrBrooklin #:

Bonne journée et bonne humeur à tous !

J'ai longtemps utilisé une fonction toute faite pour calculer le lot en fonction du risque, mais elle n'avait pas de liaison avec la taille du stop-loss. Aujourd'hui, j'ai décidé d'écrire ma propre fonction à partir de zéro sous la forme d'un script (pour faciliter la vérification), mais avec la prise en compte du stop loss. Voir la formule de calcul de la taille du lot (surlignée en jaune). J'ai peut-être oublié quelque chose.

Toutes sortes de vérifications concernant le lot minimum, maximum, le pas, etc., etc. n'ont pas été incluses, parce que je le ferai plus tard !

Cordialement, Vladimir.

Il est nécessaire de prendre en compte le coût d'un tick.

 
Alexey Viktorov #:

Veillez à prendre en compte le coût par tique.

Bonjour Alexey, merci de votre réponse. Dans un but d'auto-éducation, j'aimerais comprendre l'objectif de la prise en compte du coût d'un tick et également expliquer brièvement dans quelle partie de la formule il doit être appliqué, si vous le voulez bien. Je n'ai peut-être pas bien compris ce dont vous parlez.

Je vous prie d'agréer, Vladimir, mes salutations distinguées.

 
MrBrooklin #:

Bonjour Alexey, merci de votre réponse. A des fins d'auto-éducation, j'aimerais comprendre l'objectif de la prise en compte du coût par coche et expliquer brièvement dans quelle partie de la formule l'appliquer, si vous le voulez bien. Il se peut que j'aie mal compris ce dont vous parlez.

Cordialement, Vladimir.

Pour déterminer le montant qu'un trader est prêt à perdre en cas d'échec. Perte = Perte*valeur duip*lot. D'où - lot = perte acceptable/ (Perte*valeur du panier) La formule est approximative.

 
Alexey Viktorov #:

Déterminer le montant qu'un trader est prêt à perdre en cas d'échec. Perte = Perte*valeur du panier*lot. D'où - lot = perte acceptable/ (perte*valeur du panier) La formule est approximative.

Je vois. Je vais réfléchir à tête reposée à la manière de la mettre en œuvre. Merci pour vos conseils !

Cordialement, Vladimir.

 

Comment puis-je connaître l'heure de clôture d'une position dans le testeur ?

J'ouvre les positions 1, 2, 3

Je ferme les positions 3, 2, 1

Ni dans le rapport du testeur, ni dans le testeur lui-même, je n'ai trouvé comment trouver l'heure de fermeture d'une position particulière.

De même, dans le rapport que le testeur enregistre, il n'y a aucun moyen de connaître l'heure de clôture d'une position.


J'ai besoin de connaître l'heure d'ouverture et de fermeture d'une position. Comment ?

Dans une de ses bibliothèques,fxsaber écrit : "Merci aux développeurs d'avoir créé les caches du Testeur et d'avoir aidé à ouvrir ses formats".

Je n'arrive pas à comprendre la bibliothèque elle-même.

Je n'ai pu trouver que le format des fichiers opt.

Si quelqu'un sait où se trouvent sur le forum les fichiers tst - format single pass, merci de me donner un lien, je pourrais peut-être y trouver le position_ID.

fxsaber si vous lisez, merci de répondre.