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

 
Come faccio a sapere che non c'èOBJ_RECTANGLE su N barre?
 
neverness:

È davvero cambiato qualcosa in MT5?

Non esiste una cosa del genere né in mt4 né in mt5.

In mt5 c'è anche un bug con la visualizzazione del separatore nel periodo corrente, sui tempi oltre H2

 
Ghabo:
Come faccio a sapere che non c'èOBJ_RECTANGLE su N barre?
Provare in questo modo forse?
  int n = Bars(Symbol(), PERIOD_CURRENT, ObjectGetInteger(0,"Rectangle",OBJPROP_TIME,1), TimeCurrent());
  Print(n);
 
Vitaly Muzichenko:

Non esiste una cosa del genere né in mt4 né in mt5.

In mt5 c'è anche un errore nel mostrare il separatore nel periodo corrente, su tempi superiori a H2

Finalmente ho visto l'unica "risposta costruttiva" alla mia domanda in tutta questa "discussione".

Per quanto riguarda gli errori, sono presenti su tutti i separatori-settimane nell'attuale (ultimo) frame sia su MT4 che su MT5.

Ovunque nell'ultima settimana il separatore MT4/MT5 disegna il separatore 7 giorni invece di 5.

Ma non è questo il punto. Gli errori ci sono sempre stati e ci saranno sempre. Tutto questo può essere corretto se esiste un codice di programma per disegnare i delimitatori.

Non sono gli errori che mi sorprendono, è qualcosa di completamente diverso.

Nessuno ha pensato di scrivere un programma per disegnare delimitatori nell'area prevista durante tutto il tempo di esistenza di MT4/MT5?

Dopo tutto, il programma è il più semplice.

Tutto quello che dovete sapere è la posizione dell'ultimo divisore e la "soluzione" del tempo lungo l'asse X (cioè quale intervallo di tempo prende 1 pixel).

E fino ad ora nessuno ha mai fatto una cosa del genere.

Questo mi sorprende davvero.

Ancora una volta dovrò fare tutto da solo.

 
Igor Makanu:

Non è difficile, ma sembra che tu non capisca come funzionano gli indicatori in MT e quali sono i loro vantaggi

Probabilmente avete ragione.

C'è un aneddoto matematico:

A un matematico viene chiesto: "Come si fa bollire l'acqua in un bollitore?

Il matematico risponde: - Prendi un bollitore vuoto, versaci l'acqua, mettilo sul fornello, accendi il fornello e aspetta che l'acqua bolla.

- OK. Ma cosa succede se il bollitore è già pieno? - chiede il matematico.

- Versa l'acqua dal bollitore e risolvi il problema nel modo sopra descritto. - risponde il matematico.

Quindi ci siamo.

Questo scherzo riguarda te.

 
neverness:

Questo scherzo riguarda te.

hmm, non so se sorridere o .... Se conosci un terminale di trading che soddisfa tutti i tuoi capricci, che senso ha? Io sono soddisfatto al 100% di MT4/5, posso farci tutto, tenere l'indicatore che disegna periodi D1 sul grafico, se ti interessa la programmazione, modificarlo per soddisfare le tue esigenze ... Non credo che sarai in grado di farlo ....

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot line1
#property indicator_label1  "Period"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
#property indicator_label2  "Period"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input int      Days=3;
//--- indicator buffers
double         Pmax[],Pmin[];
bool run=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Pmax);
   SetIndexBuffer(1,Pmin);
   run=true;
   switch(_Period)
     {
      case PERIOD_M1:   SetIndexShift(0,1440*Days);SetIndexShift(1,1440*Days);   break;
      case PERIOD_M5:   SetIndexShift(0,288*Days); SetIndexShift(1,288*Days);    break;
      case PERIOD_M15:  SetIndexShift(0,96*Days);  SetIndexShift(1,96*Days);     break;
      case PERIOD_M30:  SetIndexShift(0,48*Days);  SetIndexShift(1,48*Days);     break;
      case PERIOD_H1:   SetIndexShift(0,24*Days);  SetIndexShift(1,24*Days);     break;
      case PERIOD_H4:   SetIndexShift(0,6*Days);   SetIndexShift(1,6*Days);      break;
      default: run=false; SetIndexShift(0,0); SetIndexShift(1,0);ArrayInitialize(Pmax,EMPTY_VALUE);ArrayInitialize(Pmin,EMPTY_VALUE); break;
     }
//---
   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[])
  {
//---
   if(prev_calculated==0)
     {
      run=true;
      ArrayInitialize(Pmax,EMPTY_VALUE);
      ArrayInitialize(Pmin,EMPTY_VALUE);
     }
   if(run)
     {
      int i=0,lastperiod=TimeDay(time[0]);
      double maxvalue;
      if(!ChartGetDouble(ChartID(),CHART_PRICE_MAX,0,maxvalue)) maxvalue=1000.0;
      maxvalue*=10.0;
      while(i<rates_total)
        {
         if(TimeDay(time[i])!=lastperiod)
           {
            lastperiod=TimeDay(time[i]);
            Pmax[i-1]=maxvalue;
            Pmin[i-1]=0.0;
           }
         else
           {
            Pmax[i]=EMPTY_VALUE;
            Pmin[i]=EMPTY_VALUE;
           }
         i++;
        }
      run=false;
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
Grafico EURUSD.e, H1, 2018.11.09 13:11 UTC, RoboForex (CY) Ltd, MetaTrader 4, Demo


Ho già provato e non so perché, non so perché, è la prima volta che lo vedo così, sembra che inizializzi i buffer quando cambio timeframes

 
neverness:

Finalmente ho visto l'unica "risposta costruttiva" alla mia domanda in tutta questa "discussione".

Per quanto riguarda gli errori, sono presenti su tutti i separatori-settimane nell'attuale (ultimo) frame sia su MT4 che su MT5.

Ovunque nell'ultima settimana il separatore MT4/MT5 disegna il separatore 7 giorni invece di 5.

Ma non è questo il punto. Gli errori ci sono sempre stati e ci saranno sempre. Tutto questo può essere corretto se esiste un codice di programma per disegnare i delimitatori.

Non sono gli errori che mi sorprendono, è qualcosa di completamente diverso.

Nessuno ha pensato di scrivere un programma per disegnare delimitatori nell'area prevista durante tutto il tempo di esistenza di MT4/MT5?

Dopo tutto, il programma è il più semplice.

Tutto quello che dovete sapere è la posizione dell'ultimo divisore e la "soluzione" del tempo lungo l'asse X (cioè quale intervallo di tempo prende 1 pixel).

E fino ad ora nessuno ha mai fatto una cosa del genere.

Questo mi sorprende davvero.

Ancora una volta, dovrai fare tutto da solo.

Te l'ho detto - l'ho fatto più di una volta. (e nel mercato, e in più di un indicatore)

e hai detto che hai già scritto il codice, lo scriverai di nuovo?)

 
Igor Makanu:

hmm, non so se sorridere o .... Se conosci un terminale di trading che soddisfa tutti i tuoi capricci, che senso ha? Io sono soddisfatto al 100% di MT4/5, posso farci tutto, tenere l'indicatore che disegna periodi D1 sul grafico, interessarmi alla programmazione, modificarlo per soddisfare le tue esigenze... Non credo che sarai in grado di farlo ....


Non saprei perché, è la prima volta che vedo un bug del genere.

Grazie, naturalmente.

Come sospettavo, nei giorni incompleti i vostri separatori di periodo non corrispondono a quelli standard.

Ma non ha molta importanza, perché non credo che dovresti cercare di ridisegnare i separatori standard, ma piuttosto di agganciare i separatori dell'area di previsione ai separatori della storia.

Allora la posizione dei delimitatori dei giorni di storia incompleta non influenzerà i delimitatori di previsione.

Un'altra differenza importante tra il tuo indicatore e i delimitatori standard è che i delimitatori standard sono aggiornati ad ogni evento sul grafico stesso, ma il tuo indicatore è aggiornato ad ogni evento OnCalculate(). Pensavo che questo sarebbe stato evidente - ma in realtà è appena percettibile.

Naturalmente, questo indicatore dovrebbe essere riprogettato, ma grazie comunque. Era interessante da vedere.

 
Ghabo:

Questo risulta essere l'indice della barra dell'oggetto con il nome specificato. C'è più di un oggetto e il suo nome è "QUADRO "+Time[i+1] Come faccio a sapere che non c'è un oggetto simile su dieci barre?

È chiaro con il buffer, se il valore è vuoto non viene mostrato nulla sul grafico, ma per quanto riguarda l'oggetto?

if (ObjectFind(0,"QUADRO"+Time[10])<0)
        {
        //объекта нет на 10 баре
        }
 
Vitaly Muzichenko:
Posso provare in questo modo?
  int n = Bars(Symbol(), PERIOD_CURRENT, ObjectGetInteger(0,"Rectangle",OBJPROP_TIME,1), TimeCurrent());

Grazie. Questo risulta essere l'indice della barra (120983) dell'oggetto con il nome specificato. C'è più di un oggetto e il suo nome è "QUADRO "+Time[i+1] Come faccio a sapere che non c'è un oggetto simile su dieci barre?

Ho capito con il buffer, se il valore è vuoto non viene mostrato nulla sul grafico, ma per quanto riguarda l'oggetto?