Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1474

 
Artyom Trishkin #:

Non hai capito il senso della mia domanda. Non è necessario attendere il server quando esaurisce la memoria e scoppia.

Se c'è una perdita di oggetti nel codice, ricompilatelo sul vostro computer locale con l'Expert Advisor in esecuzione - un messaggio sul numero e sul tipo di oggetti fuoriusciti dovrebbe essere visualizzato nei log. In alternativa, eseguitelo su un grafico e toglietelo subito: dovrebbe comparire anche un messaggio sulla perdita, se presente, ovviamente.

Non scrive nulla durante la compilazione. Lo cancella e ne installa uno nuovo. Questo è tutto.

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

Sta ancora lavorando sul server. Aspetterò, forse scriverà qualcosa nei log.

 
Aleksandr Slavskii #:

Ho provato a fare un analogo del commento, ma le lettere erano più grandi.

Qualche tempo dopo aver eseguito l'Expert Advisor con un commento su diversi grafici, succede qualcosa di brutto, fino allo spegnimento dello schermo e al riavvio del server)))))

È chiaro che sto facendo qualcosa di sbagliato con la classe CCanvas, ma non capisco cosa sia esattamente sbagliato.

Penso di aver capito. Correggetemi se ho capito male.

Nel mio codice, ad ogni spunta creo una risorsa con nomi diversi.

codice da 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))

E al successivo aggiornamento dell'immagine questa risorsa non viene cancellata, a quanto pare.

L'oggetto è lo stesso, ma le risorse sono collegate ad esso in modo diverso.

Ho quindi rifatto il codice.

Penso che dovrebbe essere corretto.

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

Non scrive nulla durante la compilazione. Disinstalla e ricostruisce. Tutto qui.

Sta ancora lavorando sul server. Aspetterò, forse scriverà qualcosa nei log.

"Rivista "Esperti

 
Artyom Trishkin #:

Rivista degli esperti

In Experts Magazine, pulizia sterile.

//---

In generale abbiamo risolto la causa del problema.

Resta da capire come cancellare dalla memoria una risorsa creata da kanvas alla chiusura del programma.

Cancello l'oggetto, ha un nome, ma il nome della risorsa è "protetto" e non è possibile riconoscerlo in alcun modo.

Sì, l'OOP è una cosa strana.

Alla fine ho dovuto dichiarare canvas nel globale invece che nel corpo della funzione e aggiungere canvas.Destroy() al deinit;

Il volo va bene)

 

Buon giorno e buon umore!

Per molto tempo ho utilizzato una funzione già pronta per calcolare il lotto in funzione del rischio, ma non aveva un legame con la dimensione dello stop-loss. Oggi ho deciso di scrivere la mia funzione da zero sotto forma di script (per facilitare il controllo), ma tenendo conto dello stop loss. Si veda la formula per il calcolo della dimensione del lotto (evidenziata in giallo). Forse mi è sfuggito qualcosa.

Tutti i tipi di controlli per il lotto minimo, massimo, step, ecc. ecc. non sono stati inclusi, perché lo farò più tardi!

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

Buona giornata e buon umore a tutti!

Per molto tempo ho utilizzato una funzione già pronta per calcolare il lotto in funzione del rischio, ma non aveva un legame con la dimensione dello stop-loss. Oggi ho deciso di scrivere la mia funzione da zero sotto forma di script (per facilitare il controllo), ma tenendo conto dello stop loss. Si veda la formula per il calcolo della dimensione del lotto (evidenziata in giallo). Forse mi è sfuggito qualcosa.

Tutti i tipi di controlli per il lotto minimo, il lotto massimo, il passo, ecc. ecc. non sono stati inclusi, perché lo farò in seguito!

Saluti, Vladimir.

È necessario tenere conto del costo di un tick.

 
Alexey Viktorov #:

Assicuratevi di considerare il costo per zecca.

Ciao Alexey, grazie per aver risposto. A scopo di autoformazione, vorrei capire a cosa serve prendere in considerazione il costo di un tick e anche spiegare brevemente in quale parte della formula dovrebbe essere applicato, se non ti dispiace. Forse non ho capito bene di cosa state parlando.

Saluti, Vladimir.

 
MrBrooklin #:

Ciao Alexey, grazie per aver risposto. A scopo di autoformazione, vorrei capire lo scopo di prendere in considerazione il costo per tick e anche spiegare brevemente in quale parte della formula applicarlo, se non ti dispiace. Forse non ho capito bene di cosa stai parlando.

Cordiali saluti, Vladimir.

Per determinare l'importo che un trader è disposto a perdere in caso di fallimento. Perdita = perdita*valore del pip*lotto. Quindi - lotto = perdita accettabile/ (perdita*valore del pip) La formula è approssimativa.

 
Alexey Viktorov #:

Per determinare l'importo che un trader è disposto a perdere in caso di fallimento. Perdita = perdita*valore del pip*lotto. Quindi - lotto = perdita accettabile/ (perdita*valore del pip) La formula è approssimativa.

Capisco. Penserò a mio piacimento a come implementarla. Grazie per il tuo consiglio!

Saluti, Vladimir.

 

Come posso conoscere l'ora di chiusura di una posizione nel tester?

Apro le posizioni 1, 2, 3

Chiudo le posizioni 3, 2, 1

Né nel report del tester né nel tester stesso ho capito come scoprire l'ora di chiusura di una particolare posizione.

Anche nel report che il tester registra, non c'è modo di scoprire l'ora di chiusura di una posizione.


Ho bisogno di scoprire l'ora di apertura e di chiusura di una posizione. Come?

In una delle sue libreriefxsaber scrive: "Grazie agli sviluppatori per aver creato le cache del Tester e aver contribuito all'apertura dei suoi formati".

Non riesco a capire la libreria stessa.

Ho trovato solo il formato dei file opt.

Se qualcuno sa dove sul forum si possono trovare i file tst - formato single pass, per favore datemi un link, forse posso trovare position_ID in essi.

fxsaber se leggi, per favore rispondi.

Motivazione: