Errori, bug, domande - pagina 31

 
Urain:
Può, ma a volte funziona, anche se quando imposto 3, il nome breve mostra 3 valori e io voglio solo uno del buffer principale.

Allora forse così:

#property indicator_buffers 3
#property indicator_plots   1
   SetIndexBuffer(0,LRma,INDICATOR_DATA);
   SetIndexBuffer(1,L,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,S,INDICATOR_CALCULATIONS);

Solo un valore viene visualizzato sul grafico.

 
DC2008:

Allora forse va così:

Sul grafico viene visualizzato un solo valore.

Così si scopre che il nome breve dell'indicatore mostra 3 numeri, mentre il buffer per il disegno di uno, memorizza tutto ciò che è necessario sapere,

Il problema è che in 4 si può solo richiedere il valore dell'onda sulla barra desiderata e qui devo scaricare l'intero buffer e memorizzarlo da qualche parte

Questo stoccaggio non è necessario per le esigenze dell'indicatore. Ma non so come ricevere il valore dell'onda.

 
DC2008:

Allora forse così:

Solo un valore viene visualizzato sul grafico.

Anche glitchy ....
 
Interesting:

Lì non si tratta di inizializzazione. Non si tratta nemmeno di quelle due linee che Mashek chiama.

Anche se supponiamo che il parametro SYMBOL sia davvero necessario (personalmente ne dubito), il lavoro con i buffer è penoso, e non sto parlando nemmeno del blocco calcolatore...

Vedo che l'indicatore visualizza il valore dell'angolo di regressione lineare dello strumento sbagliato su cui sta funzionando,

e quella prescritta nell'input, quindi si spera di nascondere il controllore.

Ora, d'altra parte, ditemi intelligentemente cosa vedete di incongruo in ciò che accade nel calcolo?

Non pretendo che sia tutto giusto (come solo imparare cinque e naturalmente al vapore, come molti).

La prima cosa che mi viene in mente è che la lunghezza della storia su coppie diverse è diversa e quindi si verifica un glitch,

Ma gli sviluppatori mi hanno assicurato che il terminale caricherà da solo tutti i dati necessari.

 
Urain:

Il problema è che in 4 si può solo richiedere il valore della forma d'onda sulla barra necessaria e qui si deve caricare l'intero buffer,

il problema è che in 4 si può semplicemente richiedere il valore dell'onda sulla barra necessaria, ma qui si deve scaricare l'intero buffer e memorizzarlo da qualche parte

Devo caricare tutto il buffer, ma non ne ho bisogno per le mie esigenze di indicatore. Non so come ottenerlo in un altro modo.

Posso averli giusti, o quasi giusti. Per tutti gli altri buffer possiamo risolvere (la serie non è usata, cosa c'è di strano). Ma cosa sta succedendo nel calcolatore è una grande domanda...
 
Urain:

Vedo che l'indicatore visualizza il valore dell'angolo di regressione lineare dello strumento sbagliato su cui sta funzionando,

ma quello che è prescritto nell'intuizione, quindi si spera che nasconda il controllore.

Ora, a freddo, ditemi ragionevolmente cosa vedete di assurdo in ciò che accade nel calcolo?

Non pretendo che sia tutto giusto (come solo imparare cinque e naturalmente al vapore, come molti).

La prima cosa che mi viene in mente è che la lunghezza della storia a diverse coppie di diversi e quindi glitch,

Gli sviluppatori mi hanno assicurato che il terminale caricherà da solo tutte le informazioni necessarie.


Cosa c'è da discutere? Prendiamo il cappello della calcolatrice e vediamo cosa vediamo lì, e questo è ciò che vediamo:

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[])

Dopo di che, c'è il controllo delle barre...

   int count=rates_total-prev_calculated;
   if(count==0)count=1;
Se non conoscete la password, riceverete un avviso. Allora ditemi, dov'è la logica?
 

Ho riscritto il calcolo in questo modo:

  {
//---
   int count=rates_total-prev_calculated;
   if(count>_Bars())count=_Bars()-1;
   if(count==0)count=1;
   if(CopyBuffer(Lwma,0,0,count,L)!=-1)
     {
      if(CopyBuffer(Sma,0,0,count,S)!=-1)
        {
         for(int i=0;i<count;i++)
            LRma[i]=(L[i]-S[i])*6*iPoint*iiMA;
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
int _Bars(){return(Bars(symbol,_Period));}
I messaggi di errore sono spariti, ma ancora non funziona correttamente.
 

Qui ci siamo scervellati su un tacchino simile. Guarda cosa ne è venuto fuori

 
Urain:

Ho riscritto il calcolo in questo modo:

I record di errore sono scomparsi, ma ancora non funziona come dovrebbe.

L'unico modo giusto è molto semplice.

Si scrive un indicatore funzionante al 100%, ed è fatto classicamente senza il parametro "Symbol", cioè è calcolato usando il simbolo e il periodo corrente.

Dopo di che tale calcolatrice BASIC viene chiamata in Expert Advisor (se è previsto il funzionamento meccanico) o calcolatrice (se è necessario visualizzare le informazioni sul grafico dello STRUMENTO NON CALCOLATO).

PS

Altrimenti, se la calcolatrice o una funzione separata deve fare un calcolo aggiuntivo, e poi collegare i risultati ai dati del grafico corrente...

 
Urain:

Ho riscritto il calcolo in questo modo:

I messaggi di errore sono spariti, ma ancora non funziona correttamente.

Probabilmente è meglio:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot LRma
#property indicator_label1  "LRma"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
input string             symbol      ="EURJPY";
input int                MA_Period   =25;          // период MA
input int                MA_shift    =0;           // сдвиг индикатора
input ENUM_APPLIED_PRICE price       =PRICE_OPEN;  // тип цены 
//--- indicator buffers
double  LRma[],L[],S[],iPoint,iiMA;

int Lwma,Sma;// Хендлы машек
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,LRma,INDICATOR_DATA);
   ArraySetAsSeries(L,true);
   ArraySetAsSeries(S,true);
   ArraySetAsSeries(LRma,true);
   Lwma=iMA(symbol,0,MA_Period+1,MA_shift,MODE_LWMA,price);
   Sma=iMA(symbol,0,MA_Period+1,MA_shift,MODE_SMA,price);
   iPoint=1.0/SymbolInfoDouble(symbol,SYMBOL_POINT);
   iiMA=1.0/MA_Period;
   IndicatorSetString(INDICATOR_SHORTNAME,"LRma_symbol_"+symbol);
//---
   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[])
  {
//---
   int count=rates_total-prev_calculated;
   if(count>1)count=(int)SeriesInfoInteger(symbol,0,SERIES_BARS_COUNT);
   if(count==0)count=1;
   if(CopyBuffer(Lwma,0,0,count,L)!=-1)
     {
      if(CopyBuffer(Sma,0,0,count,S)!=-1)
        {
         for(int i=0;i<MathMin(ArraySize(LRma),ArraySize(L));i++)
            LRma[i]=(L[i]-S[i])*6*iPoint*iiMA;
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Sembra funzionare correttamente.