Caractéristiques du langage mql5, subtilités et techniques - page 55

 
Alexey Navoykov:

Une autre variante pratique serait l'héritage protégé, quand la classe de base a toutes les méthodes, et dans une classe héritée vous ne montrez que Get.Et quand c'est nécessaire, vous l'amenez à la classe de base.

J'ai utilisé l'héritage protégé, mais je me suis trompé avec l'héritage sélectionné. Merci !

Mais Metaeditor n'a toujours pas corrigé le bug qui fait que toutes ces méthodes sont placées dans la liste même si elles ne sont pas disponibles.

Je ne l'ai pas vérifié maintenant, mais lorsque j'expérimentais, il était stocké en mémoire et il ne s'est pas éteint.

 

Avant de modifier ou de supprimer une commande, vous devez effectuer un contrôle

OrderGetInteger(ORDER_STATE) == ORDER_STATE_PLACED 

SB n'en dispose pas, vous devez donc le faire vous-même.


Il est inutile d'effectuer cette vérification dans le testeur - tous les ordres en cours ont toujours ce statut.

 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Marché fermé

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 ne concerne que le changement du lot de position. Par exemple, une clôture partielle d'une position dans n'importe quel type de compte ou une compensation d'une position.

Les modifications des niveaux SL/TP n'affectent pas POSITION_TIME_UPDATE.

Pour paraphraser, POSITION_TIME_UPDATE est uniquement affecté par les modifications reflétées dans l'historique des transactions - trades. Les niveaux SL/TP ne s'appliquent pas à ces modifications, elles ne les affectent donc pas.

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Réinitialisation d'une EE

fxsaber, 2017.09.26 11:35

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

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Bugs, bugs, questions

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;    // так без проблем
}
Du conseil d'administration

Tout est là.

Dans le premier cas, il s'agit d'une distribution, dans le second, d'une affectation.

La dérivation du parent au descendant est inadmissible.

L'assignation à un objet est un appel de l'opérateur de copie correspondant, dans ce cas implicite A::operator=(const A &)

Merci, donc l'opérateur de copie parentale reste disponible à l'extérieuruniquement en cas d'héritage public. J'ai vérifié, c'est exact.

struct A
{
  int i;
};

struct B : protected A {};

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

C'est bon ?

Avec cette construction, nous devrions déclarer un constructeur de copie supplémentaire B::operator=(const A&) et "jeter" l'appel à A::operator= dans celui-ci

 

Options pour mettre en œuvre le calcul d'indicateurs standard sur des données personnalisées (sans créer d'indicateurs supplémentaires).

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

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Marché fermé

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);
}

Il faut jeter les symboles personnalisés de la boucle, car dans Market Watch, ils peuvent être réglés sur n'importe quel temps, même 3000 ans.

 
Dans MQL5, il est possible de l'écrire comme ceci
void OnTick()
{  
  double Buffer[];
  
  CopyBuffer(iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE), 0, 0, 1, Buffer);
}

C'est-à-dire "créer" une poignée sur chaque tique. De nouvelles entités d'indicateurs ne seront pas créées, le temps sera uniquement perdu à comparer les paramètres d'entrée d'iMA avec les indicateurs qui ont été lancés aux ticks précédents. C'est-à-dire exactement la même chose que ce qui est fait dans MT4.

 
fxsaber:
Dans MQL5 il est tout à fait acceptable de l'écrire comme ceci

C'est-à-dire "créer" une poignée sur chaque tique. De nouvelles entités d'indicateurs ne seront pas créées, le temps sera uniquement perdu à comparer les paramètres d'entrée d'iMA avec les indicateurs qui ont été lancés aux ticks précédents. C'est-à-dire exactement la même chose que ce qui est fait dans MT4.

Avez-vous mesuré les performances ? Je suis curieux de savoir à quel point cela va ralentir les performances. Surtout dans le cas d'indicateurs personnalisés.