Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 51

 
fxsaber:

Questo è un buon trucco. Il trucco è applicare il modello a TParent. Non ho mai visto niente del genere prima d'ora.

Beh, non è un'eredità multipla. In realtà è una catena Base -> A -> B -> C -> X. Chi vi impedisce di usarlo direttamente se è sufficiente?

 
Stanislav Korotky:

Beh, non è un'eredità multipla. In realtà è una catena Base -> A -> B -> C -> X. Chi vi impedisce di usarlo direttamente se è sufficiente?

Brevità.

 
fxsaber:

Brevità.

Non potrei essere più d'accordo. IMHO, prescrivere direttamente le quattro classi successive sarebbe più breve e più chiaro.

 
Stanislav Korotky:

Non potrei essere più d'accordo qui. IMHO, prescrivere direttamente le quattro classi successive sarebbe più breve e più chiaro.

Se, improvvisamente, viene introdotta l'eredità plurale, basta fare un piccolo cambiamento in una sola riga

class X : public INHERIT3(A, B, C)  {  };   // Объявляем класс, наследуемый от A, B, C
 
fxsaber:

Se, improvvisamente, viene introdotta l'eredità multipla, basterebbe una piccola sostituzione in una sola riga

Peccato che il forum non abbia una forma di scommessa oltre ai sondaggi - come un sondaggio con opzioni, ma bloccando qualche "penny" nel conto per la risposta. Coloro che scelgono l'opzione giusta otterrebbero le scommesse dei perdenti dopo l'evento ;-). Non credo che lo introdurrebbero.

 
Stanislav Korotky:

Beh, non è un'eredità multipla. In realtà è una catena Base -> A -> B -> C -> X. Chi vi impedisce di usarlo direttamente se è sufficiente?

Sì, ma l'intera caratteristica è che tutte le classi di origine sono definite e utilizzate come modelli. Quindi questa catena può essere impostata in qualsiasi ordine. In sostanza, non c'è nessuna differenza fondamentale con l'eredità multipla. Come ho già scritto, ci possono essere delle insidie con le classi. Per quanto riguarda le interfacce, tutto è identico. L'unica cosa è che sembrerà un po' crostoso, ma qui ognuno è libero di decidere se controllare o guidare )
 

Un'altra cosa che vorrei aggiungere. Un'alternativa completa all'ereditarietà multipla (e con opzioni più flessibili) potrebbe essere implementata tramite il sovraccarico dell'operatore ghost. Ma MQ per qualche ragione non aggiunge questa caratteristica di sovraccarico, anche se ho chiesto loro di farlo per molto tempo. E non ho nemmeno sentito una risposta concreta da loro, semplicemente lo ignorano.

 

Ci sono situazioni come questa

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

Bug, bug, domande

fxsaber, 2017.07.24 09:27

L'EA è compilato sotto il 1641 dove viene implementata la storia del trading veloce.

È possibile che l'ottimizzazione arrivi alla build 1596 di Agent, dove la cronologia funziona MOLTO lentamente, e di conseguenza ottenere un rallentamento dell'ottimizzazione molte volte?

Come caso più generale, l'ottimizzazione sul Cloud a volte dà risultati diversi non solo in termini di tempo, ma anche in termini di calcoli. A volte si può sentire che il risultato dell'ottimizzazione non coincide con una singola corsa.

Questo può essere dovuto al fatto che gli agenti coinvolti nell'ottimizzazione e un agente locale coinvolto in una singola corsa possono avere un numero di build diverso.

E ogni build contiene bug diversi. Per esempio, ecco un bug che è rilevante ora, ma che non era presente nelle build di qualche anno fa

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

Bug, bug, domande

fxsaber, 2017.07.17 23:08

Ancora una volta il bug di HistorySelect nel tester. Non sembrava averla nel 1626. Nel 1629 c'è.

#include <Trade\Trade.mqh>

void OnTick()
{
  static CTrade Trade;

  const datetime NowTime = TimeCurrent();
  
  if (Trade.Buy(1) && Trade.PositionClose(_Symbol) && HistorySelect(NowTime, NowTime))
  {
    Print(HistoryDealsTotal()); // 0 - это при том, что мы открыли и закрыли позицию в NowTime-время
      
    ExpertRemove();
  }
}

Di conseguenza, se il vostro EA colpisce l'agente b1626 durante l'ottimizzazione, potrebbe mostrare un risultato, ma quando viene eseguito sull'agente locale b1641 a esecuzione singola, uno completamente diverso.

Da questo, possiamo concludere che prima dell'ottimizzazione, dovresti essere consapevole di quali build vuoi ottimizzare il tuo EA e quali no.

Gli sviluppatori hanno fornito un cutter per gli agenti inadatti - INIT_AGENT_NOT_SUITABLE.


Pertanto, consiglierei di scrivere un controllo per la corrispondenza diTerminalInfoInteger(TERMINAL_BUILD) con i valori desiderati in OnInit per le ottimizzazioni basate su Cloud.

Ma è quasi impossibile conoscere l'elenco dei controlli che corrispondono alle vostre esigenze, quindi molto probabilmente scrivereste questo

int OnInit( void )
{
  // Если Агент не совпадает с билдом компиляции, отказываемся от его услуг
  if (TerminalInfoInteger(TERMINAL_BUILD) != __MQLBUILD__)
    return(INIT_AGENT_NOT_SUITABLE);
//....

Ma è anche una cattiva soluzione. Una soluzione più flessibile è quella di passare il vostro numero di build ad Agents durante l'ottimizzazione.


In generale, siate vigili.


SZY. È possibile generare un rapporto di scambio di ogni corsa dell'agente e ottenere il giusto durante l'ottimizzazione. Questo può aiutare a capire meglio perché il risultato del Cloud Agent è diverso da quello locale durante una singola esecuzione. La generazione automatica di tali rapporti durante l'ottimizzazione e l'esecuzione singola è possibile con l'aiuto di questa libreria.

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

Bug, bug, domande

Renat Fatkhullin, 2017.07.25 08:26

Periodicamente tagliamo le vecchie build nella clouda, in attesa che vengano aggiornate, cosa che passa molto velocemente e inosservata.

Questo non viene fatto per ogni versione, ma a seconda dell'importanza delle modifiche apportate.
Report
Report
  • voti: 12
  • 2017.07.19
  • fxsaber
  • www.mql5.com
Библиотека для MetaTrader 4/5, которая позволяет формировать отчеты по истории торгов.
 

Durante il debug (non necessariamente il debug), quando si vuole ridurre rapidamente l'intervallo di test nel tester, uso le seguenti funzioni

// Выгружает эксперт, если количество сделок в истории больше DealsNum.
void ConditionStopExpert( const int DealsNum = INT_MAX )
{
  if ((DealsNum != INT_MAX) && ::HistorySelect(0, ::TimeCurrent()) && ::HistoryDealsTotal() > DealsNum)
    ::ExpertRemove();

  return;  
}

// Выгружает эксперт, если с момента запуска прошло AmountHours-часов.
void ConditionStopExpert( const double AmountHours )
{
  static datetime FirstTime = ::TimeCurrent();
  
  if (::TimeCurrent() > FirstTime + (datetime)(AmountHours * 3600))
    ::ExpertRemove();

  return;  
}
 
fxsaber:

Durante il debug (non necessariamente il debugging), quando è necessario ridurre rapidamente l'intervallo di test nel tester, uso le seguenti funzioni

Correggete il codice, avete il numero 5 nella prima funzione invece di DealsNum.
Motivazione: