Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1474

 
Artyom Trishkin #:

Sie verstehen den Sinn meiner Frage nicht. Sie brauchen nicht auf den Server zu warten, wenn er keinen Speicher mehr hat und ausläuft.

Wenn der Code ein Objektleck aufweist, kompilieren Sie ihn auf Ihrem lokalen Computer neu, während der Expert Advisor läuft - in den Protokollen sollte eine Meldung über die Anzahl und Art der ausgelaufenen Objekte angezeigt werden. Oder lassen Sie ihn auf einem Chart laufen und nehmen Sie ihn sofort herunter - auch hier sollte eine Meldung über das Leck erscheinen, falls es eines gibt, natürlich.

Beim Kompilieren wird nichts geschrieben. Es löscht sie und installiert eine neue. Das war's dann.

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

Auf dem Server funktioniert es noch. Ich warte ab, vielleicht schreibt es etwas in die Logs.

 
Aleksandr Slavskii #:

Ich habe versucht, eine Analogie zu diesem Kommentar zu erstellen, aber die Buchstaben waren größer.

Einige Zeit nach dem Ausführen des Expert Advisors mit einem Kommentar auf mehreren Charts, passiert etwas Schlimmes, bis hin zum Erlöschen des Bildschirms und dem Neustart des Servers)))))

Es ist klar, dass ich etwas mit der CCanvas-Klasse falsch mache, aber was genau falsch ist, verstehe ich nicht.

Ich glaube, ich habe es verstanden. Korrigieren Sie mich, wenn ich es falsch verstanden habe.

In meinem Code erstelle ich bei jedem Tick eine Ressource mit verschiedenen Namen.

Code von 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))

Und bei der nächsten Aktualisierung des Bildes wird diese Ressource anscheinend nicht gelöscht.

Das Objekt ist dasselbe, aber die Ressourcen sind ihm anders zugeordnet.

Also habe ich den Code neu erstellt.

Ich denke, er sollte korrekt sein.

#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 #:

Beim Kompilieren wird nichts geschrieben. Es deinstalliert und baut neu auf. Das war's.

Auf dem Server funktioniert es noch. Ich warte ab, vielleicht schreibt es etwas in die Logs.

Zeitschrift "Experten"

 
Artyom Trishkin #:

Experten-Magazin

Im Expertenmagazin: Sterile Sauberkeit.

//---

Wir haben die Ursache des Problems im Allgemeinen gelöst.

Bleibt die Frage, wie man eine von kanvas erstellte Ressource beim Schließen des Programms aus dem Speicher löscht.

Ich lösche das Objekt, es hat einen Namen, aber der Name der Ressource ist "geschützt" und man kann sie in keiner Weise erkennen.

Ja, OOP ist eine komische Sache.

Am Ende musste ich Canvas im Global statt im Funktionskörper deklarieren und Canvas.Destroy() an das Deinit anhängen;

Flug ist in Ordnung)

 

Guten Tag und gute Laune!

Lange Zeit habe ich eine vorgefertigte Funktion zur Berechnung des Lots in Abhängigkeit vom Risiko verwendet, die aber keine Bindung an die Stop-Loss-Größe hatte. Heute habe ich mich entschlossen, meine eigene Funktion von Grund auf in Form eines Skriptes zu schreiben (der Einfachheit halber), aber mit Berücksichtigung des Stop-Loss. Siehe die Formel zur Berechnung der Losgröße (gelb unterlegt). Vielleicht habe ich etwas übersehen.

Alle Arten von Überprüfungen auf minimale, maximale Losgröße, Schrittweite usw. usw. wurden nicht berücksichtigt, weil ich das später nachholen werde!

Mit freundlichen Grüßen, 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 #:

Guten Tag und gute Laune für alle!

Lange Zeit habe ich eine vorgefertigte Funktion zur Berechnung des Lots in Abhängigkeit vom Risiko verwendet, die aber keine Bindung an die Stop-Loss-Größe hatte. Heute habe ich mich entschlossen, meine eigene Funktion von Grund auf in Form eines Skripts zu schreiben (zur leichteren Kontrolle), aber mit Berücksichtigung des Stop-Loss. Siehe die Formel zur Berechnung der Losgröße (gelb unterlegt). Vielleicht habe ich etwas übersehen.

Alle Arten von Überprüfungen auf minimale, maximale Losgröße, Schrittweite usw. usw. wurden nicht berücksichtigt, weil ich das später nachholen werde!

Mit freundlichen Grüßen, Vladimir.

Es ist notwendig, die Kosten für einen Tick zu berücksichtigen.

 
Alexey Viktorov #:

Achten Sie auf die Kosten pro Tick.

Hallo Alexey, vielen Dank für deine Antwort. Um mich weiterzubilden, würde ich gerne verstehen, was es bedeutet, die Kosten für einen Tick zu berücksichtigen, und auch kurz erklären, in welchem Teil der Formel dies geschehen soll, wenn es Ihnen nichts ausmacht. Vielleicht habe ich nicht ganz verstanden, wovon Sie sprechen.

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin #:

Hallo Alexey, danke für deine Antwort. Zu meiner eigenen Weiterbildung möchte ich den Zweck der Berücksichtigung der Kosten pro Tick verstehen und auch kurz erklären, in welchem Teil der Formel sie anzuwenden ist, wenn es Ihnen nichts ausmacht. Vielleicht habe ich falsch verstanden, wovon Sie sprechen.

Mit freundlichen Grüßen, Vladimir.

Um den Betrag zu bestimmen, den ein Händler im Falle eines Fehlschlags zu verlieren bereit ist. Verlust = Verlust*Punktwert*Lot. Folglich - Lot = akzeptabler Verlust/ (Verlust*Pip-Wert) Die Formel ist ein Näherungswert.

 
Alexey Viktorov #:

Zur Bestimmung des Betrags, den ein Händler im Falle eines Fehlschlags zu verlieren bereit ist. Verlust = Verlust*Punktwert*Lot. Daher - Lot = akzeptabler Verlust/ (Verlust*Punktwert) Die Formel ist ein Näherungswert.

Ich verstehe. Ich werde in aller Ruhe darüber nachdenken, wie ich sie umsetzen kann. Vielen Dank für Ihren Rat!

Mit freundlichen Grüßen, Vladimir.

 

Wie kann ich den Zeitpunkt der Schließung einer Position im Tester herausfinden?

Ich öffne die Positionen 1, 2, 3

Ich schließe die Positionen 3, 2, 1

Weder im Bericht des Testers noch im Tester selbst habe ich herausgefunden, wie ich die Schließungszeit einer bestimmten Position herausfinden kann.

Auch in dem Bericht, den der Tester aufzeichnet, gibt es keine Möglichkeit, den Zeitpunkt des Schließens einer Position herauszufinden.


Ich muss den Zeitpunkt des Öffnens und Schließens einer Position herausfinden. Wie geht das?

In einer seiner Bibliotheken schreibtfxsaber: "Vielen Dank an die Entwickler für die Erstellung der Caches des Testers und die Unterstützung beim Öffnen seiner Formate".

Ich kann die Bibliothek selbst nicht verstehen.

Ich konnte nur das Format der opt-Dateien finden.

Wenn jemand weiß, wo auf dem Forum offenlegen tst-Dateien - Single-Pass-Format, bitte geben Sie mir einen Link, vielleicht kann ich Position_ID in ihnen zu finden.

fxsaber wenn Sie lesen, bitte antworten.

Grund der Beschwerde: