[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 479

 
midorum:
prova il Bars-30
No, non lo è. Logicamente rientrerebbe a sinistra di 30 barre e disegnerebbe alla 0a barra.
 
SetIndexDrawBegin(0,Bars-30);//первый бар отрисовки индикатора 

Non so quale sia la vostra logica, con me questa impostazione disegna le ultime 30 barre dell'indicatore

Ancora una volta, SetIndexDrawBegin() calcola le barre dall'estremità sinistra del grafico

controllare prima di iniziare a discutere

 
merkulov.artem:

OK. Cercherò di delineare l'essenza del problema, forse qualcuno suggerirà o aiuterà ad implementarlo in un modo più semplice.

Stiamo lavorando su una tabella dei minuti. Prendiamo la barra di un minuto (high+low/2 - valore medio della barra) sul grafico del 29/10/12 alle 00:00 - sarà un punto di riferimento.

Poi controlliamo la deviazione da questo prezzo verso l'alto di 10 pip (ogni deviazione corretta è +1).

Quando raggiungiamo la deviazione di 10 punti dal punto di partenza - il contatore +1; e cominciamo a controllare ulteriori deviazioni, ma dal punto, dove abbiamo raggiunto la deviazione di 10 punti, e aspettiamo il prossimo aumento di 10 punti nel prezzo.

Per esempio, otteniamo:

Se (punto di partenza) + 10 pips <= prezzo (usiamo tutti i prezzi successivi delle barre dal punto di partenza.) Otteniamo un contatore = contatore +1; e facciamo partire il punto di partenza già da questo punto -(punto di partenza + 10 pips).

Se (punto di partenza + 10 pi ps) +10 pips <= prezzo (si usano tutti i prezzi successivi delle barre dal punto di riferimento) si ottiene counter=Counter+1; e si parte da questo punto-(punto di partenza + 10 pips) +10 pips.

Se(punto di partenza + 10 pi ps+ 10 pips) + 10 pips <= prezzo (usiamo tutti i prezzi successivi delle barre dal punto di riferimento.) otteniamo counter=Counter+1; e partiamo da questo punto -(punto di partenza + 10 pips+ 10 pips) + 10 pips.

e così via...

Fino a raggiungere un contatore di 10(contatore == 10).

E ogni nuovabarra di 1 minuto formata(high+low/2 - valore medio della barra) controlliamo questa condizione e aspettiamo che il contatore raggiunga10 (contatore == 10). Supponiamo che siano passati due giorni, ogni nuova barra formata abbiamo controllato e spostato se le condizioni erano corrette .....

E quando abbiamo raggiunto il contatore =10 - emettiamo il messaggio che "Contatore == 10". Impostiamo il punto di partenza 2 giorni prima di quello originale impostato dall'utente, cioè dal29/10/12 alle 00:00 al 31/10/12 alle 00:00 e ripetiamo il ciclo.

Ripetere il ciclo e quindi muoversi attraverso il programma.

Cioè dovremmo prendere le barre appena formate e disegnare(high+low/2 - valore medio della barra). Controllate le condizioni e, se sono corrette, spostatele come descritto sopra.

Ho provato a implementarlo attraverso un array, è molto confuso e dà valori sbagliati! Per favore aiutatemi, come implementare questo algoritmo!


Qui non hai affatto bisogno di array. Questo è anche un Expert Advisor, uno script o un indicatore? La questione è che il codice dell'Expert Advisor sarà diverso da quello dell'indicatore per l'attuazione di questo compito.

E qui c'è uno svantaggio significativo. Guardate, abbiamo segnato il punto di partenza ed è proprio sul picco del trend rialzista. Supponiamo di non considerare la lettura di questa candela in un ulteriore recupero di 10 punti - chiamiamola la candela di partenza. Quindi, la prossima candela va verso il basso e non prendiamo nessuno dei due livelli = punto di partenza + 10 pips: il prezzo scende. Perciò possiamo dire che siamo bloccati per molto tempo - il prezzo è sceso e può andare su e giù comunque - non raggiungerà comunque il livello del punto di partenza - gli orsi lo hanno premuto a fondo. Ma diciamo che siamo stati fortunati e dopo 5.000 candele il prezzo è tornato al livello del punto di partenza, e addirittura è salito di 10 pip. Abbiamo perso molto tempo, ma ora possiamo mettere il prezzo uguale al punto di partenza + 10 punti nella variabile e aspettare che il prezzo raggiunga il livello = livello variabile + 10 punti... In breve, non abbiamo bisogno di tutto questo - a giudicare dalla tua descrizione stiamo catturando il livello = punto di partenza + 10*10 = punto di partenza + 100 pips. Una volta raggiunto questo livello, spostiamo la data di inizio 2 giorni nel futuro e calcoliamo un nuovo punto di partenza. Questo è complicato - c'è un modo più semplice.

Impostiamo la data di inizio in variabili personalizzate (precedute da extern nel codice). Dichiarare una variabile di tipo datetime. Supponiamo che sia la variabile dt_StartDate (data di inizio) e poi nel blocco di inizializzazione le assegniamo il valore memorizzato nella variabile personalizzata. Poi cerchiamo la candela che corrisponde a questa data e calcoliamo il punto di partenza usando la tua formula. Tuttavia, non è il punto di partenza, ma il livello di prezzo di partenza. Dichiarare una variabile di tipo doppio, per esempio d_StartLevel (livello iniziale) e inserire il valore del livello calcolato nella variabile. Oppure può essere ancora più semplice - non dichiarare una variabile, ma disegnare una linea orizzontale attraverso il prezzo di partenza calcolato. Chiamiamolo StartLevel. Ora disegniamo la seconda linea sul grafico ad una distanza = 100 punti dal livello di partenza - chiamiamola OtlovLevel. Inoltre, non abbiamo bisogno di alcun array - su ogni tick guarderemo semplicemente se il prezzo è superiore a OtlovLevel o no. Appena lo è, aumentiamo il valore della variabile dt_StartDate di 2 giorni, calcoliamo di nuovo il livello di partenza e spostiamo lì la linea di partenza. Dopo di che prendiamo di nuovo 100 punti dalla linea di partenza e trasciniamo lì la linea OtlovLevel. Questo è tutto, il compito è risolto. Ogni volta possiamo richiedere il prezzo a cui è impostata qualsiasi linea e confrontarlo con il prezzo corrente o con il prezzo massimo della candela corrente.

 
midorum:

Non so quale sia la vostra logica, con me questa impostazione disegna le ultime 30 barre dell'indicatore

Ancora una volta, SetIndexDrawBegin() calcola le barre dall'estremità sinistra del grafico

Controllate prima di discutere.

Quindi non sto discutendo. Ecco uno sguardo. Prendiamo un indicatore CCI standard. Ho sostituitoCCIPeriod con(Bars- CCIPeriod) nella funzione SetIndexDrawBegin . Ho cambiato solo il giallo evidenziato nel codice...

Ecco il codice:

//+------------------------------------------------------------------+
//|                                                          CCI.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
//----
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen
//---- input parameters
extern int CCIPeriod = 14;
//---- buffers
double CCIBuffer[];
double RelBuffer[];
double DevBuffer[];
double MovBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 3 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(1, RelBuffer);
   SetIndexBuffer(2, DevBuffer);
   SetIndexBuffer(3, MovBuffer);
//---- indicator lines
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, CCIBuffer);
//----
   if(CCIPeriod <= 0)
       CCIPeriod = 14;
//----
   SetIndexDrawBegin(0, Bars - CCIPeriod);
  
//---- name for DataWindow and indicator subwindow label
   short_name="CCI(" + CCIPeriod + ")";
   IndicatorShortName(short_name);
   SetIndexLabel(0, short_name);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Commodity Channel Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i, k, counted_bars = IndicatorCounted();
   double price, sum, mul; 
   if(CCIPeriod <= 1)
       return(0);
   if(Bars <= CCIPeriod) 
       return(0);
//---- initial zero
   if(counted_bars < 1)
     {
       for(i = 1; i <= CCIPeriod; i++) 
           CCIBuffer[Bars-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) 
           DevBuffer[Bars-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) 
           MovBuffer[Bars-i] =0.0;
     }
//---- last counted bar will be recounted
   int limit = Bars - counted_bars;
   if(counted_bars > 0) 
       limit++;
//---- moving average
   for(i = 0; i < limit; i++)
       MovBuffer[i] = iMA(NULL, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i);
//---- standard deviations
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   mul = 0.015 / CCIPeriod;
   while(i >= 0)
     {
       sum = 0.0;
       k = i + CCIPeriod - 1;
       while(k >= i)
        {
          price =(High[k] + Low[k] + Close[k]) / 3;
          sum += MathAbs(price - MovBuffer[i]);
          k--;
        }
       DevBuffer[i] = sum*mul;
       i--;
     }
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   while(i >= 0)
     {
       price = (High[i] + Low[i] + Close[i]) / 3;
       RelBuffer[i] = price - MovBuffer[i];
       i--;
     }
//---- cci counting
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   while(i >= 0)
     {
       if(DevBuffer[i] == 0.0) 
           CCIBuffer[i] = 0.0;
       else 
           CCIBuffer[i] = RelBuffer[i] / DevBuffer[i];
       i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Logicamente, seCCIPeriod è 14. AlloraSetIndexDrawBegin(0, Bars - CCIPeriod) dovrebbe disegnare solo 14 ultime barre. Si parte dal valore (Bar - 14). Ma questo è ciò che vedo sullo schermo

 
hoz:

Quindi non sto discutendo. Ecco uno sguardo. Prendete l'indicatore CCI standard. Ho sostituitoCCIPeriod nella funzione SetIndexDrawBegin con(Bars- CCIPeriod). Ho cambiato solo il giallo evidenziato nel codice...

Ecco il codice:

Logicamente, seCCIPeriod è 14. AlloraSetIndexDrawBegin(0, Bars - CCIPeriod) dovrebbe disegnare solo 14 ultime barre. Si parte dal valore (Bar - 14). Ma questo è quello che vedo sullo schermo

Questo è ciò che vedo sullo schermo

in alto l'indicatore nativo, sotto cambiato in SetIndexDrawBegin(0, Bars-CCIPeriod);

 
midorum, le mie scuse. Il mio errore. MetaEditor ha aperto un altro terminale... Ora funziona. Grazie!
 
hoz:
midorum, le mie scuse. Il mio errore. MetaEditor ha aperto un altro terminale... Ora funziona. Grazie!
Sì, anch'io lotto sempre con questo problema - 3 terminali, e Editor confonde le cartelle. Meglio eseguirlo attraverso il pulsante nel terminale e aprire il file in esso manualmente.
 

Buon giorno gente, per favore datemi una risposta, come determinare che la candela a 15 minuti si è aperta, ho usato una stringa di mentalità, ma come si è scoperto, non sempre la candela si apre per tempo... penso che ci sia un modo più semplice per scoprire che la candela si è aperta... ma non lo capisco...

se ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)

 
stater:

Buon giorno gente, per favore datemi una risposta, come determinare che la candela a 15 minuti si è aperta, ho usato una stringa di mentalità, ma come si è scoperto, non sempre la candela si apre per tempo... penso che ci sia un modo più semplice per scoprire che la candela si è aperta... ma non lo capisco...

se ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)


https://www.mql5.com/ru/forum/131853/page4#504607
 
stater:

Buon giorno gente, per favore datemi una risposta, come determinare che la candela a 15 minuti si è aperta, ho usato una stringa di mentalità, ma come si è scoperto, non sempre la candela si apre per tempo... penso che ci sia un modo più semplice per scoprire che la candela si è aperta... ma non lo capisco...

se ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)


bool CheckOpenM15()
{
   static int PrevTime=0;
   if (PrevTime==iTime(NULL, PERIOD_M15,0)) return(false);
   PrevTime=iTime(NULL, PERIOD_M15,0);
   return(true);
}
La funzione restituisce vero quando appare una nuova barra su M15
Motivazione: