Il POF per gli scolari. - pagina 18

 
Alexey Viktorov:

Sì? Non crea un nuovo oggetto indipendente?

Controlliamo ora - inserisco delle linee come questa:

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CTrade::CTrade(void) : m_async_mode(false),
   m_magic(0),
   m_deviation(10),
   m_type_filling(ORDER_FILLING_FOK),
   m_log_level(LOG_LEVEL_ERRORS)

  {
   SetMarginMode();
//--- initialize protected data
   ClearStructures();
//--- check programm mode
   if(MQL5InfoInteger(MQL5_TESTING))
      m_log_level=LOG_LEVEL_ALL;
   if(MQL5InfoInteger(MQL5_OPTIMIZATION))
      m_log_level=LOG_LEVEL_NO;
//---
   Print(__FUNCTION__,", magic ",IntegerToString(m_magic));
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CTrade::~CTrade(void)
  {
//---
   Print(__FUNCTION__,", magic ",IntegerToString(m_magic));
  }

così come

//+------------------------------------------------------------------+
//| Buy operation                                                    |
//+------------------------------------------------------------------+
bool CTrade::Buy(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="")
  {
//---
   Print(__FUNCTION__,", magic ",IntegerToString(m_magic));


e uno script di prova:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
CTrade trade;   // Объект № 1 в глобальной области программы
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   trade.SetExpertMagicNumber(123);
//---
   CTrade trade;
   trade.Buy(0.1);
  }
//+------------------------------------------------------------------+


Risultato:

2019.10.09 11:25:44.645 Test_ru (EURUSD,H1)     CTrade::CTrade, magic 0
2019.10.09 11:25:44.645 Test_ru (EURUSD,H1)     CTrade::CTrade, magic 0
2019.10.09 11:25:44.645 Test_ru (EURUSD,H1)     CTrade::Buy, magic 0
2019.10.09 11:25:44.645 Test_ru (EURUSD,H1)     CTrade::OrderSend: instant buy 0.10 EURUSD at 1.09862 [auto trading disabled by client]
2019.10.09 11:25:44.645 Test_ru (EURUSD,H1)     CTrade::~CTrade, magic 0
2019.10.09 11:25:44.645 Test_ru (EURUSD,H1)     CTrade::~CTrade, magic 123


Viene creato un oggetto, poi un SECONDO (si scopre che non c'è ricreazione - ne viene creato uno nuovo), la posizione BUY viene aperta con la magia "0" - cioè, il secondo oggetto "trade" l'ha aperta.

Poi vediamo che i due oggetti vengono distrutti in ordine inverso: prima il secondo (con magia "0") e poi il primo (con magia "123").

 
Alexey Viktorov:

Sì? Non crea un nuovo oggetto indipendente?

Sì, sarà una nuova istanza della classeCTrade

eancora di più, il distruttore di CTrade sarà chiamatoall'uscita da void OnTick() e al prossimo OnTick() il costruttore di CTrade sarà chiamato di nuovo

 
Igor Makanu:

sì, ci sarà una nuova istanza della classeCTrade

Se il void OnTick() esce, il distruttore di CTrade sarà chiamato, e il prossimo OnTick() chiamerà di nuovo il costruttore di CTrade.

Sì, l'ho capito subito dopo la risposta di Artem.

Forum sul trading, sistemi di trading automatico e test di strategia

OOP per gli scolari.

Artyom Trishkin, 2019.10.08 20:23

È esattamente lo stesso che con le variabili.

E la messa a fuoco:

#include <Trade\Trade.mqh>
CTrade trade;   // Объект trade в глобальной области программы

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 CTrade *trade_ptr=GetPointer(trade);  // Указатель на объект trade
 trade_ptr.Buy(0.1);
}

 
Alexey Viktorov:

Secondo me, mql ha un insieme molto ristretto di compiti che devono essere risolti attraverso OOP. Il linguaggio stesso non mi sembra essere altro che un OOP in C++ o qualcosa del genere. E questa OOP è offerta sotto forma di una libreria standard. E a questo OOP si suggerisce di aggiungere, altrimenti non direi, un altro OOP. E poi un altro passo... Giustamente detto Warlock, anche se arrabbiato, ma benevolo, per i miei compiti OOP è come un cane giradischi. E a cosa serve impostare un problema e la sua successiva realizzazione per mezzo di OOP se questo problema senza problemi può essere risolto in stile procedurale.

Qui per esempio per prendere .mqh da fxsaber`a per scrivere codici per MT5 così come per MT4. Forse qualcuno ne ha bisogno, ma guarda chi. Coloro che non vogliono o non possono assolutamente padroneggiare mql5. Oppure prendete iCanvas da Nikolay...ho dimenticato il suo cognome. Sembra essere una libreria utile, ma non è facile capirla, e non c'è documentazione, nemmeno una minima descrizione. Non è una lamentela, scusa Nikolay, è un fatto. Così, quando ho deciso di provare a scrivere un'etichetta grafica, è stato più facile scriverla senza riferimento alla libreria standard o a quella di Nikolai.

In realtà, Alexey, puoi ottenere abbastanza informazioni su iCanvas dalla pagina di descrizione in KB.https://www.mql5.com/ru/code/22164. Dovete studiare attentamente i commenti nel codice. Il significato di tutte le funzioni è intuitivo dai loro nomi.

   double            X(double bar);        // The X coordinate by the bar number. The bar number must be of type double, otherwise, the bar will be interpreted as time.
   double            X(datetime Time);     // The X coordinate by the time.
   double            Y(double Price);      // The Y coordinate by the price.
   double            Price(int y);         // Price by the Y coordinate
   double            Bar(int x);           // bar number by coordinate X                                                                      
   datetime          TimePos(int x);       // time by coordinate X 
   double            Close(int x);     
   double            Open(int x);    
   double            High(int x);     
   double            Low(int x);     
 
   void              Comm(string text);                 // Print comment
   void              TextPosition(int x,int y);         // Setting the XY position for comment output in pixels
   void              TextPosition(double x,double y);   // Setting the XY position for outputting comments as a percentage of the width and height of the window
   void              CurentFont(string FontName="Courier New",int size=18,int LineStep=20,color clr=clrDarkOrchid,double transp=1.0);  // Set font options for comment. LineStep - step between lines. transp - transparency from 0 to 1
   void              LineD(double x1,double y1,double x2,double y2,const uint clr); // тоже самое что и Line в CCanvas, только без глюков и с double координатами
   int               TextPosX;      // Position X for comment text
   int               TextPosY;      // Position Y for comment text
   int               StepTextLine;  // line spacing for comment
   uint              TextColor;     // Font color for comment

Ma potrebbe avere ragione. Dovrei registrare un video della scrittura di qualche semplice ma utile indicatore usando iCanvas e spiegare visivamente alcune caratteristiche di questa classe. Ci sono ancora alcune sottigliezze.

Francamente parlando, non mi piace come è scritto iCanvas in questo momento. Voglio accartocciarlo, buttarlo nella spazzatura e riscriverlo in uno stile più corretto.

Il 70% del codice di questa libreria riguarda la velocizzazione di alcune delle funzioni regolari che sono necessarie per gestire le coordinate e l'accesso ai dati.

Quindi, se applicate questa classe, la grafica sarà più veloce che se lo fate "di testa" con CCanvas. Questa è la sua principale caratteristica e vantaggio. E, naturalmente, è davvero più facile formare grafici, figure, commenti.

Vorrei anche aggiungere, Alexey, che lo scopo di molte pubblicazioni in CodeBase, incluso fxsaber e le mie pubblicazioni è un disinteressato "solo per condividere - chi ne ha bisogno, lo capirà". Così spesso spendere tempo in istruzioni dettagliate è semplicemente una seccatura.

Soprattutto nel forum, ho postato molti esempi brevi e illustrativi utilizzando iCanvas.
Qui, per esempio:
https://www.mql5.com/ru/code/25929

https://www.mql5.com/ru/code/25113

https://www.mql5.com/ru/code/25414

https://www.mql5.com/en/code/24798

https://www.mql5.com/ru/forum/227736/page41#comment_13259627

https://www.mql5.com/ru/forum/227736/page24#comment_12836622

https://www.mql5.com/en/forum/323629#comment_13442470

https://www.mql5.com/ru/forum/321704#comment_13131995

https://www.mql5.com/ru/forum/317257/page3#comment_12341593

https://www.mql5.com/en/forum/229521/page2#comment_10258148


Easy Canvas
Easy Canvas
  • www.mql5.com
Данная библиотека и класс iCanvas упростит написание программ с применением Canvas. Вот пример простого индикатора с применением данной библиотеки и его демонстрация. Обратите внимание, что в данном примере в теле индикатора отсутствует функция обработки событий OnChartEvent. Но она также может и присутствовать. Особенности данной библиотеки...
 
Nikolai Semko:

In realtà, Alexey, puoi ottenere abbastanza informazioni su iCanvas dalla pagina di descrizione della KB. https://www.mql5.com/ru/code/22164 Dovete studiare attentamente i commenti nel codice. Il significato di tutte le funzioni è intuitivamente chiaro dai loro nomi.

Nikolai, non prestare attenzione alle mie parole. Ci sono così poche persone come me tra coloro che studiano programmazione, se non sono l'unico, che non vale la pena prestare loro attenzione.

Per me per imparare i commenti nel codice, bisogna prima imparare Aglitsky)).

Se avessi un bisogno urgente potrei spendere del tempo e tradurre tutti i commenti, cercare di capire la traduzione automatica e fare delle correzioni. Ma non ce n'è bisogno.

 
Alexey Viktorov:

Per esempio, prendete .mqh da fxsaber`a per scrivere codici per MT5 così come per MT4. Forse qualcuno ne ha bisogno, ma guarda chi... Coloro che non vogliono o non possono assolutamente padroneggiare mql5.

Penso di conoscere abbastanza bene MQL5, ma ho bisogno di una libreria di trading. Non sto parlando di MT4-style, ma di una libreria di trading per MT5, che sarebbe comoda e veloce da usare. E questa libreria non ha bug durante il trading reale.

Poiché una tale libreria non era disponibile (e non so se esiste) nel pubblico dominio, ho dovuto svilupparne una mia. A questo scopo ho dovuto decidere che tipo di strumento, sotto forma di un insiemedi funzioni di trading, avrei inventato. Preso in prestito il set MT4, in quanto piuttosto buono. Il che, come bonus, ha permesso di non scrivere la documentazione alla biblioteca e di studiarla. E altre chicche.

Quindi la conoscenza di MQL5 è a volte ad alto livello tra gli utenti.