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

 
Igor Makanu:

Non li hai inizializzati all'inizio o da qualche altra parte, li hai solo dichiarati

Ho scritto prima di usare, cioè se avete le variabili SredRazmax, SredRazmin, Sredn come somme di valori di array, allora per calcolare correttamente la somma, dovete azzerare la variabile e poi aggiungere i valori di array e salvarli in questa variabile

cioè

E il secondo, quello che hai una domanda, nell'indicatore ogni tick chiameràOnCalculate() e significa che conterai costantemente i top di ZigZag ad ogni tick, cioè circa 40-60 volte al secondo.

Grazie, ma ho provato ad azzerarli e ho provato adusareOnStart invece diOnCalculate() , ivalori continuano a saltare e non mi è chiaro se ww=0 (il valore dell'array è sempre visualizzato), perché i valori saltano nel mezzo, come fare per non contare ogni tick e contare solo i valori dall'array?

 
Dmitry Belov:

Grazie, ma ho provato ad azzerarli e adusareOnStart invece diOnCalculate()

Non credo di poter spiegare perché succede così, la questione è che OnStart() è usato negli script e OnCalculate() è usato negli indicatori. Si dovrebbe capire la differenza tra script e indicatori in MQL.

Non mi è molto chiaro qual è il tuo compito? vuoi emettere i valori di cosa? nel codice, sommi i prezzi ai quali si trovano i picchi di ZigZag su tutto il grafico, nell'output scrivi "Average spread" e stampi il valore(SredRazmax-SredRazmin)/nn, e il calcolo viene eseguito per tutte le barre

perché avete bisogno dell'indicatore se non usate i buffer dell'indicatore per il disegno? nell'indicatore i buffer sono attaccati alle barre, e i loro valori si spostano non appena appare una nuova barra

 
Igor Makanu:

Non credo di poter spiegare perché succede, il punto è che OnStart() è usato negli script, e OnCalculate() negli indicatori, bisogna capire come gli script differiscono dagli indicatori in MQL

Non mi è molto chiaro qual è il tuo compito? vuoi emettere i valori di cosa? nel codice, sommi i prezzi ai quali si trovano i picchi di ZigZag su tutto il grafico, nell'output scrivi "Average spread" e stampi il valore(SredRazmax-SredRazmin)/nn, e il calcolo viene eseguito per tutte le barre

Perché avete bisogno di un indicatore se non usate i buffer dell'indicatore per il disegno? nell'indicatore i buffer sono attaccati alle barre e i loro valori si muovono non appena appare una nuova barra

Ad essere onesti, ho semplificato il problema (la formula originale sembra un po' diversa), pensavo di capire perché i valori della media saltano quando il valore zero nell'array rimane costante. Ho due cicli, uno per riempire l'array, e l'altro per calcolare la media, c'è un limite di nn, e in realtà volevo produrre un grafico - è uno zig zag standard, ma iCustom lo sta disegnando di brutto, e la media... Dal nodo zero, se è più grande del precedente, si sottrae il nodo precedente e quello prima di esso (sarà segno meno, quindi va moltiplicato per meno 1) e tutto questo va sommato e diviso per un dato numero di nn nodi. Otteniamo la portata media dei vertici. Inoltre volevo ottenere altre medie per lo zigzag, ma sono rimasto bloccato con valori "saltellanti".

Questo è più o meno come era in origine:

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int shift, ww=0;
double zz, SredRazmax=0.0; 
double HZZ[];


int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0,HZZ);
  SetIndexStyle(0,DRAW_SECTION);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
  for(shift = 0; shift <= Bars-1; shift++){
      zz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, shift);
           if(zz > 0.0)   {
           HZZ[ww]=zz;
            ww++;          }
           else {
           continue;
           }
    }
//---------------------------------------------+
//расчет среднего значения           
//---------------------------------------------+      
  for(ww=0;ww<=nn;ww++){
       if(HZZ[ww]>HZZ[ww+1]){
          SredRazmax += (HZZ[ww]- HZZ[ww+1]);      
         }     
        else if(HZZ[ww]<HZZ[ww+1]){
         SredRazmax += (HZZ[ww]- HZZ[ww+1])*(-1);
        }
        else{
        continue;
           }
     }  
        
  if(SredRazmax>0){    
   
      Comment("Средний размах = ", SredRazmax/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]);      
        }
   
       
//--- return value of prev_calculated for next call
 return(0);

  
 
  }
 
Dmitry Belov:

Ad essere onesti ho solo semplificato il problema (in origine la formula sembra un po' diversa), pensavo di poter capire perché i valori della media saltano, se il valore zero nell'array rimane costante. Ho due cicli, uno per riempire l'array, e l'altro per calcolare la media, c'è un limite di nn, e in realtà volevo anche emettere un grafico - è un zig zag standard, ma iCustom lo disegna in modo incredibile, e la media... Dal nodo zero, se è più grande del precedente, si sottrae il nodo precedente e da quello precedente si sottrae quello precedente (avrà il segno meno, quindi va moltiplicato per meno 1) e tutto questo va sommato e diviso per un dato numero di nn. Otteniamo la portata media dei vertici. Inoltre volevo ottenere altre medie per lo zigzag, ma sono rimasto bloccato con valori "saltellanti".

Questo è approssimativamente come era in origine:

Non ci capisco molto, è tardi, ho sonno, l'ho modificato come l'ho visto, ho dei dubbi su come si comporterà l'indicatore su una barra zero (non ho controllato), ma disegna e visualizza i commenti secondo la tua formula

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int  ww=0;
double zz,SredRazmax;
double HZZ[];
bool up,dn;
double lastzz;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,HZZ);
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexEmptyValue(0,0.0);
   up = false;
   dn = false;
   lastzz=0.0;
   SredRazmax=0.0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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 shift,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      up = false;
      dn = false;
      lastzz=0.0;
      SredRazmax=0.0;
      ArrayInitialize(HZZ,0.0);
     }
   else limit=rates_total-prev_calculated+1;
   for(shift=limit; shift>=0; shift--)
     {
      zz=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,shift);
      if(zz>0.0)
        {
         HZZ[shift]=zz;
         if(lastzz>zz) {up=true;  dn=false;}
         if(lastzz<zz) {up=false; dn=true;}
         if(up) SredRazmax+=zz-lastzz;
         if(dn) SredRazmax+=(zz- lastzz)*(-1);
         lastzz=zz;
        }
      else HZZ[shift]=0.0;
     }
   Comment("Средний размах = ",SredRazmax/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]);
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Potete aiutarmi a risolvere un problema come questo? (Se possibile.)

L'Expert Advisor emetterà un allarme in determinate condizioni. È possibile rendere attiva anche la finestra che ha fatto scattare l'allarme?

 
Vatal:

Potete aiutarmi a risolvere un problema come questo? (Se possibile.)

L'Expert Advisor emetterà un allarme in determinate condizioni. È possibile rendere attiva anche la finestra che ha fatto scattare l'allarme?

C'è un esempio nella documentazione. Prendi l'ID del grafico su cui l'EA è in esecuzione e vai...
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
В этом разделе представлены примеры для работы со свойствами графика. Для каждого свойства приведены одна или две законченные функции, которые позволяют задавать/получать значение этого свойства. Эти функции можно использовать в своих MQL4 программах как есть. На рисунке показана графическая панель для наглядной демонстрации того, как изменение...
 
Igor Makanu:

Ho qualche dubbio su come l'indicatore si comporterà su una barra zero (non ho controllato), ma disegna e usa la tua formula per emettere il commento.

Sì, grazie per il vostro tempo, funziona, devo aver sbagliato qualcosa. Ma non sta emettendo un array nel commento (ci dovrebbero essere solo vertici, giusto?) e conta male con meno e numero..., lo zigzag ha una diffusione diversa tra i vertici. L'idea è di sottrarre il precedente vertice più piccolo dall'ultimo più grande (che è appena formato), e dal precedente più piccolo sottrarre anche quello più grande e il numero sarà con segno meno, lo moltiplichiamo per (-1) e così via, e tutto questo viene sommato nn volte e diviso per nn, si ottiene la partenza media. Approssimativamente su 4 orologi questo sarebbe 1,69 (da a) su USDJPY. Inoltre volevo calcolare il numero di barre medie tra i top. Ora cercherò di capire il tuo codice, cosa ho sbagliato, perché non ha disegnato e perché non calcola correttamente...

 
Dmitry Belov:
Sì, grazie per il vostro tempo, funziona davvero, devo aver sbagliato qualcosa. Ma non emette l'array nel commento (dovrebbe avere solo vertici, giusto?) e conta male con meno e numero..., lo zigzag ha una diffusione diversa tra i vertici. L'idea è di sottrarre il precedente vertice più piccolo dall'ultimo più grande (che è appena formato), e dal precedente più piccolo sottrarre anche quello più grande e il numero sarà con segno meno, lo moltiplichiamo per (-1) e così via, e tutto questo viene sommato nn volte e diviso per nn, si ottiene la partenza media. Approssimativamente su 4 orologi questo sarebbe 1,69 (da a) su USDJPY. Inoltre volevo calcolare il numero di barre medie tra i top. Ora cercherò di capire il tuo codice, cosa ho sbagliato, perché non mi ha disegnato e perché non calcola correttamente...

I vertici nel commento non usciranno, perché il buffer indicatoreHZZ[] contiene valori copiati del buffer indicatore ZigZag, altrimenti non saremo in grado di disegnare, ho deliberatamente diviso in 2 condizioni di rilevamento dei vertici su e giù:

if(up) SredRazmax+=zz-lastzz;
if(dn) SredRazmax+=(zz- lastzz)*(-1);

Se avetebisogno di conoscere diversi top in ZZ, allora dovete creare un altro array per memorizzare questi dati. Il nuovo buffer di indicatori lo complica, perché tutti gli array collegati ai buffer di indicatori "scivolano" insieme al grafico

ZS: il codice è il mio esempio, e penso che ha bisogno di loop alla 1a barra, e non a 0, ricalcolerà costantemente i valori di SredRazmax, non posso controllare ora, nessun terminale nel PC

 
Igor Makanu:

I vertici nel commento non usciranno, perché il buffer indicatoreHZZ[] contiene valori copiati del buffer indicatore ZigZag, altrimenti non saremo in grado di disegnare, ho deliberatamente diviso in 2 condizioni di rilevamento dei vertici su e giù:

Se avetebisogno di conoscere diversi top in ZZ, allora dovete creare un altro array per memorizzare questi dati. Il nuovo buffer di indicatori lo complica, perché tutti gli array collegati ai buffer di indicatori "scivolano" insieme al grafico

SZY: il codice è il mio esempio, e penso che ha bisogno di loop alla 1a barra, e non a 0, ricalcolerà costantemente il valore di SredRazmax, non posso controllare ora, nessun terminale nel PC

Il mio indicatore appena viene caricato mostra i valori corretti, poi ogni tick aumenta il valore della media, anche se nei valori di uscita della matrice a zig zag non ci sono cambiamenti nei top. È questo che non riesco a capire, perché è così? Mi manca l'esperienza e la conoscenza della lingua. Rinuncio a disegnare - è un normale zigzag preso da iCustum (ora capisco che non può sovrapporre un array al grafico, quindi disegna di brutto). L'array "striscerà", ma poi i valori verranno semplicemente ricalcolati, no? quindi capisco Grazie... Ci proverò... Imparare...
 
Come si spiega a un EA (ma standard) che si dovrebbe comprare (vendere) solo quando le medie si incrociano, e non in generale, quando ma_1>ma_2. Ma compra costantemente, non può fermarsi