Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1334

 
Artyom Trishkin:
È stato Alexey che ha rifatto qualcosa nel codice che ho dato. O forse l'ho sottovalutato - l'ho scritto "in ginocchio" come semplice esempio per chiarire ciò che non ricordo più.

Forse Alexei può dircelo).

 
Valeriy Yastremskiy:

L'iterazione del ciclo non finirà e non ne inizierà una nuova, ma passerà al prossimo Se. La logica cambierà.

No. La condizione lì è originariamente impostata in modo che se il puntatore viene creato con successo, allora lo aggiunge alla lista. La staffa della curva è chiusa e se si verifica un errore, l'aggiunta non sarà eseguita. La logica è un po' diversa con l'operatore continue, ma il risultato è lo stesso.
 

Artyom Trishkin:
Это Алексей что-то переделывал в том коде, который я давал. А может и я недоглядел - писал "на коленке" в качестве простого примера для пояснения уже не помню чего.

//+------------------------------------------------------------------+
//| CNewBar Time Возвращает время нулевого бара                      |
//+------------------------------------------------------------------+
datetime CNewBar::Time(void)
  {
   datetime array[1], ret;
   ret = CopyTime(this.m_symbol, this.m_timeframe, 0, 1, array) == 1 ? array[0] : 0;
   return(array[0]);
 }
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar(void)
  {
   datetime tm = this.Time();
   if(tm == 0)
      return false;
   if(tm != this.m_time)
     {
      this.m_time = tm;
      return true;
     }
   return false;
  }


Artem, perché si usa la parola chiave this qui? Senza di essa i metodi funzionano con i membri della classe...

 
Mikhail Tkachev:

Alexey, grazie per una risposta così dettagliata.
Lo scopo della variabile ret nel frammento di codice dato non è chiaro...
Perché viene calcolato se il metodo restituisce comunque l'array[0]?
P.S.
E perché usare questo in un metodo di classe? Stiamo lavorando con i membri di questa particolare classe...


  1. Poiché la funzione CopyTime restituisce un valore, lasciatela tornare in una variabile, non peggiorerà la situazione... In caso di debug, potete controllare ciò che avete ottenuto.
  2. questo è stato scritto da Artyom. A quanto pare, si tratta di preferenze personali. Alcune persone lo scrivono se vogliono o non vogliono ::
ps; ho notato solo ora che il tipo di variabile ret datetime... Naturalmente dovrebbe essere di tipo int. Oh beh, dovrò sistemare anche questo...
 
Alexey Viktorov:
  1. Dal momento che la funzione CopyTime restituisce un valore, lasciatela tornare in una variabile, non peggiorerà la situazione... In caso di debug, potete controllare quello che avete.
  2. questo è stato scritto da Artyom. A quanto pare, si tratta di preferenze personali. Alcune persone, è necessario - non necessario scrivere ::

1. a cosa serve la funzione CopyTime?

2. Forse Artem risponderà su questo - è una preferenza personale o è necessario?

 
Mikhail Tkachev:

1. a cosa serve la funzione CopyTime?

2. Forse Artem risponderà su questo - è una preferenza personale o è necessario?

Non ti piace CopyTime(), sostituiscilo con iTime(). Non c'è differenza, l'importante è ottenere il tempo della barra corrente.

Nella mia testa ricordo vagamente quando è stato scritto. Penso di aver fatto anch'io questa domanda... E se non mi sbaglio, questo assicura che il riferimento sia solo ai metodi locali nel caso in cui ce ne siano di simili in altre classi. E naturalmente, Artyom chiarirà.

 
Alexey Viktorov:
No. La condizione lì è originariamente impostata in questo modo, se il puntatore viene creato con successo, allora aggiungilo alla lista. La staffa della curva è chiusa e se c'è un errore, l'aggiunta non sarà eseguita. La logica è un po' diversa con l'operatore continue ma il risultato è lo stesso.

Sì, il risultato è lo stesso, dentro è diverso. Penso che sia più veloce con la continuazione, anche se è il colore e la logica ....

 
Mikhail Tkachev:


Artem, perché la parola chiave this è usata qui? Perché anche senza di essa, i metodi funzionano con i membri della classe...

Lo faranno. Lo uso perché voglio che lo facciano :) Indica esplicitamente quali metodi di classe vengono utilizzati.

Se avete due classi, una come genitore e una come discendente, e avete due metodi con lo stesso nome, ma non sono virtuali per qualche motivo, dovete specificare esplicitamente quale usare.

Supponiamo che la classe padre sia CParent e la classe ereditata sia CInheritede che entrambe abbiano il metodo Method().

In questo caso, se chiamiamo un metodo Method() di una classe CParent, chiamerà esplicitamente un metodo della classe CParent - questo non è richiesto qui. Possiamo chiamare il metodo con o senza di esso.

Sechiamiamo un metodoMethod() in una classe ereditata CInherited,verrà chiamato anche il metododi quella classe, poiché cerchiamo prima un metodo appartenente alla classe da cui l'abbiamo chiamato.

Sechiamiamo CParent::Method() in una classe CInherited, è il metodo della classe genitore che sarà chiamato in questo modo, perché abbiamo esplicitamente specificato un metodo che appartiene alla classe genitore tramite l'operatore di risoluzione del contesto.

Ma comunque, chiamerei il metodo Method() in una classe ereditata CInherited con questo - per essere sicuri che questa (this == "questo") classe ereditata sarebbe stata chiamata.

Ci sono altre spiegazioni per usarlo. Forse qualcuno più esperto di OOP può dircelo.

 
Valeriy Yastremskiy:

Sì, il risultato è lo stesso, dentro è diverso. Penso che sia più veloce con la continuazione, anche se è il colore e la logica ....

Non dovrebbe esserci alcuna differenza. Mi sembra semplicemente più carino - meno parentesi e rientri.

 
Alexey Viktorov:
  1. Dato che la funzione CopyTime restituisce un valore, lasciatela ritornare in una variabile, non peggiorerà la situazione... In caso di debug, potete controllare quello che avete.
  2. questo è stato scritto da Artyom. A quanto pare, si tratta di preferenze personali. Alcuni lo scrivono, io non ne ho bisogno ::
ps; ho notato solo ora che il tipo di variabile ret datetime... Naturalmente dovrebbe essere di tipo int. Ma non importa, dovrò sistemare anche questo...

Beh, sì. Io sono uno di questi "alcuni", in particolare, quando chiamo una funzione standard dalla classe, specifico sempre il contesto globale. Solo perché posso pensare di scrivere in questa classe un metodo con lo stesso nome della funzione standard - così non dimenticherò mai cosa fa. Ed è qui che :: è utile per chiamare la funzione standard e questo è utile per chiamare il mio metodo con lo stesso nome.