Questions des débutants MQL5 MT5 MetaTrader 5 - page 553

 
Vitalii Ananev:

Au lieu de Close[2] mettez la valeur de l'indicateur sur la deuxième barre (par exemple iRSI(.......,2) ) et au lieu de Close[1] mettez la valeur de l'indicateur sur la première barre. Et uroven est la valeur du niveau.

Et le reste, on vous l'a déjà dit plus haut.

Merci.
 
Pouvez-vous me dire si quelqu'un a vu un volume latéral du jour sur le côté droit du graphique pour mt5, pour mt4 je l'ai trouvé ici https://www.mql5.com/ru/code/9777. J'ai deux variantes : soit réécrire les variables dedans, soit en trouver une toute faite. Ou alors je ne vois pas l'intérêt de commander ,,,,,,, , je dois vérifier une théorie d'équilibre ,,,,. J'ai trouvé un travail pour mt5 où le profil de la journée d'hier est dessiné à gauche mais il y a un inconvénient important, il ne montre pas ce qui se passe aujourd'hui. Je veux donc ajouter au graphique des informations sur le côté droit de ce qui se passe au moment de la négociation.
Рыночный профиль ( Market Profile)
Рыночный профиль ( Market Profile)
  • votes : 6
  • 2006.10.11
  • Collector
  • www.mql5.com
Рыночный профиль ( Market Profile) использует альтернативное представление информации как о горизонтальном, так и о вертикальном движении рынка.
 
Maria Baburina:

Prérequis :


ProfitSellDBL est calculé ici

Profit_Upgr = 0.01

Tral_Start__Upgr est assimilé à une variable externe de type int et égale à 5.

Tral_Size__Upgr est pareillement égal à 4

TV - valeur de coche, =10

SumLotSellDBL = 0.04

Je l'ai lu. J'ai vu comment cela fonctionnerait si Tral_Start__Upgr, Tral_Size__Upgr et leurs variables externes étaient définies comme des doubles. C'est-à-dire lorsque tout est du même type sans aucune conversion ni perte de données. Le résultat est le même. Qu'est-ce que j'ai fait de mal ?
 
Maria Baburina:
Lisez. J'ai vu comment cela fonctionnerait si Tral_Start__Upgr, Tral_Size__Upgr et leurs variables externes étaient définies comme des doubles. C'est-à-dire lorsque tout est du même type sans aucune conversion ni perte de données. Le résultat est le même. Qu'est-ce que j'ai fait de mal ?

Un aveugle qui parle à un sourd. Si vous voulez que quelqu'un le teste, vous avez besoin du code minimum possible qui peut être compilé sur une autre machine et testé. Pas de code - rien à dire.

Ajouté : Utiliser le débogage:

-Préconfiguration

-Points d'arrêt

-Démarrer ledébogage

-Expressionsobservables

-Appeler StackView

-Débogageétape par étape

-Arrêter, reprendre et terminer le débogage

-Débogage de l'historique

 

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

Bugs, bugs, questions

comp, 2016.04.03 18:21

Erreur d'exécution

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1

class CLASS
{
public:
  double Buffer[];
  
  CLASS( void )
  {
    SetIndexBuffer(0, this.Buffer);
  }
};

CLASS* Class;

void OnInit( void )
{
  Class = new CLASS;
    
  delete Class;

  Class = new CLASS;

  Class.Buffer[0] = 0; // array out of range
  
  delete Class;
  
  return;
}

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[] )
{  
  return(rates_total);
}

En quatre, ça a bien marché ! En cinq, c'est une déception. Est-ce une autre limitation architecturale par rapport au quadruple ? Donnez-moi un lien vers une discussion sur ce sujet, je ne l'ai pas trouvé moi-même.


 
Ai-je bien compris que vous ne pouvez affecter quoi que ce soit aux tampons des indicateurs qu'après le premier appel du terminal lui-même (pas manuellement) à OnCalculate ?
 
comp:
Ai-je bien compris que l'on ne peut affecter quelque chose aux tampons d'indicateurs qu'après le premier appel du terminal (non manuel) OnCalculate ?

Les tampons des indicateurs sont accessibles après l'appel de OnCalculate(). En même temps, le tampon indicateur lui-même doit être déclaré dans la zone des variables globales:

//+------------------------------------------------------------------+
//|                                                  Accelerator.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Accelerator/Decelerator"

//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   1
#property  indicator_type1   DRAW_COLOR_HISTOGRAM
#property  indicator_color1  Green,Red
#property  indicator_width1  2
#property  indicator_label1  "AC"
//--- indicator buffers
double ExtACBuffer[];
double ExtColorBuffer[];
double ExtFastBuffer[];
double ExtSlowBuffer[];
double ExtAOBuffer[];
double ExtSMABuffer[];
//--- handles for MAs
int    ExtFastSMAHandle;
int    ExtSlowSMAHandle;
//--- bars minimum for calculation
#define  DATA_LIMIT 37
 

Je pense avoir trouvé ce que je cherchais, mais l'ancienneté du code donne une erreur

Aidez-moi à le réparer ...... si ça ne vous dérange pas trop.

et si vous pouvez m'aider à le tourner vers le côté droit de l'écran, ce serait génial.

Dossiers :
 
Karputov Vladimir:

Les tampons des indicateurs sont accessibles après l'appel de OnCalculate().

Il s'avère que vous avez tort. Vous ne pouvez appliquer que lorsque le terminal appelle OnCalculate. Dans ce cas, la condition dans MT4 est plus souple, car il suffit d'appeler OnCalculate une seule fois. Et dans MT5, vous devez attendre l'appel de OnCalculate par le terminal lui-même chaque fois après le SetIndexBuffer. Preuve

#property strict

#property indicator_chart_window
#property indicator_buffers 1

#ifdef __MQL5__
  #property indicator_plots 1
#endif   

#ifdef __MQL5__
  #define TRUE true
  #define FALSE false
#endif   

class CLASS
{
public:
  double Buffer[];
  
  CLASS( void )
  {
    ::SetIndexBuffer(0, this.Buffer);
  }

  #define  TIMESERIES(X)                                                  \
     ::ArraySetAsSeries(X, TRUE);                                        \
     Size = ::MathMin(Copy##X(::Symbol(), ::Period(), 0, bars, X), Size);  

  static int FullOnCalculate( void )
  {
    int Spread[];
    long RealVolume[];
    
    int Size = INT_MAX;
    
    #ifdef __MQL4__
      const int bars = ::Bars;
    #endif

    #ifdef __MQL5__
      const int bars = ::Bars(::Symbol(), ::Period());
    #endif

     TIMESERIES(Spread)
    TIMESERIES(RealVolume)
    
    #ifdef __MQL4__
      return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, Volume, Spread));
    #endif

    #ifdef __MQL5__
      datetime Time[];
      double Open[];
      double High[];
      double Low[];
      double Close[];
      long TickVolume[];
  
      TIMESERIES(Time)
      TIMESERIES(Open)
      TIMESERIES(High)
      TIMESERIES(Low)
      TIMESERIES(Close)
      TIMESERIES(TickVolume)
    
      return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, TickVolume, Spread));
    #endif    
  }  
};

CLASS* Class;

bool FirstRunOnCalculate = TRUE; // Необходимо TRUE, т.к. вызов OnCalculate только самим терминалом инициирует индикаторный буфер

void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam )
{
  if (id == CHARTEVENT_CHART_CHANGE)
  {
    Print(__FUNCTION__);
    
    ::OnDeinit();
    
    ::Class = new CLASS;
        
  if (!FirstRunOnCalculate)    
    CLASS::FullOnCalculate(); // Тут будет задница для MT5 (в MT4 - без проблем), т.к. после SetIndexBuffer в MT5 надо дожидаться вызова OnCalculate САМИМ терминалом
  }
  
  return;
}

void OnDeinit( const int Reason = 0 )
{
  if (::CheckPointer(::Class) == POINTER_DYNAMIC)
    delete ::Class;

  return;
}

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[] )
{  
  Print(__FUNCTION__);  

  if (FirstRunOnCalculate)
    FirstRunOnCalculate = FALSE;
  
  if (::CheckPointer(::Class) != POINTER_INVALID)
    ::Class.Buffer[0] = 0; // array out of range - MT5-ERROR!!!

  return(rates_total);
}

Dans MT4, cet indicateur fonctionnera sans problème, dans MT5, il se plantera avec une erreur. Il s'est avéré que dans MT4, il suffit d'attendre le premier appel de OnCalculate par le terminal et de faire ce que vous voulez avec les tampons, y compris leur redéfinition à l'aide de SetIndexBuffer. Mais dans MT5, après TOUS les SetIndexBuffer, il faut attendre le premier appel de OnCalculate par le terminal.

Cette particularité n'est documentée nulle part. Et il ne semble pas correspondre à la définition d'un "débutant".

Peut-on s'attendre à ce que ce comportement soit le même dans MT5 que dans MT4 ? C'est-à-dire qu'après le premier appel de OnCalculate par le terminal lui-même, il serait possible d'appeler SetIndexBuffer sans problème ?

 
comp:

Il s'avère que vous avez tort. Vous ne pouvez l'appeler que lorsque OnCalculate est appelé par le terminal lui-même. Dans ce cas, dans MT4, la condition est plus flexible, car vous ne devez appeler OnCalculate qu'une seule fois. Mais dans MT5, vous devez attendre l'appel de OnCalculate par le terminal lui-même à chaque fois après le SetIndexBuffer. Preuve

Dans MT4, cet indicateur fonctionnera sans problème, dans MT5, il se plantera avec une erreur. Il s'est avéré que dans MT4, il suffit d'attendre le premier appel de OnCalculate par le terminal, puis de faire ce que vous voulez avec les tampons, y compris leur redéfinition à l'aide de SetIndexBuffer. Mais dans MT5, après TOUS les SetIndexBuffer, il faut attendre le premier appel de OnCalculate par le terminal.

Cette fonctionnalité n'est documentée nulle part. Et il ne semble pas correspondre à la définition d'un "débutant".

Peut-on s'attendre à ce que ce comportement soit le même dans MT5 que dans MT4 ? C'est-à-dire qu'après le premier appel de OnCalculate par le terminal lui-même, il sera possible d'appeler SetIndexBuffer sans problème ?

Ne vous lancez pas dans le verbiage - naturellement, l'appel de OnCalculate implique un appel par le terminal lui-même, car
Lafonction OnCalculate() est appelée uniquement dans les indicateurs personnalisés lorsqu'il est nécessaire de calculer les valeurs de l'indicateur par l'événementCalculate. Cela se produit généralement lorsqu'un nouveau tick est reçu pour le symbole pour lequel l'indicateur est calculé. L'indicateur n'a pas besoin d'être attaché à un graphique de prix de ce symbole.
Raison: