Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 885

 
Konstantin Nikitin:

Sì, è quello che voglio dire. Ok, l'abbiamo mancato. La cosa principale è che lui capisca come stanno le cose...

Lui chi? È da lì che ho iniziato.

Forum sul trading, sistemi di trading automatico e test di strategia

Tutte le domande dei principianti su MQL4 e MQL5, aiuto e discussione su algoritmi e codici

Alexey Viktorov, 2019.06.11 09:06

Non potete usare SymbolInfoInteger per ottenere Point()).

E in generale, è necessario ricordare che Point() o _Point solo per il simbolo corrente. Per i simboli diversi da quello su cui lavora l'EA, dovresti usare questa funzione.

La funzione SymbolInfoInteger restituisce non solo valori int, ma anche long, bool ed enumerazioni.

Poi, ovviamente, intendeva Digits() o _Digits e scrisse quello che aveva scritto. E l'ultima riga di risposta riguardava la seconda parte della domanda. Non dimenticate il proverbio russo: "Un uomo intelligente non racconta, uno stupido non indovina". indovinato e detto, quindi non è né una cosa né l'altra.
 
Alexey Viktorov:

Может вам очень не повезло, но я не люблю колупаться в чужом коде. Тем более править его...

Alexey Viktorov:

Prossima domanda: quanto spesso pensate che il valore dell'indicatore sarà esattamente 50?

Per come ho capito il problema, dovrebbe essere un colore >50 e un altro <50, ma non ho visto ==50 da nessuna parte. Naturalmente, per evitare di perdere nel caso ==50, dovremmo aggiungere >=50 a uno di essi e <=50 a un altro. Può sembrare meglio.

E la seconda domanda: quanto era necessario cambiare l'intera indicizzazione del buffer? Dopo la reindicizzazione, hai sistemato tutto nel tuo codice? Forse sarebbe più facile fare il buffer colore indice 4, e i buffer ausiliari 5 e 6 di conseguenza. Avresti meno da modificare e meno possibilità di fare qualche errore in più.

  • Grazie per la risposta. Se Luby avesse frugato nel codice di qualcun altro, molto probabilmente ti avremmo perso come esperto, quindi è solo LUCKY in questo senso.
  • Su <= o >= sono d'accordo, l'omissione, naturalmente uno di loro deve essere presente, non appena corro attraverso, ma finora non una questione di principio.
  • Provato, riassegnato un buffer di colore, riassegnato interi gruppi, scambiato gruppi (sopra/sotto) - niente aiuta. Ora finirò il post e cercherò di fare un indicatore di istogramma separato, senza linee. Se funziona, proverò a combinarli di nuovo. Questa è una questione di principio. Non voglio lasciarmi dietro macchie bianche di incomprensione.

 
Sergey Voytsekhovsky:

  • Grazie per la vostra risposta. Se Luby avesse frugato nel codice di altre persone, molto probabilmente ti avremmo perso come esperto, quindi è solo LUCKY in questo senso.
  • Su <= o >= sono d'accordo, l'omissione, naturalmente uno di loro deve essere presente, non appena corro attraverso, ma finora non una questione di principio.
  • Provato, riassegnato un buffer di colore, riassegnato interi gruppi, scambiato gruppi (sopra/sotto) - niente aiuta. Ora finirò il post e cercherò di fare un indicatore di istogramma separato, senza linee. Se funziona, proverò a combinarli di nuovo. Questa è una questione di principio. Non voglio lasciarmi dietro macchie bianche di incomprensione.

Penso che vi siate scervellati quando avete cambiato l'indicizzazione del buffer.

Tornate indietro e prendete il vecchio codice del messaggio 8806 e cambiate solo la sequenza del buffer.

   SetIndexBuffer(4,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);
Poi tracciare le condizioni quando è necessario mettere 0 e quando è necessario mettere 1
 
Alexey Viktorov:

Non devi averci pensato troppo quando hai cambiato l'indicizzazione del buffer.

Tornate indietro e prendete il vecchio codice dal post 8806 e cambiate solo la sequenza del buffer.

Poi tracciare le condizioni quando mettere 0 nel buffer di colore e quando mettere 1

L'ho fatto, non è servito, ho ammesso che stavo facendo degli errori, dopo il tuo post l'ho fatto di nuovo. Ecco i punti del codice che ho cambiato. Quello vecchio non è commentato.

//+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3

#property indicator_type1   DRAW_LINE       // основная
#property indicator_color1  clrLightSeaGreen
#property indicator_style1  STYLE_SOLID

#property indicator_type2   DRAW_LINE       // сигнальная
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_SOLID

#property indicator_type3   DRAW_COLOR_HISTOGRAM2
#property indicator_color3  clrGreen,clrRed
#property indicator_style3  STYLE_SOLID

#property indicator_width1  3 
#property indicator_width2  2 
#property indicator_width3  1 
//--- input parameters
input int InpKPeriod=5;  // K period
input int InpDPeriod=3;  // D period
input int InpSlowing=3;  // Slowing
//--- indicator buffers
double    ExtMainBuffer[];
double    ExtSignalBuffer[];
double    ColorHistogram_2Buffer1[]; 
double    ColorHistogram_2Buffer2[]; 
     //double    ExtHighesBuffer[];
     //double    ExtLowesBuffer[];
     //double    ColorHistogram_2Colors[];
double    ColorHistogram_2Colors[];
double    ExtHighesBuffer[];
double    ExtLowesBuffer[];
color     colors[]={clrRed,clrGreen};
int       cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMainBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(3,ColorHistogram_2Buffer2,INDICATOR_DATA);
        //SetIndexBuffer(4,ExtHighesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(5,ExtLowesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(6,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,80);
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Stoch_HISTOGRAM("+(string)InpKPeriod+","+(string)InpDPeriod+","+(string)InpSlowing+")");
   //PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
   PlotIndexSetString(0,PLOT_LABEL,"Main");
   PlotIndexSetString(1,PLOT_LABEL,"Signal");
        //PlotIndexSetString(2,PLOT_LABEL,"UP");
        //PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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 i,k,start;
//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//---
   start=InpKPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1;k<=i;k++)
        {
         if(dmin>low[k])  dmin=low[k];
         if(dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod-1+InpSlowing-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1);k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0) ExtMainBuffer[i]=100.0;
         else ExtMainBuffer[i]=sumlow/sumhigh*100;
      if(ExtMainBuffer[i]>=50){
         cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
      if(ExtMainBuffer[i]<50){
         cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
     }
//--- signal
   start=InpDPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtSignalBuffer[i]=0.0;
     }
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sum=0.0;
      for(k=0;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   //PlotIndexSetInteger(2,PLOT_LINE_COLOR,colors[i]);
   return(rates_total);
  }
//+------------------------------------------------------------------+ 

Questo è come era prima che facessi le modifiche. L'istogramma c'è, il colore giusto no.

Questo è il modo in cui è ora. L'istogramma è sparito, non viene visualizzato.

Mi sa che non ho più la mente lucida.


 
Sergey Voytsekhovsky:

L'ho fatto, non ha funzionato, ho fatto degli errori, dopo il tuo post l'ho rifatto. Ecco i punti del codice che ho cambiato. Quello vecchio non è commentato.

Questo è come era prima che facessi le modifiche. L'istogramma c'è, il colore giusto no.

Questo è il modo in cui è ora. L'istogramma è sparito, non viene visualizzato.

Devo essermi scervellato di nuovo.


Non c'è alcuna logica qui. La sequenza dovrebbe essere la seguente: si determina il valore dell'istogramma e si riempie l'i-esimo indice del buffer dell'indicatore. Poi un controllo separato, se questo valore >=50 il buffer dei colori è riempito con 0, altrimenti 1. Questo è determinato dalla sequenza dei colori nella direttiva

#property indicator_color3  clrGreen,clrRed

Se 0, viene preso il colore clrGreen e se 1, clrRed

E questa linea è completamente inutile, e la sequenza è l'opposto della prima.

color     colors[]={clrRed,clrGreen};

E questo

int       cl;

aggiunto per quale scopo? È più facile da riempire direttamente.

ColorHistogram_2Colors[i]=0;
// или 
ColorHistogram_2Colors[i]=1;

Per riempire il buffer dei colori, userei questo costrutto

         ColorHistogram_2Colors[i]=ExtMainBuffer[i] >= 50 ? 0 : 1; 
L'operatore ?: è equivalente a if else, ma più facile da usare
 
Alexey Viktorov:

La logica qui è rotta in generale. La sequenza dovrebbe essere la seguente: definire il valore dell'istogramma, riempire l'i-esimo indice del buffer dell'indicatore. Poi un controllo separato, se questo valore >=50 il buffer dei colori è riempito con 0, altrimenti 1. Questo è determinato dalla sequenza di colori nella direttiva

Se 0, viene preso il colore clrGreen e se 1, clrRed

E questa linea non è assolutamente necessaria, e la sequenza è l'opposto della prima.

E questo

aggiunto per quale scopo? È più facile da riempire direttamente.

Per riempire il buffer dei colori, userei questo costrutto

L'operatore ?: è equivalente a if else ma più facile da usare

WURRAA, e la mia anima ha cantato. Alexey, grazie mille !!!!!

Ha funzionato tutto, non capisco come sia possibile fare a meno dell'array

color     colors[]={clrRed,clrGreen};

perché la sua descrizione è stata cancellata. Quindi si può fare a meno dell'array extra qui?


 
Sergey Voytsekhovsky:

  • Grazie per la vostra risposta. Se Luby avesse frugato nel codice di altre persone, molto probabilmente ti avremmo perso come esperto, quindi è solo LUCKY in questo senso.
  • Su <= o >= sono d'accordo, l'omissione, naturalmente uno di loro deve essere presente, non appena corro attraverso, ma finora non una questione di principio.
  • Provato, riassegnato un buffer di colore, riassegnato interi gruppi, scambiato gruppi (sopra/sotto) - niente aiuta. Ora finirò il post e cercherò di fare un indicatore di istogramma separato, senza linee. Se funziona, proverò a combinarli di nuovo. Questa è una questione di principio. Non voglio lasciarmi dietro macchie bianche di incomprensione.

Il mio Squeaky è proprio un miracolo, lo porta ovunque e dappertutto.

p.s non ho ancora imparato come allegare correttamente l'immagine, scusatemi, posterò degli screenshot.

File:
EURUSD.png  52 kb
GBPUSD.png  54 kb
 
Alexey Viktorov:

Per riempire il buffer di colore userei questa costruzione

L'operatore ?: è equivalente a if else, ma più facile da usare

Ottimi consigli e una grande scienza per il futuro!!! È andato anche un po' oltre. Qui sotto c'è il risultato.

Così è stato:

if(ExtMainBuffer[i]>=50){
         //cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=0;
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
if(ExtMainBuffer[i]<50){
         //cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=1;
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 

Così è diventato, l'efficacia dell'approccio è evidente!!! Grazie.

      ColorHistogram_2Buffer1[i]=ExtMainBuffer[i] >= 50 ? 50 : ExtMainBuffer[i]; 
      ColorHistogram_2Buffer2[i]=ExtMainBuffer[i] >= 50 ? ExtMainBuffer[i] : 50; 
      ColorHistogram_2Colors [i]=ExtMainBuffer[i] >= 50 ? 0 : 1;
         Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
            " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
            " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
            " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
            " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
 
Sergey Voytsekhovsky:

Ottimi consigli e una grande scienza per il futuro!!! È andato anche un po' oltre. Qui sotto c'è il risultato.

Così è stato:

Così è diventato, l'efficacia dell'approccio è evidente!!! Grazie.

Nessuna efficienza qui - tre condizioni if-else invece di una. Qui, è peggio così com'è...

 
Artyom Trishkin:

Non c'è efficienza qui: ci sono tre condizioni if-else invece di una. Qui è peggio...

Sì, infatti, non l'avevo notato. Ha un aspetto migliore, ci sono meno lettere.

E non c'è modo di mettere tre esecuzioni (non so come dirlo correttamente) sotto un operatore?: contemporaneamente?

Motivazione: