Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 227

 

Ciao, il problema probabilmente non è l'attraversamento dello zero ma l'attraversamento da un buffer all'altro. A una barra il segnale finisce e alla barra successiva il segnale è già in un altro buffer, che colore vorresti vedere tra le due barre adiacenti? Non è chiaro.

Se vuoi fare un terzo buffer con una linea gialla e metterlo sotto questi due, sarebbe bellissimo!

 
Aleksei Stepanenko:

Ciao, il problema probabilmente non è l'attraversamento dello zero ma l'attraversamento da un buffer all'altro. A una barra il segnale finisce e alla barra successiva il segnale è già in un altro buffer, che colore vorresti vedere tra le due barre adiacenti? Non è chiaro.

Se vuoi, fai un terzo buffer con una linea gialla e mettilo sotto questi due, sarà bellissimo!

Alexey, grazie per l'aiuto.

Non ho bisogno di tre colori, due sono sufficienti. Vorrei che gli spazi vuoti fossero disegnati con una linea del colore precedente. Non capisco cosa intendete con "In una barra il segnale è finito, e nella barra successiva il segnale è in un buffer diverso". Ad ogni barra, c'è un valore in uno dei buffer, quindi dovrebbe essere visualizzato anche sul grafico, o mi manca qualcosa?

 

Beh, guarda, il tempo è discreto sul grafico, l'unità minima è 1 bar. Cioè, non c'è un tempo parziale tra le barre, per così dire. Se si sostituisce il rendering con un grafico a barre, si hanno due barre - due barre di colori diversi. Ma non c'è niente tra loro. E la linea è disegnata in modo tale (tale proprietà è fatta) che collega i valori dello stesso buffer, ma non quelli diversi. Ecco perché ci sono dei buchi.

Se lo vuoi per bellezza, allora puoi provare a dare i valori finali sovrapposti su entrambi i buffer. Segnalate al nuovo buffer, ma segnalate ancora alla vecchia barra.

Ma se poi si prende il segnale da tale indicatore in Expert Advisor, sarà impreciso.


Oppure un istogramma è una buona opzione senza alcun problema extra. Voto per il grafico a barre.

 
Grigori.S.B:

Alexei, grazie per il tuo aiuto.

Non ho bisogno di tre colori, due sono sufficienti. Vorrei che gli spazi vuoti fossero disegnati con una linea del colore precedente. Non capisco cosa intendi con "A una barra il segnale finisce, e alla barra successiva il segnale è già in un altro buffer". Ad ogni barra, c'è un valore in uno dei buffer, significa che dovrebbe essere visualizzato sul grafico, o mi manca qualcosa?

lasciare un buffer senza condizioni e sovrapporre il secondo con condizioni al primo

#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 clrGreen
#property indicator_color2 clrRed

//---- input parameters
extern int    FastEMA=12;  
extern int    SlowEMA=26;  
extern int    Signal=9;  

//---- buffers
double DiffBuffer_up[];
double DiffBuffer_dn[];
//
double MainBuffer[];
double SignalBuffer[];

ENUM_TIMEFRAMES TimeFrame;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   int    draw_begin=MathMax(FastEMA,SlowEMA);
   string short_name="MACD Stephen";
   //---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,DiffBuffer_up);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,DiffBuffer_dn);
   short_name=StringConcatenate(short_name," ("+(string)FastEMA+","+(string)SlowEMA+","+(string)Signal+")");
   IndicatorShortName(short_name);
   SetIndexDrawBegin(0,draw_begin);
   SetIndexDrawBegin(1,draw_begin);
   SetIndexLabel(0,"Up");
   SetIndexLabel(1,"Down");
   IndicatorDigits(6);
   SetLevelValue(0,0);
   
   TimeFrame=GetTF();
   
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{

   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
  int limit, iChart, iTF, delta=0;
  datetime TimeArray[];
  //if(TimeFrame>Period()) delta=(int)MathCeil(TimeFrame/Period());
  int counted_bars=IndicatorCounted();
  //---- check for possible errors
  if(counted_bars<0) return(-1);
  //---- the last counted bar will be recounted
  if(counted_bars>0) counted_bars--;
  limit=Bars-counted_bars+delta;

  ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),TimeFrame);
  ArraySetAsSeries(MainBuffer,true);
  ArraySetAsSeries(SignalBuffer,true);
  ArrayResize(MainBuffer,  100000);
  ArrayResize(SignalBuffer,100000);
  
  iTF=0;
  for(iChart=0; iChart<limit; iChart++)
  {
      while(Time[iChart]<TimeArray[iTF]) iTF++;
      MainBuffer[iChart]=EMPTY_VALUE;
      SignalBuffer[iChart]=EMPTY_VALUE;
      MainBuffer[iChart]  =iMACD(Symbol(),TimeFrame,FastEMA,SlowEMA,Signal,PRICE_CLOSE,MODE_MAIN,iTF);
      SignalBuffer[iChart]=iMACD(Symbol(),TimeFrame,FastEMA,SlowEMA,Signal,PRICE_CLOSE,MODE_SIGNAL,iTF);
      double diff=MainBuffer[iChart]-SignalBuffer[iChart];
      DiffBuffer_up[iChart]=diff;
      
      
      if (diff>0) //{
        DiffBuffer_dn[iChart]=diff; 
         //DiffBuffer_dn[iChart]=EMPTY_VALUE;
      //}
      //else {
         
         //DiffBuffer_up[iChart]=EMPTY_VALUE;
      //}
  }
  return(0);
}
 
Aleksei Stepanenko:

Beh, guarda, il tempo è discreto sul grafico, l'unità minima è 1 bar. Cioè, non c'è un tempo parziale tra le barre, per così dire. Se si sostituisce il rendering con un grafico a barre, si hanno due barre - due barre di colori diversi. Ma non c'è niente tra loro. E la linea è disegnata in modo tale (tale proprietà è fatta) che collega i valori dello stesso buffer, ma non quelli diversi. Ecco perché ci sono dei buchi.

Se lo vuoi per bellezza, allora puoi provare a dare i valori finali sovrapposti su entrambi i buffer. Segnalate al nuovo buffer, ma segnalate ancora alla vecchia barra.

Ma se poi si prende il segnale da tale indicatore in Expert Advisor, sarà impreciso.

Oppure un istogramma è una buona opzione senza alcun problema extra. Voto per il grafico a barre.

Grazie mille, Alexey.

Ora anche la mia testa è sistemata. Avrei potuto farlo da solo, ma non così breve ed elegante come il successivo consiglio di Yuri.

 
Iurii Tokman:

lasciare un buffer incondizionato, e sovrapporre il secondo con condizioni sul primo

Tanto di cappello, Yuri.

Una soluzione così elegante e concisa che non avrei potuto immaginare.

 
Grigori.S.B:

Tanto di cappello, Yuri.

Non avrei potuto immaginare una soluzione così elegante e concisa.

non era la mia idea, qui sul forum, così come hai imparato
nella base di codice un sacco di soluzioni, e non solo tale

 
Grigori.S.B:


Grazie per i ringraziamenti!

 
Perché le mie domande continuano ad essere ignorate?
 
darirunu1:
Perché le mie domande continuano ad essere ignorate?

dipende dalle domande...