Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 55

 
Alexey Navoykov:

Un'altra variante conveniente sarebbe l'ereditarietà protetta, quando la classe base ha tutti i metodi, e in una classe ereditata si mostra solo Get.E quando è necessario, lo si porta alla classe base.

Ho usato l'eredità protetta, ma ho fatto un casino con quella selezionata. Grazie!

Ma Metaeditor non ha ancora risolto il bug per cui tutti questi metodi vengono scaricati nella lista anche se non sono disponibili.

Non l'ho controllato ora, ma quando stavo sperimentando, è stato memorizzato e non è caduto.

 

Prima di modificare o cancellare un ordine devi fare un controllo

OrderGetInteger(ORDER_STATE) == ORDER_STATE_PLACED 

SB non ha questo, quindi dovete farlo voi stessi.


Non ha senso fare questo controllo nel Tester - tutti gli ordini correnti hanno sempre questo stato.

 

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

Mercato chiuso

fxsaber, 2017.09.22 09:45

// Время последнего тика символа
long GetSymbolTime( const string Symb )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(Symb, Tick) ? Tick.time_msc : 0);
}

// Время последнего тика Обзора рынка
long GetMarketWatchTime( void )
{
  long Res = 0;
  
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const long TmpTime = GetSymbolTime(SymbolName(i, true));
    
    if (TmpTime > Res)
      Res = TmpTime;
  }
  
  return(Res);
}

// Текущее время на торговом сервере без учета пинга
long GetCurrenTime( void )
{
  static ulong StartTime = GetMicrosecondCount();
  static long PrevTime = 0;
  
  const long TmpTime = GetMarketWatchTime();
  
  if (TmpTime > PrevTime)
  {
    PrevTime = TmpTime;
    
    StartTime = GetMicrosecondCount();
  }
  
  return(PrevTime + (long)((GetMicrosecondCount() - StartTime) / 1000));
}

void OnInit()
{
  MarketBookAdd(_Symbol);
}

void OnDeinit( const int )
{
  MarketBookRelease(_Symbol);
}

string TimeToString( const long Value )
{
  return((string)(datetime)(Value / 1000) + "." + (string)IntegerToString(Value % 1000, 3, '0'));
}

void OnBookEvent( const string& )
{
  Comment(TimeToString(GetCurrenTime()));
}
 

POSITION_TIME_UPDATE si riferisce solo al cambiamento del lotto di posizione. Per esempio, una chiusura parziale di una posizione in qualsiasi tipo di conto o una compensazione di una posizione.

I cambiamenti dei livelli SL/TP non influiscono su POSITION_TIME_UPDATE.

Parafrasando, POSITION_TIME_UPDATE è influenzato solo dalle modifiche riflesse nel Trade History - trades. I livelli SL/TP non si applicano a tali modifiche, quindi non le influenzano.

 

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

Riavvio di un EA

fxsaber, 2017.09.26 11:35

// Перезапуск себя
bool ExpertReopen()
{
  return(ChartSaveTemplate(0, __FILE__) && ChartApplyTemplate(0, __FILE__));
}
 

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

Bug, bug, domande

fxsaber, 2017.09.08 11:11

struct A
{
  int i;
};

struct B : public A {};

void OnStart()
{
  A a = {0};
  B b;
  
  b = (B)a; // cannot cast 'A' to 'B'
  
  b = a;    // так без проблем
}
Dal consiglio di amministrazione

È tutto qui.

Nel primo caso è un calco, nel secondo è un incarico.

La derivazione dal genitore al discendente è inammissibile

L'assegnazione ad un oggetto è una chiamata del corrispondente operatore di copia, in questo caso A::operator=(const A &) implicito

Grazie, quindi l'operatore di copia genitore rimane disponibile all'esternosolo in caso di eredità pubblica. Ho controllato, è vero.

struct A
{
  int i;
};

struct B : protected A {};

void OnStart()
{
  A a = {0};
  B b;
  
  b = a;    // 'A::operator=' - cannot access protected member function
}

È buono?

Con questo costrutto dobbiamo dichiarare un ulteriore costruttore di copia B::operator=(const A&) e "lanciare" la chiamata in A::operator= in esso

 

Opzioni per calcolare indicatori standard su dati personalizzati (senza creare indicatori aggiuntivi).

Базовые индикаторы, применяемые к кастомному инструменту
Базовые индикаторы, применяемые к кастомному инструменту
  • 2017.09.27
  • www.mql5.com
Здравствуйте. Задавал этот вопрос на английском форуме...
 

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

Mercato chiuso

fxsaber, 2017.09.22 09:45

// Время последнего тика символа
long GetSymbolTime( const string Symb )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(Symb, Tick) ? Tick.time_msc : 0);
}

// Время последнего тика Обзора рынка
long GetMarketWatchTime( void )
{
  long Res = 0;
  
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const long TmpTime = GetSymbolTime(SymbolName(i, true));
    
    if (TmpTime > Res)
      Res = TmpTime;
  }
  
  return(Res);
}

Bisogna buttare via i simboli personalizzati dal ciclo, perché in Market Watch possono essere impostati su qualsiasi tempo, anche 3000 anni.

 
In MQL5 è possibile scriverlo così
void OnTick()
{  
  double Buffer[];
  
  CopyBuffer(iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE), 0, 0, 1, Buffer);
}

Cioè "creare" una maniglia su ogni tick. Non verranno create nuove entità di indicatori, il tempo verrà sprecato solo nel confronto dei parametri di input di iMA con gli indicatori che sono stati avviati nei tick precedenti. Cioè esattamente la stessa cosa che si fa in MT4.

 
fxsaber:
In MQL5 è abbastanza accettabile scriverlo così

Cioè "creare" una maniglia su ogni tick. Non verranno create nuove entità di indicatori, il tempo verrà sprecato solo nel confronto dei parametri di input di iMA con gli indicatori che sono stati avviati nei tick precedenti. Cioè, esattamente la stessa cosa che si fa in MT4.

Avete misurato le prestazioni? Curioso di sapere quanto rallenterà le prestazioni. Soprattutto nel caso di indicatori personalizzati.

Motivazione: