Domande da un "manichino" - pagina 235

 
lazarev-d-m:

Cambiato in questo

Sembra funzionare.

i vostri array non sono serializzati.

Ecco perché è questo.

Buffer[i+1]=Buffer[i]+delta;

sbirciare nel futuro


Non ricalcola 0 bar - per la stessa ragione - il tuo inizio - non parte da 0.

 
sergeev:

i vostri array non sono serializzati.

Ecco perché è questo.

sbirciare nel futuro.


Non ricalcola 0 bar per la stessa ragione per cui non si parte da 0.

Il mio 0 bar non è calcolato secondo la formula.

Buffer[0]=price[0]; 

E poi in base al movimento del prezzo, l'indicatore si metterà in pari con la tendenza

Per esempio se il prezzo si è allontanato dall'indicatore e non si muoverà, allora durante il"periodo" di candela l'indicatore recupererà il prezzo, questa è una sorta di alternativa alla MA per me

 

lazarev-d-m:

è una specie di alternativa al MA per me

guardando 1 barra nel futuro si può tranquillamente buttare questa alternativa nel cestino
 

Il mio primo indicatore. Voglio scalare il simbolo da 0 a 100. Lo sto facendo bene? E come fare in modo che la barra corrente non venga ricalcolata (nel tester va a scatti, ma non sul grafico)

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Main"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         MainBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);
   IndicatorSetString(INDICATOR_SHORTNAME,"NormSymbol");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   ArrayInitialize(MainBuffer, EMPTY_VALUE);

//---
   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 first,bar,nLowBar=0,nHighBar=0;
   int nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
   if(prev_calculated==0) // проверка на первый старт расчёта индикатора
     {
      first=0; // стартовый номер для расчёта всех баров
     }
   else
     {
      first=prev_calculated-1; // стартовый номер для расчёта новых баров
     }


//---- основной цикл расчёта индикатора
   for(bar=first; bar<rates_total; bar++)
     {
      nLowBar =ArrayMinimum(low, bar, nVizCount);
      nHighBar=ArrayMaximum(high, bar, nVizCount);
      if(nLowBar>0 && nHighBar>0 && high[nHighBar]-low[nLowBar]!=0)
        {
         MainBuffer[bar]=((close[bar] -low[nLowBar])/(high[nHighBar]-low[nLowBar]))*100;
        }
      else
        {
         MainBuffer[bar]=EMPTY_VALUE;
        }
     }

  
//--- return value of prev_calculated for next call

   return(rates_total);
  }
 
Konstantin83: come fare in modo che la barra corrente non venga ricalcolata

Memorizza il tempo di apertura della barra corrente e lo confronta con lo stesso valore del tick in arrivo. Ricalcola il valore della barra corrente solo quando i valori non corrispondono.

Metterei questo nel blocco di inizializzazione:

   nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
   

e le variabili sarebbero dichiarate al livello globale del programma:

int first,bar,nLowBar=0,nHighBar=0, nVizCount; 
 
Yedelkin:

Memorizza il tempo di apertura della barra corrente e lo confronta con lo stesso valore del tick in arrivo. Ricalcola il valore della barra corrente solo quando i valori non corrispondono.

Metterei questo nel blocco di inizializzazione:

Grazie. È corretto in generale?
 
Konstantin83: E tutto è corretto in generale?

Non ho notato altro. Gli articoli suggeriscono una struttura simile. C'è un controllo per la divisione per zero.

Sì, per evitare di ricalcolare, si può anche confrontare prev_calculated e rates_total, per quanto mi ricordo.

 
Yedelkin:

Non ho notato altro. Gli articoli suggeriscono una struttura simile. C'è un controllo per la divisione per zero.

Sì, per evitare di ricalcolare, si può anche confrontare prev_calculated e rates_total, per quanto mi ricordo.

Sapete perché l'indicatore non traccia la linea dopo aver chiuso il terminale e riavviato il terminale? Se si passa a un altro lasso di tempo, verrà disegnato.
 
Konstantin83: Sapete perché dopo aver chiuso il terminale con l'indicatore e riavviato il terminale l'indicatore non traccia una linea? Se si passa a un altro lasso di tempo, verrà disegnato.

Il terminale ha bisogno di un po' di tempo per "alzarsi", sincronizzare i suoi database con il server, ecc. all'avvio. Se l'indicatore viene lanciato nello stesso momento, potrebbero non esserci dati per il calcolo dell'indicatore. Provate la soluzione più semplice: inserire un ritardo di due o tre secondi in OnInit().

In generale, è auspicabile stampare tutte le informazioni importanti quando si cerca un'area problematica. Come

if(nLowBar<0) Print("Ошибка, nLowBar=",nLowBar,", prev_calculated=",prev_calculated,", bar=",bar);
 

Yedelkin:

forward666 : bisogno di una visualizzazione

Non ho ancora trovato alcun aiuto per il trading dal vivo - prova solo ad aprire e chiudere una posizione in un conto demo.

Eccolo: https://www.mql5.com/ru/forum/6343/page96#comment_419028