Errori, bug, domande - pagina 1175

 
A100:

......................funzioni (ricerca, calcolo, ecc.) generalmente restituiscono lunghezza/dimensione, o -1 se non hanno successo, il che rende la gestione degli errori molto più semplice.

non tanto da sacrificare metà della gamma di valori.
 

Saluti. Qualche consiglio per i neofiti su quali funzioni usare per impostare un takeout comune su una griglia di ordini in caso di segnale inverso?

 
Sto imparando le operazioni sui file. Qualcuno sa se MQL4/5 funziona più velocemente con file csv o txt?
 
paladin800:
Sto imparando le operazioni sui file. Qualcuno sa se MQL4/5 è più veloce con i file csv o txt?
bin
 
papaklass:
Quali problemi state cercando di risolvere lavorando con i file?
È necessario scrivere lo stato delle posizioni in un file e utilizzare MT4 per leggere questi dati. Avete bisogno di una correlazione delle posizioni di un simbolo con altri simboli. Per esempio, se c'è già una certa quantità di posizioni su EURUSD, non si dovrebbero aprire altre posizioni per GBPUSD. So come farlo senza operazioni su file, voglio solo imparare a lavorare con le operazioni su file, solo per allargare i miei orizzonti.
 

Si prega di fornire un esempio di codice su come chiamare un indicatore di risorse collegate da un EA, che a sua volta utilizza un altro indicatore di risorse collegate in sé. Per esempio, c'è un indicatore A, e B è chiamato da esso. C'è anche l'esperto C che usa A. Cosa si dovrebbe scrivere in #resource e quando si chiama iCustom in tutti i casi?

L'aiuto non è scritto chiaramente a questo proposito. La solita costruzione nell'indicatore A:#resource "\Indicators\B.ex4" e poiiCustom(::Indicators\B.ex4) funziona bene quando A è lanciato da solo.Ma se A è inserito in Expert Advisor#resource "\Indicators\A.ex4", un errorenon può caricare la risorsa per l'indicatore allegato appareindicando qualche percorso assoluto sintetizzato sbagliato che in qualche modo menziona la directory Libraries, mentre l'indicatore B è cercato all'interno di se stesso (MQL4\Libraries\::Indicators\B.ex4::Indicators\B.ex4).

 
meat:

Per quanto riguarda ArraySize, ho sollevato un problema simile su MQL4 l'altro giorno: https://www.mql5.com/ru/forum/152471. Per quanto ho capito, tutto dovrebbe essere lo stesso in MQL5.

Forse, il mio messaggio è stato considerato lì :) Per quanto riguarda questo problema, il Service Desk ha risposto che la causa del problema era il funzionamento errato dell'ottimizzatore e cambieranno il tipo a uint nelle nuove build. In realtà è uint ora, solo non documentato :) Lo cambieranno in uint anche per ArrayResize, ma ho consigliato loro di cambiarlo in ulong, altrimenti dovranno tornare a questo problema a causa della mancanza di valori a 32 bit quando si memorizzano grandi volumi.

Per quanto riguarda il valore -1 su errore, non ci dovrebbero essere problemi perché: (int)-1 = (uint)-1 = 0xFFFFFFFFFFFFFF = UINT_MAX, cioè la rappresentazione in bit è la stessa. Anche se l'operazione di confronto darà un risultato diverso. cioè se il codice era

diventerà errato.

Grazie ancora per la richiesta, il tipo di ritorno delle funzioni ArraySize e ArrayRange non sarà cambiato, lasceremo il tipo int. Abbiamo corretto l'ottimizzatore di codice, ora l'errore descritto da te non si verificherà.

Il numero totale di elementi nell'array MQL non può superare INT_MAX e questo non cambierà.
Se avete bisogno di array di dimensioni maggiori in un programma MQL, dovete creare una classe separata (per esempio, CBigArray).
 

Cercando di padroneggiare iCustom in mql5. L'ho imparato in mql4 :)

Il problema è quello di disegnare qualcosa di simile al MACD, ma invece di una media mobile rapida si dovrebbe usare l'indicatore VIDYA, che si trova nella cartella Examples.

Ho preso un codice MACD standard e ho messo i parametri per VIDYA al posto della MA. Il problema è che tutto si compila ma non si disegna nulla.

Ho segnato due punti nel codice qui sotto dove ho cambiato il codice MACD standard. Altrimenti tutto è uguale. Per favore, ditemi cos'altro mi manca. Suppongo che sia a valle da qualche parte nel codice...

//+------------------------------------------------------------------+
//|                                                         MACD.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Moving Average Convergence/Divergence"
#include <MovingAverages.mqh>
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   2
#property  indicator_type1   DRAW_HISTOGRAM
#property  indicator_type2   DRAW_LINE
#property  indicator_color1  Silver
#property  indicator_color2  Red
#property  indicator_width1  2
#property  indicator_width2  1
#property  indicator_label1  "MACD"
#property  indicator_label2  "Signal"
//--- input parameters
Первый вставленный кусок:
input int                Per=7;               // Per
input int                Per1=21;             // Per1
input int                Shift=0            // Shift
Конец

input int                InpSlowEMA=84;               // Slow EMA period
input int                InpSignalSMA=9;              // Signal SMA period
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price
//--- indicator buffers
double                   ExtMacdBuffer[];
double                   ExtSignalBuffer[];
double                   ExtFastMaBuffer[];
double                   ExtSlowMaBuffer[];
//--- MA handles
int                      ExtFastMaHandle;
int                      ExtSlowMaHandle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpSignalSMA-1);
//--- name for Dindicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"MACD("+string(InpSlowEMA)+","+string(InpSignalSMA)+")");
//--- get MA handles
Второй вставленный кусок
   ExtFastMaHandle=iCustom(NULL,0,"Examples\\VIDYA",
                     Per,
                     Per1,
                     Shift
                     );
Конец
   ExtSlowMaHandle=iMA(NULL,0,InpSlowEMA,0,MODE_SMA,InpAppliedPrice);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
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 &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
//--- check for data
   if(rates_total<InpSignalSMA)
      return(0);
//--- not all data may be calculated
   int calculated=BarsCalculated(ExtFastMaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtFastMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
   calculated=BarsCalculated(ExtSlowMaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtSlowMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) to_copy++;
     }
//--- get Fast EMA buffer
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0)
     {
      Print("Getting fast EMA is failed! Error",GetLastError());
      return(0);
     }
//--- get SlowSMA buffer
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0)
     {
      Print("Getting slow SMA is failed! Error",GetLastError());
      return(0);
     }
//---
   int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
//--- calculate MACD
   for(int i=limit;i<rates_total && !IsStopped();i++)
      ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
//--- calculate Signal
   SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Nilog:

Cercando di padroneggiare iCustom in mql5. In mql4 sono riuscito a padroneggiarlo virtuosamente :)


Cosa scrive nel registro? Nessun controllo degli errori (per esempio, quando si riceve un handle). Il numero del buffer nel nuovo indicatore corrisponde a quello vecchio?
 

Non so se questo è già successo, ma la questione è, nuova barra, il valore PLOT_EMPTY_VALUE per il buffer è impostato a 0.0, ma in realtà ci sono a volte valori completamente diversi