Errori, bug, domande - pagina 742

 
TheXpert:
Quindi fate una fabbrica. Questo risolverebbe il problema.

È abbastanza facile lavorare lì dentro così com'è. L'oggetto è strutturato abbastanza rigidamente. Chiama un metodo virtuale Load di ogni suo membro, che a sua volta fa lo stesso. All'inizio di ogni blocco di dati (oggetto) viene scritto l'ID del tipo (per il controllo durante il caricamento). Non c'è altro da dire. È una specie di fabbrica autocostruita.

Ha senso fare una fabbrica se il tipo precedentemente sconosciuto può essere nel file. Allora la fabbrica e la tabella del registro dei tipi saranno necessarie. Anche se il problema non era così risolto, ci sono riuscito con graffette e nastro adesivo. :)

 

Il fan di Gunn.

Se il secondo punto di ancoraggio è nel futuro, l'angolo cambia.

Inoltre, questo oggetto ha alcuni problemi con la copia (con Ctrl premuto). Molto spesso non copia, ma trascina l'originale, e ci vuole il terzo o quinto tentativo per copiare.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов - Документация по MQL5
 
MetaDriver:

Ok, perfetto.

Slava, posso chiedere (per lo sviluppo generale) perché non puoi inizializzare la tabella dei metodi virtuali all'inizio del costruttore (dopo l'inizializzazione dell'antenato)?

Te l'ho già detto. I costruttori lavorano in una gerarchia. Mentre un antenato viene costruito, non ci sono informazioni sui discendenti.
 
stringo:
Te l'ho già detto. I costruttori elaborano la gerarchia. Finché un antenato viene costruito, non ci sono informazioni sui discendenti.

L'ho già letto. E l'ho capito molto bene. E ho fatto una domanda basata sulla mia comprensione di ciò che ho letto. Cercherò di renderlo più chiaro, con immagini.

class MySecond: MyFirst
{
  void  MySecond(MyArg arg): 
    MyFirst(arg)
   { // Можно код инициализации VMT добавлять здесь. Тогда не будет проблем с виртуальными вызовами.
     ...............
     MyVirtualFunc();
      ...........
     return;
   } // Сейчас код инициализации VMT добавляется здесь.

};

Capisco tutto, è più difficile da fare, ci sono ogni sorta di sottigliezze. È molto più facile e versatile (per voi) scrivere tutta l'inizializzazione implicita alla fine. E credo anche prima che "nessuno lo fa" e che "non è usuale in C++" ecc.

Ma per noi (utenti), è più semplice, universale, ragionevole e logico considerare il costruttore MySecond() come un territorio della classe MySecond e non MyFirst. Pensate a cosa è più facile: far funzionare le funzioni virtuali nei costruttori o esprimere importanti e serie restrizioni sul codice dei costruttori nella documentazione in diversi punti, e, nonostante ciò, ricevere regolarmente importanti e seri messaggi dai neofiti al Service Desk e al Forum "riguardo ai bug virtuali nei costruttori". Anche questo è un fattore serio - i neofiti sono attesi molto presto...

 
struct SDaylyRange {double min, max, open, close;};
void OnStart()
  {
//---
   SDaylyRange tmp, tmp2;
   tmp = 2+3 ? tmp : tmp2;
   if (2+3) tmp = tmp; else tmp = tmp2;
  }

L'operatore tensore con strutture porta a un errore di generazione del codice (anche se se lo sostituite con if, funziona)

 

Ricevo regolarmente l'errore 4401

ERR_HISTORY_NOT_FOUND

Il seguente codice indicatore

datetime prevTime[22];
MqlRates _Rates[];

bool IsNewBar(ENUM_TIMEFRAMES period) {
   datetime currentTime[1];
   CopyTime(Symbol(), period, 0, 1, currentTime);
   int _;
   switch (period) {
      case PERIOD_M1  : _= 1;
         break;
      case PERIOD_M2  : _= 2;
         break;
      case PERIOD_M3  : _= 3;
         break;
      case PERIOD_M4  : _= 4;
         break;
      case PERIOD_M5  : _= 5;
         break;
      case PERIOD_M6  : _= 6;
         break;
      case PERIOD_M10 : _= 7;
         break;
      case PERIOD_M12 : _= 8;
         break;
      case PERIOD_M15 : _= 9;
         break;
      case PERIOD_M20 : _= 10;
         break;
      case PERIOD_M30 : _= 11;
         break;
      case PERIOD_H1  : _= 12;
         break;
      case PERIOD_H2  : _= 13;
         break;
      case PERIOD_H3  : _= 14;
         break;
      case PERIOD_H4  : _= 15;
         break;
      case PERIOD_H6  : _= 16;
         break;
      case PERIOD_H8  : _= 17;
         break;
      case PERIOD_H12 : _= 18;
         break;
      case PERIOD_D1  : _= 19;
         break;
      case PERIOD_W1  : _= 20;
         break;
      case PERIOD_MN1 : _= 21;
         break;  
      default         : _= 0;    
   } 
   if(currentTime[0]== prevTime[_]) return(false);
   else {
      prevTime[_] = currentTime[0];
      return(true);
   }
}

int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| 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[]) 
if (IsNewBar(_Period)) {
    int err = CopyRates(Symbol(), PERIOD_D1, 0, 2, _Rates);
   Print("Count:", err);
   if (err < 1) {
       Print("ERROR:", GetLastError());
       Print("__Symbol:", Symbol());
       return(rates_total);
   }

}
return(rates_total); 
}

produrrà un errore immediatamente all'avvio (se non su D1). O meglio, una volta dopo l'avvio del terminale e l'apertura del grafico - per mettere l'indicatore, otterremo un errore. Se il terminale non è chiuso, allora non ci sarà questo errore all'inizio.

Ma dopo un po' di tempo (un paio d'ore - 2 ore sono state sufficienti per me) vedremo che otterremo l'errore sul grafico già aperto. (L'ho eseguito su m30)

 

Salve, signori sviluppatori!

Possiamo fare dei cambiamenti nel compilatore MQL5 per darci almeno un avvertimento?

per errori di questo tipo nel codice.

if(Flag_Exitl=true) {break;}


La condizione di confronto qui non è corretta (dovrebbe essere == ), ecco perché sarà sempre break.

Come affrontare questa situazione nel compilatore (se è possibile), in modo che io possa avere meno scossoni quando scrivo il codice?

(Ho pensato che non funzionerà, sembra separare l'assegnazione e il confronto in if, poi la domanda viene rimossa).

 
Fia:

Salve, signori sviluppatori!

È possibile cambiare il compilatore MQL5 per dare almeno un avvertimento?

per errori di questo tipo nel codice.

if(Flag_Exitl=true) {break;}


La condizione di confronto non è corretta (dovrebbe essere == ), ecco perché sarà sempre break.

Come affrontare questa situazione nel compilatore (se possibile), in modo che io possa avere meno scossoni quando scrivo il codice?

(Ho pensato che non funzionerà, potrei dividere l'assegnazione e il confronto in if, così la domanda viene rimossa).

La condizione può essere scritta in modo errato, ma è consentita in MQL5.

Traduco quello che hai codificato: assegna un valore vero alla variabile Flag_Exitl e poi controlla se Flag_Exitl è vero, quindi interrompi.

La sequenza delle azioni è esattamente così.

 

Non capisco bene come lavorare con i buffer che non devono essere mostrati sullo schermo.

Secondo il codice qui sotto per qualche motivo

1) non disegna nulla

2) entrambi i buffer si chiamano Label1

anche se contengono i dati giusti

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   2

//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_color1  clrRed, clrWhite
#property indicator_type1   DRAW_COLOR_LINE

//--- plot Label2
#property indicator_label2  "Label2"
#property indicator_color2  clrRed, clrGreen
#property indicator_type2   DRAW_COLOR_LINE

//--- indicator buffers
double         L1_1[];
double         L2_1[];
double         Colors_1[];

//--- indicator buffers
double         L1_2[];
double         L2_2[];
double         Colors_2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0,L1_1,INDICATOR_DATA);
   SetIndexBuffer(1,L1_2,INDICATOR_DATA);
   SetIndexBuffer(2, Colors_1,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3, Colors_2,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4, L2_1, INDICATOR_CALCULATIONS);
   SetIndexBuffer(5, L2_2, INDICATOR_CALCULATIONS);
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
{
   for (int i = 0; i < rates_total; i++)
   {
      L1_1[i] = i;
      L1_2[i] = i + 1;
   }
   return(rates_total);
}
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 

Salve. Forse sto scrivendo nella direzione sbagliata, ma spero che tu possa indicarmi la direzione giusta. Dove andare con una domanda su Web API per mt5? )

Cercherò di spiegare la situazione, nel caso. Ho МТТ manager e WEB API con php... La fattura in russo viene creata, i dati vengono inviati e anche visualizzati nel manager МТ, ma c'è un problema - i dati nel manager МТ vengono visualizzati in unicode ("044404300c0438043b0438044f" - così sembra il nome utente). Quando si inviano dati non c'è niente di codificato o decodificato, dal client MT tutto viene creato normalmente... Almeno da che parte guardare? (