Errori, bug, domande - pagina 1776

 

Errore di compilazione

template<typename T>
int f( const T& ) { return sizeof( T ); }
class A {};
void OnStart()
{
        const A * const a = new A; //Error: 'T' - unexpected token
        f( a );
}
 

Nella Guida di Metatrader 4 sull'indicatore iGator()

mode

[in]  Источник данных, идентификатор одной из линий индикатора. Mожет быть любой из следующих величин:

MODE_GATORJAW - синяя линия (линия челюсти аллигатора),
MODE_GATORTEETH - красная линия (линия зубов аллигатора),
MODE_GATORLIPS - зеленая линия (линия губ аллигатора).  


e sotto c'è un esempio

double diff=iGator(NULL,0,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_UPPER,1);


Fonte di dati MODE_UPPER, capisco che c'è un errore nell'aiuto

 

Errore di compilazione (o piuttosto nessun messaggio di errore)

class A {
        A() { ::ArrayResize( i1, 1 ); }
        int i1[ ];
        int i2[1];
        void f1() const { i1[0] = 0; } //нет сообщения ошибки
        void f2() const { i2[0] = 0; } //Error: 'i2' - member of the constant object cannot be modified

};
 

Ho trovato due errori durante la gestione dell'evento click del pulsante del mouse.

1. gestire l'evento del clic della rotellina del mouse in OnChartEvent(). L'idea è che la funzione genera l'evento (id == CHARTEVENT_MOUSE_MOVE) quando si clicca il tasto sinistro del mouse (con e senza tenerlo premuto), il tasto destro del mouse (con e senza tenerlo premuto), ma se si clicca la rotella, l'evento sarà generato solo quando la si tiene premuta. Cioè, se premete il tasto centrale e lo rilasciate immediatamente, l'evento non sarà generato!

2. Dopo aver elaborato la pressione del tasto sinistro del mouse (sparam == "1") verrà generato l'evento sparam == "0". Dopo aver cliccato il tasto destro del mouse (sparam == "2"), per qualche motivo l'evento sparam == "0" non viene generato. Non dovrebbero essere gestiti tutti i pulsanti del mouse allo stesso modo? Taccio sul clic sulla ruota, perché, come ho detto al punto 1 - nessun evento viene generato quando la ruota viene cliccata.

Controllare il codice:

#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Обработка события графика                                                                                                           |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   switch(id)
     {
      case CHARTEVENT_MOUSE_MOVE:
         FuncMove(lparam,dparam,sparam);
         break;
     }
  }
//+------------------------------------------------------------------+
//| Функция обработки события перемещения мыши                                                          |
//+------------------------------------------------------------------+
void FuncMove(const long lparam,// Х координата
              const double dparam,// Y координата
              const string sparam          // Строковое значение статуса кнопки
              )
  {
   Print(__FUNCTION__,": sparam = "+sparam);
  }
//+------------------------------------------------------------------+
//| Функция деинициализации индикатора                                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Отписываемся от события передвижения мыши
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
 
A100:

Errore di compilazione (o piuttosto nessun messaggio di errore)

class A {
        A() { ::ArrayResize( i1, 1 ); }
        int i1[ ];
        int i2[1];
        void f1() const { i1[0] = 0; } //нет сообщения ошибки
        void f2() const { i2[0] = 0; } //Error: 'i2' - member of the constant object cannot be modified

};
nella funzione f1, lo stato dell'oggetto A non è cambiato, lo stato degli elementi dell'array A::i1 cambia, gli elementi A::i1 non appartengono all'oggetto A
nella funzione f2, lo stato dell'oggetto A cambia, perché l'array A::i2 non è dinamico - tutti i suoi elementi appartengono all'oggetto A
 
Dratuti. Domanda: Come posso inviare un messaggio a un utente con cui non ho ancora corrisposto su browser mobile (android, apple)? Ho guardato da diversi dispositivi - da nessuna parte c'è un pulsante "invia un messaggio", così come "aggiungi agli altri". La pagina dell'utente ha un aspetto simile a questo, senza pulsanti:
 

Errore di compilazione

class A {};
class B {
        int A() { return 0; }
        void f( int ) {}
        void g() { f(A()); } //Error: 'A' - invalid cast operation
};
 
Andrey Sokolov:
Dratuti. Domanda: come faccio a inviare un messaggio a un utente con cui non ho ancora corrisposto sui browser mobili (android, apple)? Ho guardato da diversi dispositivi - da nessuna parte c'è un pulsante "invia un messaggio", così come "aggiungi agli altri". La pagina dell'utente ha un aspetto simile a questo, senza pulsanti:

Lo dico da molto tempo. Finora non hanno detto nulla.

 
Alexey Kozitsyn:

Trovati due errori nella gestione degli eventi del pulsante del mouse.


Controlliamo.
 
Alexander:
Controllare.

Grazie, controlla il numero della prima barra visibile sul grafico: ChartGetInteger( 0, CHART_FIRST_VISIBLE_BAR );

Il punto è che se disabilitate lo scorrimento del grafico e monitorate l'ultima barra visibile, allora al momento di una nuova candela il suo numero cambia per qualche motivo, anche se il grafico non si muove! Il TF è M1 per poter controllare più velocemente. Iniziare dall'indicatore:

#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
   {
    //--- Подписываемся на событие движения мыши
         ChartSetInteger( 0, CHART_EVENT_MOUSE_MOVE, true );
         //---
    return(INIT_SUCCEEDED);
   }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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);
   }
//+------------------------------------------------------------------+
//| Обработка события графика                                        |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
   {
    switch( id )        
        {
         case CHARTEVENT_MOUSE_MOVE:
                 Print( __FUNCTION__," "+TimeToString( TimeCurrent(), TIME_DATE|TIME_SECONDS )+": sparam = "+sparam+", ",(int)ChartGetInteger( 0, CHART_FIRST_VISIBLE_BAR ));
                 break;
        }
   }