Toute question d'un PROFI à un SUPER PROFI - 1. - page 42

 
swanhearts:

Bonjour, on m'a envoyé un indicateur MA avec tous les niveaux dont j'ai besoin. Le problème est que lorsque je passe ma souris sur l'indicateur (chaque MA), il n'affiche pas la période de cette MA. Comment le réparer ? Il y a une erreur de syntaxe constante lors du changement de nomIndicatorShortName("MASHKI =)") ; Veuillez m'aider.

le nom du tampon de l'indicateur est défini à l'aide de SetIndexLabel

 

1. Quel est le moyen le plus simple de savoir que l'appel de la fonction est sur le même tick que l'appel précédent ?

bool tick_already_processed()
{
   return( ??? );
}

void some_func()
{
   if ( tick_already_processed() ) return;

   // recalculate only once on each tick
}

void OnTick()
{
   if ( A ) some_func();
   if ( B ) some_func();
   if ( C ) some_func();
}

Le temps (TimeCurrent) peut rester le même, le temps en ms de SymbolInfoTick, théoriquement aussi.

La comparaison des temps d'offre, de demande et de ms est assez coûteuse.

Je ne suggère pas d'organiser le contrôle dans le conseiller expert lui-même, je veux obtenir une fonction indépendante universelle.


La même question concerne les opérations commerciales. Comment savoir si quelque chose a changé dans la liste des ordres/positions (y compris les niveaux ouverts, SL et TP) depuis la dernière exécution ?

Je devrais placer un drapeau dans OnTrade (et le réinitialiser une fois terminé), c'est le moyen le moins cher.

Mais, encore une fois, j'aimerais une solution universelle.


Qui a une idée ?

 

Andrey Khatimlianskii: 

Exemple https://www.mql5.com/ru/code/16997

Fichier Resources.mqh.

Fonction IsNewPeriod


L'idée de base est d'utiliser une fonction avec des statiques à l'intérieur.

Vous pouvez le stocker dans ID = GetMicroSecondsCount pour vous en souvenir et vérifier les ticks.

Pour la même chose avec les commandes - vérifier la magie

Je n'ai pas vérifié le pseudo-code ci-dessous :)

bool IsNewTick(ulong newId) // GetMicrosecondCount() or magic
{
  static ulong id = 0;
  
  if (id != newId) 
  {
    id = newId;
    return true;
  }
  
  return false; 
}
 
Andrey Khatimlianskii:

2. Question similaire pour les métiers. Comment puis-je savoir si quelque chose a changé dans la liste des ordres/positions (y compris les niveaux ouverts, SL et TP) depuis la dernière exécution ?

En A, nous devons définir une sorte de drapeau dans OnTrade (et le réinitialiser après l'exécution), c'est le moyen le plus économique.

Mais, encore une fois, j'aimerais une solution universelle.


Qui a une idée ?

Ajoutez vos conditions (SL/TP etc.) ici.

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

Organiser un cycle de débordement des commandes

fxsaber, 2017.10.18 12:29

struct HISTORY_UNIT
{
  long Ticket;
  int Type;
  double Lots; 
    
  HISTORY_UNIT( void ) : Ticket(::OrderTicket()), Type(::OrderType()), Lots(::OrderLots())
  {
  }

  bool operator !=( const HISTORY_UNIT &Unit ) const
  {
    return((this.Ticket != Unit.Ticket) || (this.Type != Unit.Type) || (this.Lots != Unit.Lots));
  }
      
  bool IsChange( void )
  {
    const HISTORY_UNIT Tmp;
    const bool Res = (this != Tmp);
    
    if (Res)
      this = Tmp;
      
    return(Res);
  }
};

// Возвращает true только в случае, если с последнего вызова произошли торговые изменения
bool IsChange( void )
{
  static HISTORY_UNIT History[];  

  const int Total = OrdersTotal();  
  bool Res = (ArraySize(History) != Total);

  for (int i = 0, j = Res ? ArrayResize(History, 0, Total) : 0; i < Total; i++)      
    if (OrderSelect(i, SELECT_BY_POS))
    {
      if (Res || (Res = History[j].IsChange()))
        ArrayResize(History, j + 1, Total);
      
      j++;
    }
  
  return(Res);
}
 
Andrey Khatimlianskii:

1. Quel est le moyen le plus simple de savoir que l'appel de la fonction est sur le même tick que l'appel précédent ?

Le temps (TimeCurrent) peut rester le même, le temps en ms de SymbolInfoTick, théoriquement aussi.

La comparaison des temps d'offre, de demande et de ms est trop coûteuse.

Je ne suggère pas d'organiser le contrôle dans l'EA lui-même, je veux obtenir une fonction indépendante universelle.

Le problème ici n'est pas le prix, mais la fiabilité de la numérotation des tics. Je fais les choses suivantes dans mon EA.

#ifdef __MQL5__
#else // __MQL5__
  // В false-режиме если засекли изменения, то последующие вызовы не делают проверку.  
  static bool IsNotChange( const bool bInit = false )
  {
    static bool IsChange = false;
     
    if (bInit)
      IsChange = false;
      
  #ifdef  HISTORYTICKS_ISCHANGE
    if (bInit)
      HISTORYTICKS::IsChange();
    else if (!IsChange)
      IsChange = HISTORYTICKS::IsChange();
  #endif // HISTORYTICKS_ISCHANGE
    
    return(!IsChange);
  }
#endif // __MQL5__

Il s'agit de la version de la fonction pour MT4. Numérotation par indicateur d'espionnage.


Je n'inclus pas la version de la même fonction pour MT5 car les choses inutiles doivent être supprimées. Mais elle est basée sur cette fonction.

  // Свежие тики с последнего вызова
  static int GetFreshTicks( MqlTick &Ticks[], const datetime dFrom = 0 )
  {
    static long LastTime = 0;
    static int LastAmount = 0;

    if (dFrom)
    {
     ::Comment("Waiting Ticks from " + ::TimeToString(dFrom, TIME_DATE) + "...");

      LastAmount = 0;
    }
    
    ::ArrayFree(Ticks);
  
    int Size = (dFrom || LastTime) ? ::CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, dFrom ? (long)dFrom * 1000 : LastTime) : 0;
    
    if (Size > LastAmount)
    {
      LastTime = Ticks[Size - 1].time_msc;
      int NewLastAmount = 1;
      
      for (int i = Size - 2; (i >= LastAmount) && (Ticks[i].time_msc == LastTime); i--)
        NewLastAmount++;
        
      if (::ArrayRemove(Ticks, 0, LastAmount))
        Size -= LastAmount;
        
      LastAmount = NewLastAmount;
    }
    else
      Size = ::ArrayResize(Ticks, 0);
    
    return(Size);
  }


S'il renvoie une valeur non nulle - nouveau tick.

 
...:

L'idée de base est d'utiliser une fonction avec des statiques à l'intérieur.

Pour se souvenir et réconcilier les ticks, vous pouvez stocker dans ID = GetMicroSecondsCount

Merci !

Tout le problème réside dans cet identifiant unique (numéro de ticket), qui n'existe pas.

GetMicroSecondsCount n'aidera pas, car il changera entre les appels (c'est pour cela qu'il est conçu), alors que GetTickCount, théoriquement, ne peut pas changer sur 2 ticks adjacents.

 
fxsaber:

Le problème ici n'est pas le caractère bon marché, mais la fiabilité de la numérotation des tics. Dans une EA de combat, je le fais de cette façon.

Non, il sera certainement plus lent qu'une comparaison bid/ask/ms.

Quel est le problème de la fiabilité ? C'est seulement le fait de changer quelque chose qui compte.

 
fxsaber:

Ajoutez vos conditions (SL/TP etc.) ici.

Je me suis immédiatement souvenu de ce code.

Mais il s'agit simplement d'éviter une énumération inutile de tous les ordres.

Il est clair que nous pouvons faire de cette boucle une boucle unique pour l'ensemble de l'EA. Mais dans ce cas, nous devrions passer à la fonction un signe de changement (nous pouvons aussi bien ne pas l'appeler).

 
Andrey Khatimlianskii:

Non, elle sera certainement plus lente qu'une comparaison entre les cours d'achat et les cours de vente.

Quel est le problème de la fiabilité ? Tout ce qui compte, c'est que quelque chose change.

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

Toutes les questions de PROFi à SUPER PROFi - 1.

Andrey Khatimlianskii, 2020.03.05 23:46

Le temps (TimeCurrent) peut rester le même, le temps en ms de SymbolInfoTick, théoriquement, aussi.

Comparer l'offre, la demande et le temps dans msc est coûteux.

Particulièrement pertinent pour MT4 où le changement de pas de time_msc est de 1000ms.

 
Andrey Khatimlianskii:

Mais l'objectif est précisément d'éviter le chevauchement inutile de tous les ordres.

Il est clair que nous pouvons faire de ce cycle un cycle unique pour l'ensemble de l'EA. Mais alors nous devons passer à la fonction un signe de changement (nous pouvons aussi bien ne pas l'appeler).

Je ne comprends pas. Si quelque chose a changé dans la base de données, le seul moyen de le savoir est de le comparer avec l'état précédent de la base de données.

Vous pouvez comparer chaque élément de base de données correspondant. Ou vous pouvez calculer le hachage à partir d'eux et comparer les hachages.

Raison: