Errori, bug, domande - pagina 936

 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   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[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);

   if(prev_calculated<rates_total)
     {
      for(i=0;i<rates_total;i++)
     // for(i=prev_calculated-1;i<rates_total;i++)
        {
         CopyRates(symbol1,0,time[i],1,rates1);
         CopyRates(symbol2,0,time[i],1,rates2);
         ind1[i]=mass_of_symbol1*rates1[0].close-mass_of_symbol2*rates2[0].close;
        }
     }



//--- return value of prev_calculated for next call
   return(rates_total);
 

Sopra il codice dell'indicatore Spread_of_symbols ... ho deciso di riscriverlo per farlo funzionare più velocemente.... e il codice è apparso, vedi sotto ... i dati non vengono copiati ... se si copiano i dati da 1 a 0 nel codice, l'indicatore disegna molto velocemente ma si verifica un errore fuori gamma ... cosa c'è di sbagliato nel codice vedi sotto ...?

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   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[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);
   
   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++;   
     }
   if(CopyRates(symbol1,0,0,to_copy,rates1)<=0)
     {
      Print("Данные по первому символу не скопированы, ошибка  ",GetLastError());
      return(0);
     }
   if(CopyRates(symbol2,0,0,to_copy,rates2)<=0)
     {
      Print("Данные по второму символу не скопированы, ошибка ",GetLastError());
      return(0);
     }
   if(prev_calculated<rates_total)
     {
     int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
   for(int i=limit;i<rates_total;i++)
        {
         ind1[i]=mass_of_symbol1*rates1[i].close-mass_of_symbol2*rates2[i].close;
        }
     }
   return(rates_total);
  }
 
FinEngineer:
Vedere MQL5 Reference Guide / Accesso alle serie temporali e agli indicatori / Organizzare l'accesso ai dati
 
FinEngineer: ma viene fuori un errore fuori portata...cosa c'è di sbagliato nel codice vedi sotto...?
Vedere se i valori di to_copy e limit corrispondono tra loro.
 
Nella modalità di visualizzazione, quando si fa trading su due simboli, dopo aver chiuso le operazioni nello stesso momento, nella cronologia appaiono solo i dati del simbolo su cui è in esecuzione l'Expert Advisor. I dati dell'altro simbolo arrivano alla scheda della cronologia solo dopo aver aperto altre transazioni. Di conseguenza, c'è un periodo di tempo in cui i dati sulle schede commercio e storia sono diversi.
 
JF 0 Trades 19:31:10 '***': annulla l'ordine #3694236 compra stop 1.10 AUDJPY.m a 95.679<br / translate="no">DS 0 Trades 19:31:10 '***': annulla l'ordine #3694238 compra limite 1.10 AUDJPY.m a 93.876
DH 0 Trades 19:31:10 '***': cancella l'ordine #3694237 compra stop 0.36 AUDJPY.m a 95.679
FI 0 Trades 19:31:10 '***': cancella l'ordine #3694239 acquista limite 0,36 AUDJPY.m a 93,876
FP 0 Trades 19:31:10 '***': cancella l'ordine #3694236 compra stop 1.10 AUDJPY.m a 95.679 fatto
QE 0 Trades 19:31:11 '***': cancella l'ordine #3694238 acquista limite 1,10 AUDJPY.m a 93,876 fatto
CG 0 Trades 19:31:11 '***': cancella l'ordine #3694237 compra stop 0.36 AUDJPY.m a 95.679 fatto
OL 0 Trades 19:31:11 '***': cancella l'ordine #3694239 acquista limite 0,36 AUDJPY.m a 93,876 fatto

Quattro ordini pendenti, secondo il registro, sembravano essere cancellati rapidamente. Ma suTradeTransaction, le risposte sono arrivate in circa 15 secondi, i tick arrivavano in questo periodo.

KH 0 prp5 (EURUSD.m,M1) 19:31:23 TS=6 cancel sl _ OnTrade PENDING id=84 m=3 b/s=SELL Err=Order executed
***

JG 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Delete tp _ OnTrade PENDING id=85 m=3 b/s=SELL Err=Bid completato
***
RL 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Delete sl _ OnTrade PENDING id=86 m=3 b/s=SELL Err=Bid completato
***

HK 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Delete tp _ OnTrade PENDING id=87 m=3 b/s=SELL Err=Ordine eseguito

Anche se c'è qualcosa di strano anche qui

IE 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 =O= Deal close/reverse price=95.648 m=3 b/s=SELL ... ==>Tempo prima di OrderSendAsync
ES 0 prp5 (EURUSD.m,M1) 19:31:29 TS=6 case 8(real) m=3 b/s=SELL Err=Order placed ==>Dopo OrderSendAsync, 3 sec sembrano essere troppo lunghi.

P.S. Sembra che ci siano stati ritardi nell'esecuzione di Expert, anche se mi chiedo per quanto tempo i pacchetti per OnTradeTransaction possano rimanere in coda.

 
fyords:

Dal riferimento:

Riferimento a MQL5 / Libreria Standard / Classi per creare pannelli e finestre di dialogo / CWnd / StateFlagsSet

Quali proprietà?

StateFlagsSet non proprietà, ma stato. Un metodo di gruppo per cambiare lo stato. Appena sopra i metodi per cambiare le singole bandiere di stato.

Usare separatamente.

 

Guardato l'"organizzazione di accesso ai dati", guardato lo script di esempio che pompa i dati e capito tutto, sono sorte le seguenti domande:

1. Perché non posso scrivere questo codice nell'indicatore nella funzione OnInit, in modo che all'inizio l'indicatore scarichi la sua storia e prepari la serie temporale? Posso scrivere un tale assegno nel mio Expert Advisor?

2. Quanto spesso devo fare questo controllo per: 1 per gli Expert Advisors e 2 per gli indicatori? Se preparo solo una volta la storia e le serie temporali per la copia, allora in futuro non si verificheranno errori nella copia? O devo controllare ogni volta o di tanto in tanto se la storia e le serie temporali sono pronte?

3. Questo controllo è necessario solo per gli indicatori e gli Expert Advisor che usano diversi timeframe e simboli, o è auspicabile per tutti?

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
I processi di swap sono asincroni e l'indicatore non può attendere i dati. Quindi è possibile interrogare in inite, senza aspettare o rallentare e solo in oncalculate per controllare la disponibilità e il conteggio.

Si prega di notare - l'indicatore non ha il diritto di aspettare o di fare un loop, altrimenti ucciderà il calcolo degli indicatori successivi.
 
Renat:
I processi di swap sono asincroni e l'indicatore non può attendere i dati. Così si può interrogare nell'inite, senza aspettare o rallentare e solo nell'oncalculate per controllare la disponibilità e il conteggio.

Si prega di notare - l'indicatore non ha il diritto di aspettare o di fare un loop, altrimenti ucciderà il calcolo degli indicatori successivi.

1 Allora dove impagino i dati? Se voglio fare un indicatore con un paniere di coppie di valute, molti simboli... per ognuno di essi ho bisogno di controllare e scambiare i dati... devo eseguire uno script dall'indicatore? Perché un indicatore dovrebbe uccidere i calcoli dei successivi? Nei prossimi indicatori, è sufficiente utilizzare il controllo del calcolo dell'indicatore precedente attraverso BarsCalculated(indicator1_Handle), lasciarlo calcolare e scaricare i dati, o mi sbaglio?

2 Un'altra domanda, di un altro tipo - quando dichiaro la maniglia dell'indicatore nella funzione, inizia a contare? O inizia a contare prima che io dia un comando per copiarlo?

Motivazione: