Erreurs, bugs, questions - page 2016

 
A100:

Avec un algorithme de comptage glissant, seuls deux prix DBL_MAX sont nécessaires au début pour que l'ensemble du tampon devienne INF.

DBL_MAX + DBL_MAX = INF

et alors l'INF n'échappera plus aux calculs

Cette variante est assez probable car c'est DBL_MAX qui est rempli de valeurs inférieures à la période MAA. Il y a alors un bug dans la moyenne de l'algorithme récurrent - MODE_SMA.

C'est ainsi ! J'ai fait quelques changements et ça marche !

// Вычисляем Машку от Машки через хэндл самого себя
#property indicator_separate_window 
#property indicator_buffers 1 
#property indicator_plots   1 

#property  indicator_type1   DRAW_LINE 
#property  indicator_color1  clrRed 
#property  indicator_style1  STYLE_SOLID 
#property  indicator_width1  1 

input bool CustomData = false; // true - кастомный режим для iCustom
input int MAPeriod = 1 e1;      // Период МАшки

string GetMyName( void )
{
  const int Length = StringLen(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Indicators\\");
  const string Path = MQLInfoString(MQL_PROGRAM_PATH);
  
  return(StringSubstr(Path, Length, StringLen(Path) - Length - 4));
}

double Buffer[];
const bool Init = SetIndexBuffer(0, Buffer, INDICATOR_DATA);

const int handleMA = CustomData ? iMA(NULL, PERIOD_CURRENT, 100, 0, MODE_SMA, PRICE_OPEN) // от этой МАшки будет брать другую Машку, но не напрямую, а кастомно
                                : iMA(NULL, PERIOD_CURRENT, MAPeriod, 0, MODE_SMA, iCustom(_Symbol, PERIOD_CURRENT, GetMyName(), true));

int Replace( double &Array[], const double NewValue = 1 e3, const double PrevValue = EMPTY_VALUE )
{
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    if (Array[i] == PrevValue)
      Array[i] = NewValue;
      
  return(0);
}

int OnCalculate( const int rates_total,      // размер входных таймсерий 
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time 
                 const double& open[],       // Open 
                 const double& high[],       // High 
                 const double& low[],        // Low 
                 const double& close[],      // Close 
                 const long& tick_volume[],  // Tick Volume 
                 const long& volume[],       // Real Volume 
                 const int& spread[] )       // Spread 
{
  return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));
}

On peut affirmer avec certitude que l'algorithme récurrent iMA ne prend pas en compte le cas où DBL_MAX est alimenté à l'entrée. Bug.


@A100, Merci !

 

MetaEditor se bloque lorsqu'on essaie de compiler un fichier joint

S'il ne s'arrête pas tout de suite, attendez un peu ou allez à la ligne de résumé et voyez le temps de compilation.

Dossiers :
Test0.mq5  1 kb
 

Pourquoi ne pas afficher le numéro de commande/transaction dans une fenêtre pop-up lorsque l'on passe la souris dessus ? On l'a demandé il y a mille ans, ça manque tellement !

 
fxsaber:


return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));

De telles constructions doivent être évitées. L'ordre dans lequel les opérandes sont exécutés n'est pas réglementé en C++, c'est donc au compilateur individuel d'en décider. Les exceptions sont les opérateurs && et ||, où les opérandes sont toujours exécutés de gauche à droite.

 
Alexey Navoykov:

De telles constructions doivent être évitées. L'ordre dans lequel les opérandes sont exécutés en C++ n'est pas réglementé, c'est donc au compilateur individuel d'en décider. Les exceptions sont les opérateurs && et ||, où les opérandes sont toujours exécutés de gauche à droite.

Eh bien, nous sommes dans le MQL !

 
fxsaber:

Eh bien, nous sommes dans le MQL !

Nulle part dans la documentation il n'est question d'un ordre particulier. Ils peuvent donc la modifier comme bon leur semble à tout moment.

J'ai déjà contacté le service d'assistance une fois pour clarifier ce problème.

 

Bonjour. Pouvez-vous me dire quelles fonctions peuvent être utilisées pour obtenir la liste des indicateurs affichés sur le graphique et leurs paramètres ? Je n'ai trouvé qu'une fonction qui renvoie le nombre d'indicateurs sur le graphique

Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
  • www.metatrader5.com
У каждого графика можно посмотреть списки наложенных объектов: индикаторов, аналитических объектов и советников. Там же можно можно редактировать их свойства и удалять их с графика. Список индикаторов Индикаторы сгруппированы на наложенные на основное окно графика и на те, что открыты в отдельных окнах. Выберите индикатор и нажмите "Свойства...
 
Aleksandr Teleguz:

Bonjour. Pouvez-vous me dire quelles fonctions peuvent être utilisées pour obtenir la liste des indicateurs affichés sur le graphique et leurs paramètres ? Je n'ai trouvé que la fonction qui renvoie le nombre d'indicateurs dans le graphique.

IndicatorParameters (+ IndicatorRelease)

Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
  • www.mql5.com
//| Script program start function                                    |                          +                                    p,                                                                        parameters[p].integer_value,                                    parameters[p].double_value...
 
Alexey Navoykov:

Nulle part dans la documentation il n'est question d'un ordre particulier. Ils peuvent donc la modifier comme bon leur semble à tout moment.

Je ne m'embête pas avec ça. Il y a beaucoup de choses qui ne sont pas décrites ici.

Du haut de ma tête

  • Trier les enregistrements de l'historique de trading par temps dans MT4/5.
  • Possibilité d'initialiser une variable globale/statique par fonction - c'est relativement nouveau.
  • Paramétrage des directives du préprocesseur en une seule ligne - mais bientôt désactivé.
  • Exécution des opérandes de gauche à droite.
  • OrderSend est synchronisé à 99% avec l'environnement de trading.
  • ChartApplyTemplate est asynchrone.
  • Et il y a beaucoup d'autres subtilités non documentées. Et puis il y a des cas où la documentation ne correspond pas à la réalité. Et ce n'est pas un bug, mais un bug rare qui n'est tout simplement pas mentionné.

Le précédent était un rejet de casting, mais il y avait une raison à cela.

Donc ne pas utiliser quelque chose juste parce qu'il n'est pas décrit est une décision discutable.


Je pense qu'un tel code ne susciterait pas de doutes chez les programmeurs.

int Replace( double &Array[], int );

return(prev_calculated + Replace(Buffer, CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer)));

Cependant, ce n'est pas très joli. Il est logique d'écrire MyCopyBuffer mais il est laid de montrer dans un code court que vous en avez besoin pour éviter un bug. Ainsi, l'utilisation d'une priorité d'exécution d'opérande non documentée est juste suffisante pour montrer qu'il s'agit d'une solution temporaire.

 
Alexey Navoykov:

L'ordre dans lequel les opérandes sont exécutés en C++ n'est pas réglementé, c'est donc au compilateur individuel d'en décider.

L'ordre dans lequel les opérandes sont évalués ne peut pas être réglementé car il dépend du contexte.

#ifdef __MQL__
class A { public:
        A *operator +( A* ) { return NULL; }
};
template<typename T>
T f( int i ) { Print( __FUNCTION__, ":", i ); return NULL; }
void OnStart()
{
        int i = f<int>(1) + f<int>(2) + f<int>(3); //слева направо 1-2-3
        A  *a = f<A* >(1) + f<A* >(2) + f<A* >(3); //справа налево 3-2-1
}

#endif

Si elle est strictement réglementée, l'efficacité sera perdue dans l'un des deux cas suivants
Raison: