Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 18

 
Dennis Kirichenko:
E posso chiedere perché statico?

Perché preso fuori contesto - vedi post originale.
 

una caratteristica non documentata della funzione OnInit(), questa funzione può essere eseguita in qualsiasi parte del programma. Codice di prova.

//+------------------------------------------------------------------+
//|                                                       test10.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNevBar
  {
private:
   datetime          curbar;
   datetime          lastbar;
public:
                     CNevBar();
                    ~CNevBar();
   bool              bar(string symbol,ENUM_TIMEFRAMES period);
  };
//+------------------------------------------------------------------+
void CNevBar::CNevBar()
  {

  }
//+------------------------------------------------------------------+
void CNevBar::~CNevBar(void)
  {

  }
//+------------------------------------------------------------------+
bool CNevBar:: bar(string symbol,ENUM_TIMEFRAMES period)
  {
   curbar=(datetime) SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar==0)lastbar=(datetime)SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar!=curbar)
     {
      lastbar=curbar;
      return(true);
     }
   return(false);
  }

int test=0;
CNevBar newbar;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   test=5;
   Print(__FUNCTION__,": test = ",test);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(newbar.bar(_Symbol,PERIOD_CURRENT))
     {
      test=10;
      Print(__FUNCTION__,": test = ",test);
      OnInit();
     }
  }
//+------------------------------------------------------------------+

Risultato

2017.03.10 19:26:02.977 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:27:03.041 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:27:03.042 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:28:03.245 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:28:03.245 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:29:02.995 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:29:02.995 test10 (EURUSD,M1)      OnInit: test = 5


...

 
Sergey Gritsay:

caratteristica non documentata della funzione OnInit(), questa funzione può essere eseguita in qualsiasi parte del programma. Codice di prova.


Tutte le funzioni On sono funzioni normali e quindi possono essere chiamate quando volete. OnCalculate o OnTradeTransaction.
 
fxsaber:

Tutte le funzioni On sono funzioni normali e, di conseguenza, possono essere chiamate quando si vuole. O OnCalculate o OnTradeTransaction.


Ma non è scritto nella documentazione

OnInit

La funzione OnInit() è il gestore dell'evento OnInit. Può essere di tipovoid oint e non ha parametri:

voidOnInit();

L'evento Init viene generato immediatamente dopo il caricamento di un Expert Advisor o di un indicatore, questo evento non viene generato per gli script. La funzione OnInit() è usata per l'inizializzazione. Se OnInit() ha il valore di ritorno int, il codice di ritorno non nullo significa inizializzazione non riuscita, e genera l'eventoDeinit con il motivo di deinizializzazione codeREASON_INITFAILED.

Per ottimizzare i parametri di ingresso di un esperto, si raccomanda di utilizzare i valori dell'enumerazioneENUM_INIT_RETCODE come codici di ritorno. Questi valori sono utilizzati per controllare il corso dell'ottimizzazione, compresa la selezione degli agenti diprova più appropriati. Durante l'inizializzazione di un Expert Advisor prima dell'inizio dei test è possibile richiedere informazioni sulla configurazione e le risorse di un agente (il numero di core, la quantità di memoria libera, ecc.) utilizzando la funzioneTerminalInfoInteger(). In base alle informazioni ottenute, potete permettere l'uso di questo agente di test o rifiutarne l'uso durante l'ottimizzazione di questo Expert Advisor.

ENUM_INIT_RETCODE

Identificatore

Descrizione

INIT_SUCCEED

Se l'inizializzazione è riuscita, si può continuare a testare l'Expert Advisor.

Questo codice ha lo stesso significato di zero - l'inizializzazione dell'Expert Advisor nel tester ha avuto successo.

INIT_FAILED

Inizializzazione fallita, i test non hanno senso a causa di errori irrecuperabili. Per esempio, non è riuscito a creare un indicatore che è necessario per il lavoro dell'Expert Advisor.

Il ritorno di questo valore significa lo stesso che il ritorno di un valore diverso da zero - l'inizializzazione dell'Expert Advisor nel tester è fallita.

INIT_PARAMETERS_INCORRECT

Progettato per indicare al programmatore un insieme errato di parametri di input. La stringa di risultato che contiene questo codice di ritorno sarà evidenziata in rosso nella tabella di ottimizzazione generale.

I test per questa serie di parametri dell'Expert Advisor non saranno eseguiti e l'agente è libero di ricevere un nuovo compito.

Al ricevimento di questo valore, il tester della strategia è garantito per non passare questo lavoro ad altri agenti per un'esecuzione ripetuta.

INIT_AGENT_NOT_SUITABLE

Nessun errore durante l'inizializzazione, ma per qualche motivo l'agente dato non è adatto ai test. Per esempio, RAM insufficiente, supportoOpenCL e così via.

Dopo il ritorno di questo codice, l'agente non riceverà compiti fino alla fine di questaottimizzazione.

La funzione OnInit() di tipo void significa sempre inizializzazione riuscita.

Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
Программы MQL5 / События клиентского терминала - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Quando scrivo codice nel fine settimana, inserisco OnTick in OnInit. E tutto va bene, anche se non ci sono nuove zecche in arrivo
 
Sergey Gritsay:


Ma non è scritto nella documentazione

OnInit

Lafunzione OnInit() è il gestore dell'evento OnInit. Può essere di tipovoid oint e non ha parametri:

voidOnInit();

L'evento Init viene generato immediatamente dopo il caricamento di un Expert Advisor o di un indicatore

Dice che è una funzione.

Prima di OnInit e dopo OnDeinit ci sono chiamate di costruttori/distruttori di oggetti globali (imprecisione nella Guida). Ecco perché, per esempio negli indicatori si possono dichiarare i buffer degli indicatori senza OnInit. I rudimenti sono i seguenti.

 
Laricerca di FullOnCalculate porta immediatamente a un sacco di caratteristiche completamente non documentate del lavoro con i buffer degli indicatori in MT4/MT5 - in alcuni punti differiscono seriamente.
 
Ecco la mia visione finale della soluzione del problema:
iCustom(... inputs, PRICE_CLOSE,
         color &colors[], int &widths[], int &styles[] );

iAlligator(... params, PRICE_CLOSE,
         color &colors[], int &widths[], int &styles[] );
Diciamo che un indicatore ha questi parametri:
#property indicator_plots 5
#property  indicator_color1 clrAquamarine, clrBeige, clrBurlyWood
#property  indicator_color2 clrRed, clrGreen

#property  indicator_color5 clrGold, clrCrimson, clrCadetBlue
allora la serie di colori per esso sarà la seguente:
color colors[] = {
   clrAquamarine, clrBeige, clrBurlyWood,  // 1 plot
   clrRed, clrGreen,                       // 2 plot
   clrBlack,                               // 3 plot
   clrWhite,                               // 4 plot
   clrGold, clrCrimson, clrCadetBlue,      // 5 plot
   clrBurlyWood, clrBlue                   // ignore
};

Se la matrice è più piccola, solo una parte dei colori viene trasferita. Se l'array è più grande, viene tagliato.

Per gli array di larghezza e stile, il principio è lo stesso.

 
fxsaber:

In OrderSendSync viene chiamato l'overloaded (vedi sopra) HistoryDealSelect.

Come posso determinare il tempo di apertura dell 'ultima posizione e il tempo di chiusura dell'ultima posizione?

E in generale, vorrei conoscere i principi generali e gli algoritmi per ottenere informazioni sulle posizioni aperte/chiuse su mql5.

Cosa bisogna prendere in considerazione, quali sono le specificità al momento?

 
Artyom Trishkin:

Come posso determinare il tempo di apertura dell 'ultima posizione e il tempo di chiusura dell'ultima posizione?

In generale, vorrei conoscere i principi generali e gli algoritmi per ottenere informazioni sulle posizioni aperte/chiuse in mql5.

Cosa bisogna considerare, quali sono le peculiarità del momento?


Tutto questo viene determinato selezionando l'ordine e la cronologia degli scambi e poi leggendo le proprietà degli ordini.

bool  HistorySelectByPosition( 
   long   position_id     // идентификатор позиции - POSITION_IDENTIFIER 
   );

IDENTIFICATORE DI POSIZIONE

L'identificatore di posizione è un numero unico, che viene assegnato ad ogni posizione appena aperta e non cambia durante la sua vita. Corrisponde al ticket dell'ordine con cui è stata aperta la posizione.

L'identificatore di posizione è specificato in ogni ordine (ORDER_POSITION_ID) e ogni trade (DEAL_POSITION_ID) che lo ha aperto, modificato o chiuso. Usa questa proprietà per cercare ordini e compravendite relative alla posizione.

Quando una posizione viene invertita in modalità netting (una singola operazione in/out), l'identificatore POSITION_IDENTIFIER della posizione non viene cambiato. Tuttavia, POSITION_TICKET è cambiato al biglietto d'ordine che ha portato all'inversione. Nella modalità di copertura non c'è inversione di posizione.

lungo


E usando le proprietà dell'enumerazione ENUM_DEAL_ENTRY

DEAL_ENTRY_IN

Entrata nel mercato

DEAL_ENTRY_OUT

Uscita dal mercato

INGRESSO_INOUT

U-turn

INGRESSO_FUORI_DA

Chiudere la posizione del contatore