Erreurs, bugs, questions - page 3155

 

Chers développeurs de terminaux mobiles, veuillez corriger dès à présent la gestion des e-mails dans l'onglet "Mail".

Avant la dernière version du terminal mobile (Android), lors de la connexion à un compte, l'onglet "Mail" est rempli d'e-mails qui ont été supprimés de nombreuses fois auparavant.

Dès que je me reconnecte au compte, je vois un fouillis d'e-mails précédemment supprimés et non supprimés dans l'onglet Courrier. Que dois-je faire pour m'en débarrasser ?

 

Veuillez expliquer ce qui change dans le terminal pour le PC "Outils > Paramètres > Afficher l'historique des transactions", si à n'importe quelle valeur de la case à cocher vous pouvez activer/désactiver l'affichage de l'historique des transactions via "PCM > Historique des transactions" et "F8 > Afficher l'historique des transactions" ?

C'est-à-dire que je peux désactiver l'affichage de l'historique des transactions dans les paramètres généraux du terminal, afin qu'il n'interfère pas avec celui-ci, alors qu'il sera affiché sur n'importe quel graphique s'il est activé dans les paramètres du graphique ou à l'aide du PCM. Je ne comprends pas la logique.

 

Chers développeurs du terminal PC. Depuis longtemps, lorsque l'on travaille avec des profils graphiques (pas des modèles, mais simplement des profils), il existe une logique étrange selon laquelle toute modification d'un profil entraîne automatiquement sa sauvegarde sans qu'il soit nécessaire de l'indiquer manuellement.

Des erreurs dans la personnalisation du profil par l'utilisateur ou une défaillance du terminal transforment un espace de travail difficile à configurer en citrouille.

Pourquoi ne pouvons-nous pas faire en sorte que tant que l'utilisateur n'enregistre pas manuellement le profil, les modifications apportées au profil ne soient pas sauvegardées (qu'elles soient enregistrées dans un fichier de profil temporaire et non dans le dernier profil utilisé) ?

Nous attendons depuis de nombreuses années des changements dans l'interface intégrée à la TradingView, ce n'est probablement pas difficile pour vous, et c'est très pratique pour les utilisateurs.

 

Pourquoi y a-t-il une telle différence, par exemple un test avec la case à cocher "profit en pips pour accélérer les calculs" un drawdown de 15%, et sans cette case à cocher un drawdown de 93% ?

Quel résultat est le plus correct ?

Le nombre de transactions est le même

Dans ce cas, un bénéfice de 2 livres dans le premier cas et de 20 livres dans le second cas avec le même lot.

Tout comme il est visible si vous changez le lot est également une différence de 10 dollars.

 
Merci. Vous ne voudriez pas txt
 
Les crypto-monnaies ont disparu des serveurs de MQ. Dégradation, tristesse et frustration.
 

Erreurs dans Generic/Queueueue.

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

[ERREUR POSSIBLE] Classe de conteneur CQueue

Loris De Marchi, 2022.02.14 13:00

Salut à tous ! !!

Je soupçonne qu'au moins dans les méthodes CQueueue::Contains(T item) et CQueueue::Remove(T item) il y a une erreur.

La file d'attente est gérée selon le système circulaire classique tête-queue, ce code doit donc être erroné :

 //+------------------------------------------------------------------+
//| Removes all values from the CQueue<T>.                           |
//+------------------------------------------------------------------+
template < typename T>
bool CQueue::Contains(T item)
  {
   int count=m_size;
//--- try to find item in array
   while (count--> 0 )
     {
       //--- use default equality function
       if (::Equals(m_array[count],item))
         return ( true );
     }
   return ( false );
  }

De plus, la description incorrecte de la méthode ci-dessus me fait penser que des erreurs ont pu être commises lors de l'écriture de cette classe.


La méthode Remove échoue clairement lors de l'exécution de ce code simple, par exemple :

   CQueue< ulong > foo;
   foo.Enqueue( 1 );
   foo.Remove( 1 );
   foo.Enqueue( 2 );
   printf (foo.Contains( 2 ));

Il imprime "false" lorsque l'élément est clairement dans la file d'attente...


Faites-moi savoir si cette classe est corrigée ou si je dois utiliser une des miennes.

Merci !


 

Bonjour, Nous savons que les tableaux dans MQL peuvent être à la fois indexés en avant et en arrière (séries). C'est pourquoi j'ai une question : quelle est la meilleure façon de travailler avec des tableaux dans MQL, si une série ou une indexation inverse est nécessaire ? La première variante pour obtenir la valeur par indice de la série peut se présenter comme suit.

double arrayValue(const double array[], conct int shift) {
  int len = (int)array.Size();
  if (shift < 0 || shift >= len)
    return WRONG_VALUE;
  return array[len - shift - 1];
}

La deuxième méthode consiste à utiliserArraySetAsSeries.

double arrayValue(double &array[], conct int shift) {
  int len = (int)array.Size();
  double ret;
  if (shift < 0 || shift >= len)
    return WRONG_VALUE;
  if (!ArraySetAsSeries(array, true))
    return WRONG_VALUE;
  ret = array[shift];
  ArraySetAsSeries(array, false);
  return ret;
}

Bien sûr, je n'affirme rien, mais je pense que parce que ArraySetAsSeries active simplement le drapeau série du tableau et lorsque l'accès à une valeur par indice se produit comme dans le premier exemple.

double arrayValue(const double array[], conct int shift) {
  int len = (int)array.Size();
  if (shift < 0 || shift >= len)
    return WRONG_VALUE;
  return array[len - shift - 1];
}

Et voici en gros comment il gère l'adressage de la valeur par l'index.

Est-il judicieux d'inclure chaque fois la série pour les tableaux dans le gestionnaire d'indicateur OnCalculate, ou serait-il préférable de traiter la barre basse en utilisant la longueur des tableaux rates_total ?

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]) 
{
  Print(price[rates_total-1]); // получение цены на младшем баре без использования серии
  return(rates_total);
}

Ces deux méthodes sont-elles aussi rapides l'une que l'autre ou est-ce que je me trompe dans mon raisonnement ?

 

Le terminal ne retourne pas le profit accumulé des positions fermées. Pouvez-vous me dire où se situe le problème ?

double GetClosedPositionsInstrumentProfit(string symbol, datetime from) 
{
   HistorySelect(from, TimeCurrent());

   double profitSum = 0;

      for (int i = HistoryDealsTotal()-1; i >= 0; i--) 
    {   
      ulong ticket = HistoryDealGetTicket(i);
      if (ticket < 0) continue; 
      long magic = HistoryDealGetInteger(ticket, DEAL_MAGIC);
      if (magic != EXPERT_MAGIC) continue; 
      string positionSymbol = HistoryDealGetString(ticket, DEAL_SYMBOL);
      if (symbol != positionSymbol) continue; 
      
      double profit = HistoryDealGetDouble(ticket, DEAL_PROFIT) + HistoryDealGetDouble(ticket, DEAL_SWAP)+ HistoryDealGetDouble(ticket, DEAL_COMMISSION);
      profitSum += profit; 
         
      Print ("Profit " + DoubleToString(profitSum,2));              
    }         
   return profitSum;
}
 

Bonjour !

S'il vous plaît, aidez-moi avec un petit code :

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{

//-- начальные установки --
 if(rates_total<3) return(0);
   
 int Start;
 
 if(prev_calculated<5)
  {
   Start=2;
   ArrayInitialize(Max1,EMPTY_VALUE);
   ArrayInitialize(Min1,EMPTY_VALUE);
  }
 
 else Start=rates_total-2;
   
//-- 1-й главный цикл --
  for(int i=Start;i<rates_total-1 && !IsStopped();i++)
    {
     if(high[i]>high[i+1] && low[i]>low[i+1])
      { 
       Max1[i]=high[i];
       Min1[i]=low[i];
      }
else if (high[i]<high[i+1] && low[i]<low[i+1])
      { 
       Max1[i]=high[i];
       Min1[i]=low[i];
      }
      else 
         {
          Max1[i]=EMPTY_VALUE;
          Min1[i]=EMPTY_VALUE;
         }

    }
 return(rates_total);
}

Elle exige qu'une barre donnée soit comparée à la barre précédente, mais c'est l'inverse qui se produit et elle la compare à zéro.