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

 
Vladimir Karputov:

Ci:

Grazie. Sarò al computer, forse darò un'occhiata.
 
Artyom Trishkin:
Grazie. Sarò al computer, forse darò un'occhiata.

l'indicatore è scritto in un formato molto-molto vecchio in MQL4, non lo tocco da molto tempo, non sono sicuro di ricordare come era scritto

@zig2003 come opzione, prova a rimuovere IndicatorBuffers(6) da start()

e nella parte superiore correggere #proprietà indicator_buffers 6

 
Igor Makanu, e dopo aver sistemato l'indicatore, cosa dovrò confrontare con cosa nell'EA per programmare un'inversione?
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
zig2003:
Igor Makanu, e dopo aver corretto l'indicatore con cosa devo confrontare nel mio Expert Advisor per programmare il pivot?

ogni indicatore è composto da diversi buffer di indicatori

quando si chiama l'indicatore dall'Expert Advisor attraverso iCustom(), si ottiene il valore di un buffer su una certa barra, e si può visualizzare questo valore nella finestra dei dati Ctrl+D

cosa confrontare dipende dal vostro TS, o i valori dei buffer degli indicatori o il buffer e il prezzo - ci sono molte varianti

Dovreste prima creare un indicatore MA, e poi, quando lo capirete, chiamerete il vostro indicatore al posto del MA

Non è così facile - basta scrivere un paio di comandi e il vostro Expert Advisor sarà pronto


ZS: un indicatore pivot è un confronto di diversi valori di buffer di indicatori, a giudicare dal tuo screenshot sulla barra numero 2 deve essere impostato vicino al prezzo del buffer numero 1 e il resto dei buffer avràEMPTY_VALUE valori, e sulla barra №1, al contrario, buffer №1 ha il valore EMPTY_VALUE , e uno dei 2 o 3 buffer avrà il valore diverso da EMPTY_VALUE - si dovrebbe guardare tutto nella finestra di panoramica dei dati (spostare la freccia del mouse sulle barre e si vede il buffer valori)

 

Igor, grazie, ho corretto l'indicatore, ma il valore del buffer non è ancora apparso. Ho superato da tempo quella fase, tutto è semplice lì, ci sono due linee - due buffer. Di solito per indicatori simili, che consistono in una linea, ma con buffer diversi per il colore, scrivo il codice così:

//Функция для определения входа и выхода по AMA 
 int Enter()
  {
   double AMAbuy_1  =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 0,1);             //Подключаем AMA для первого бара (buy)
   double AMAsell_1 =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 1,1);             //                                (sell)
   double AMAbuy_2  =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 0,2);             //Подключаем AMA для второго бара (buy)       
   double AMAsell_2 =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 1,2);             //                                (sell)                    
                         
   if(AMAbuy_1>0 && AMAsell_2>0)                                                                                 //Вход в бай
      return(1);                                                                                           
   if(AMAsell_1>0 && AMAbuy_2>0)                                                                                 //Вход в селл
      return(-1);                                                                                          
        
   return(0);
  } 

Ma questo è solo se ad ogni colore viene assegnato un vero buffer. Quando si cambia colore sulla prima barra chiusa, il valore del buffer diventa maggiore di zero, mentre sulla barra precedente era uguale a zero o il buffer di un altro colore era maggiore di zero. Non posso ottenere il valore del secondo colore di vendita da questo indicatore e non so con cosa confrontarlo per catturare l'inversione. Ho provato tutti i numeri del buffer. Questo è un peccato, perché questo giradischi di Mladenov, anche se vecchio, ma molto decente tendenza in manuale strategics.... Qualcuno può indovinare come tirare il valore dal secondo buffer e scrivere la formula per l'inversione?

 
zig2003:

Igor, grazie, ho corretto l'indicatore, ma il valore del buffer non è ancora apparso. Ho superato da tempo quella fase, tutto è semplice lì, ci sono due linee - due buffer. Di solito per indicatori simili, che consistono in una linea, ma con buffer diversi per il colore, scrivo il codice così:

Ma questo è solo se ad ogni colore viene assegnato un vero buffer. Quando si cambia colore sulla prima barra chiusa, il valore del buffer diventa maggiore di zero, mentre sulla barra precedente era uguale a zero o il buffer di un altro colore era maggiore di zero. Non riesco ad ottenere il valore del secondo colore da questo indicatore e non riesco a capire con cosa confrontarlo per cogliere l'inversione. E questo è un peccato, perché questo indicatore di Mladenov, anche se vecchio, ma molto bene in tendenza nella strategia manuale.... Qualcuno può capire come scrivere la formula di inversione?

Senza alcuna modifica dell'indicatore.

Cosa significano i dati nei due buffer - in 0 e 1:

  • Se c'è un valore nel buffer 0 e nessun valore nel buffer 1, questa è la direzione per andare lunghi ( linea blu dell 'indicatore (se predefinita))
  • Se c'è un valore nel buffer 0 e c'è un valore nel buffer 1, allora questa è una direzione corta (colore rosso della linea dell'indicatore (se predefinito))

Cambio di direzione (colore) della linea:

  • C'è sempre un valore nel buffer 0 e, a proposito, lo si può sempre definire (confrontare i valori su tre barre: 2<=1 && 1>0 --> giù, 2>=1 && 1<0 --> su)
    ...
    Ma si può anche usare solo il buffer 1:
  • Se non c'è nessun valore nel buffer 1 sulla barra 0 e c'è un valore sulla barra 1, questo è un cambio di direzione della linea a lungo;
  • Se c'è un valore sulla barra 0 nel buffer 1 e nessun valore sulla barra 1, questo è un cambio di direzione della linea in short;

"Nessun valore" qui è EMPTY_VALUE. O DBL_MAX - non importa, è la stessa cosa. Cioè non è zero, ma EMPTY_VALUE.

 
zig2003:

Qualcuno può indovinare come estrarre il valore dal secondo buffer e scrivere la formula pivot?

Non dovete indovinare, dovreste prima riscrivere l'indicatore in una forma normale corrispondente allo stato attuale di MQL4

Ho messo un po' in ordine il codice, ma non sono sicuro che non ci saranno errori. Non mi piace il codice sorgente, ma ho lavorato con quello che ho.

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrTomato
#property indicator_color3 clrTomato
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
//----
input int    Range           = 9;
input int    FastMA          = 3;
input int    SlowMA          = 30;
input int    filter          = 25;
input int    normalizeDigits = 4;

input bool   alertsOn        = false;
input bool   alertsOnCurrent = false;
input bool   alertsMessage   = true;
input bool   alertsSound     = true;
input bool   alertsEmail     = false;
input string soundfile       = "alert2.wav";


double Downa[];
double Downb[];
double trend[];
double fAMA[];
double mAMA[];
double AMA[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0, fAMA);
   SetIndexLabel(0, "fAMA");
   SetIndexBuffer(1, Downa);
   SetIndexLabel(1, "Downa");
   SetIndexBuffer(2, Downb);
   SetIndexLabel(2, "Downb");
   SetIndexBuffer(3, trend);
   SetIndexLabel(3, "trend");
   SetIndexBuffer(4, mAMA);
   SetIndexLabel(4, "mAMA");
   SetIndexBuffer(5, AMA);
   SetIndexLabel(5, "AMA");
   for (int i=0; i<indicator_buffers; i++) {
      SetIndexStyle(i, DRAW_LINE);
   }
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime &time[],     // Time
                 const double &open[],       // Open
                 const double &high[],       // High
                 const double &low[],        // Low
                 const double &close[],      // Close
                 const long &tick_volume[],  // Tick Volume
                 const long &volume[],       // Real Volume
                 const int &spread[]         // Spread
                )
{
   int limit;
   if(prev_calculated==0) limit=rates_total-1;
   else limit=rates_total-prev_calculated+1;
   if (trend[limit] == -1) ClearPoint(limit, Downa, Downb);
   double k1 = 2.0 / (SlowMA + 1);
   double k2 = 2.0 / (FastMA + 1) - k1;
   for(int i = limit; i>= 0; i--) {
      double sdAMA = 0;
      double Noise = 0;
      for(int k=0; k<Range; k++) Noise += MathAbs(Close[i+k] - Close[i+k+1]);
      double ER    = 0;
      if(Noise != 0) ER = MathAbs(Close[i] - Close[i+Range]) / Noise;
      double SSC   = (ER*k2+k1);



      AMA[i]  = AMA[i+1] + NormalizeDouble(SSC*SSC*(Close[i] - AMA[i+1]), normalizeDigits);
      mAMA[i] = AMA[i];

      if(filter < 1) fAMA[i] = mAMA[i];
      else {
         for(k = i; k <= i + SlowMA - 1; k++)  sdAMA = sdAMA + MathAbs(mAMA[k] - mAMA[k+1]);
         double dAMA  = mAMA[i] - mAMA[i+1];
         if(dAMA >= 0)
            if(dAMA < NormalizeDouble(filter*sdAMA/(100*SlowMA), 4) &&  High[i] <= High[Highest(NULL, 0, MODE_HIGH, 4, i)]+10*Point)
               fAMA[i] = fAMA[i+1];
            else   fAMA[i] = mAMA[i];
         else if(MathAbs(dAMA) < NormalizeDouble(filter*sdAMA/(100*SlowMA), 4) && Low[i] > Low[Lowest(NULL, 0, MODE_LOW, 4, i)]-10*Point)
            fAMA[i] = fAMA[i+1];
         else  fAMA[i] = mAMA[i];
      }

      Downa[i] = EMPTY_VALUE;
      Downb[i] = EMPTY_VALUE;
      trend[i] = trend[i+1];
      if (fAMA[i]> fAMA[i+1]) trend[i] =1;
      if (fAMA[i]< fAMA[i+1]) trend[i] =-1;
      if (trend[i]==-1) PlotPoint(i, Downa, Downb, fAMA);
   }

//


   if (alertsOn) {
      if (alertsOnCurrent)
         int whichBar = 0;
      else     whichBar = 1;
      if (trend[whichBar] != trend[whichBar+1])
         if (trend[whichBar] == 1)
            doAlert("buy");
         else  doAlert("sell");
   }
   return(rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void doAlert(string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;

   if (previousAlert != doWhat || previousTime != Time[0]) {
      previousAlert  = doWhat;
      previousTime   = Time[0];

      //
      //


      message =  StringConcatenate(Symbol(), " at ", TimeToStr(TimeLocal(), TIME_SECONDS), " AMA STL_Color ", doWhat);
      if (alertsMessage) Alert(message);
      if (alertsEmail)   SendMail(StringConcatenate(Symbol(), " AMA STL_Color "), message);
      if (alertsSound)   PlaySound(soundfile);
   }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClearPoint(int i, double& first[], double& second[])
{
   if ((second[i]  != EMPTY_VALUE) && (second[i+1] != EMPTY_VALUE))
      second[i+1] = EMPTY_VALUE;
   else if ((first[i] != EMPTY_VALUE) && (first[i+1] != EMPTY_VALUE) && (first[i+2] == EMPTY_VALUE))
      first[i+1] = EMPTY_VALUE;
}
void PlotPoint(int i, double& first[], double& second[], double& from[])
{
   if (first[i+1] == EMPTY_VALUE)
      if (first[i+2] == EMPTY_VALUE) {
         first[i]  = from[i];
         first[i+1]  = from[i+1];
         second[i] = EMPTY_VALUE;
      }
      else  {
         second[i] = from[i];
         second[i+1] = from[i+1];
         first[i]  = EMPTY_VALUE;
      }
   else     {
      first[i]  = from[i];
      second[i]   = EMPTY_VALUE;
   }
}
//+------------------------------------------------------------------+

Qui vedo i valori dei buffer di questo indicatore:


 
Ragazzi, grazie per i consigli. SoprattuttoIgor Makanu. Sì, infatti, ho fatto 6 buffer invece dei tre di default e i valori 1 e -1 sono apparsi in uno dei buffer, ma non in quelli originali. Ecco perché non riuscivo a tirare fuori i valori. E io stesso non l'avrei mai immaginato. Ora tutto è tornato alla normalità. Tutto funziona. Igor, grazie anche per la distillazione dell'indicatore nel nuovo formato. Grazie ancora per la tua conoscenza!!!
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
Igor Makanu:

Non dovete indovinare, prima dovete riscrivere l'indicatore in una forma normale corrispondente allo stato attuale del linguaggio MQL4

Ho messo un po' in ordine il codice, ma non sono sicuro che non ci saranno errori, non mi piace il codice sorgente, ma ho lavorato con quello che ho

Qui vedo i valori dei buffer di questo indicatore:

Funziona senza sovrascrivere, e rende molto facile ottenere i vostri dati. L'ho descritto sopra - devi solo guardare le sue letture del buffer nella finestra dei dati (Ctrl+D)

 
Artyom Trishkin:

Funziona senza riscrittura e permette di ricevere i suoi dati molto semplicemente. L'ho descritto sopra - devi solo guardare le sue letture del buffer nella finestra dei dati (Ctrl+D)

Ho scritto sopra che non ricordo come funziona la funzione IndicatorCounted() nei vecchi indicatori, la nuova forma di indicatori con OnCalculate() è più comprensibile

Beh, il problema sembra essere risolto, bene ;)