Tavolo di tutti i mestieri. Accesso tramite MQL5 - pagina 4

 
prostotrader:

Non penso in profondità, vedo "attaccato" dal profondo.

Perché pensare?

Esegui l'indicatore e guarda tu stesso!

E leggete almeno quello che è scritto?

L'ho letto, ma ora i trade sono chiusi, quando lo avvierò controllerò di nuovo in che direzione vengono scaricati i tick (sul mio script).
 
Karputov Vladimir:
L'ho letto, ma l'offerta è chiusa ora, controllerò di nuovo in quale direzione vengono scaricati i tick (sul mio script).

Non si dovrebbe controllare lo script, ma eseguire l'indicatore su RTS-9.16 chavs a - 8-9 pm, ora di Mosca (per vedere).

E i tick non si copiano sempre in profondità, ma solo se il primo tick di un nuovo blocco è con il tempo del blocco precedente.

Bisogna aspettare le nuove zecche (blocco) e non copiare post factum.

Se eseguite il vostro script, andrà bene, perché copierà dalla cronologia e non

Non"in attesa" di nuovi blocchi.

 
prostotrader:

È necessario controllare non su script, ma eseguire l'indicatore su RTS-9.16 chavs a - 8-9 PM, ora di Mosca.

E i tick non sono sempre copiati in profondità, ma solo se un nuovo blocco ha il primo tick con il tempo del blocco precedente.

Dovreste aspettarvi nuove zecche (blocco) invece di copiare post factum.

Ho un indicatore che emette 20-30 ultimi tick. Penso di poter aggiungere un controllo: controllare tutte le zecche ricevute per vedere se sono nella cronologia delle zecche con tempo anomalo.
 
Karputov Vladimir:
Ho un indicatore che emette 20-30 ultimi tick. Penso di poter aggiungere un controllo: controllare tutte le zecche ricevute per vedere se sono nella cronologia delle zecche con tempo anomalo.

Non potrai "imbullonare" il controllo (non ha funzionato per me) perché non sai se sono vecchie zecche,

qual è il criterio di controllo? Questo può essere visto solo a "occhio" se l'indicatore e il nastro sono posti uno accanto all'altro

Ma dovrete aspettare molto tempo (come ho detto, copiato in profondità da un solo criterio)

Ricordate che il difetto appare solo in due condizioni.

1. Aspettiamo nuove zecche (blocco)

2. Si "attacca" in profondità, solo se nel nuovo blocco il 1° tick ha il tempo del o dei tick precedenti del blocco precedente.

 
prostotrader:

Non potrai "imbullonare" il controllo (non ha funzionato per me) perché non sai se sono vecchie zecche,

qual è il criterio di controllo? Questo può essere visto solo a "occhio" se l'indicatore e il nastro sono posti uno accanto all'altro

Ma dovrete aspettare molto tempo (come ho detto, copiato in profondità da un solo criterio)

Ricordate che il difetto appare solo in due condizioni.

1. Aspettiamo nuove zecche (blocco)

2. Si "attacca" in profondità, solo se nel nuovo blocco il 1° tick ha il tempo del o dei tick precedenti del blocco precedente.

Tagliare le cose inutili - calcolo e rendering dell'indicatore. Lascia solo ottenere e controllare l'array di zecche. Per cercare un errore (non importa di chi) è necessario semplificare il codice il più possibile.
 
Karputov Vladimir:
Tagliare le cose inutili - il calcolo e il disegno dell'indicatore. Lascia solo l'ottenimento e il controllo dell'array di tick. Per cercare un errore (non importa di chi) è necessario semplificare il codice il più possibile.

Se c'era un errore nel mio codice, veniva sempre fuori.

Ma così com'è, l'indicatore funziona correttamente (l'ho controllato molte volte con i dati della tabella)

Questo si vede chiaramente, se si esegue l'indicatore sugli strumenti mid-liquid.

Ed è quasi impossibile "perdersi tra due pini" (non c'è una sola linea in questo codice che possa essere tagliata:( ).

if(start_time==0)
        {
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,1)==1)
           {
            start_time=ulong(ticks[0].time_msc);
           }
        }
      else
        {
         sell_deals= 0;
         buy_deals = 0;
         sell_vol= 0;
         buy_vol = 0;
         int copied=CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,start_time,0);
         if(copied>0)
           {
            for(int i=0; i<copied; i++)
              {
               if(( ticks[i].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
                 {
                  buy_deals++;
                  buy_vol+=ticks[i].volume;
                 }
               else
               if(( ticks[i].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
                 {
                  sell_deals++;
                  sell_vol+=ticks[i].volume;
                 }
              }
            if(start_time==ulong(ticks[copied-1].time_msc)) return;
            start_time=ulong(ticks[copied-1].time_msc);
            if(( sell_deals==0) && (buy_deals==0)) return;
}
 
prostotrader:

Se c'era un errore nel mio codice, veniva sempre fuori.

Ma così com'è, l'indicatore funziona correttamente (l'ho controllato molte volte con i dati della tabella)

Questo si vede chiaramente, se si esegue l'indicatore sugli strumenti mid-liquid.

Ed è quasi impossibile "perdere la strada attraverso due pini" (non c'è una sola linea in questo codice che possa essere tagliata :() ).

È necessario considerare i tick precedentemente caricati in start_time, altrimenti avviene la duplicazione dei tick.

Ecco un esempio, la funzione restituisce gli ultimi tick, è presa dalla mia classe di storia dei tick, ma penso che tutto sarà chiaro dal codice.

int CTickHistory::LastTicks(MqlTick &_ticks[])
{
   if(m_lasttick<=0) return(-1);  //нет загруженной истории
   int n=CopyTicks(m_symbol,tk,COPY_TICKS_TRADE,m_lasttick,TICKHISTORY_MAX_TICKS);
   if(n>m_lastcount)
   {
      n=ArrayResize(_ticks,n-m_lastcount);//размер массива под новые тики
      ArrayCopy(_ticks,tk,0,m_lastcount,n);//копирование только новых тиков
      //определим количество всех тиков, приходящихся на последний момент времени,
      //необходимое для отсечки загруженных тиков при следующем вызове
      if(m_lasttick!=_ticks[n-1].time_msc)
      {
         m_lasttick=_ticks[n-1].time_msc;
         m_lastcount=1;
         for(int i=n-2; i>=0; i--)
         {
            if(_ticks[i].time_msc<m_lasttick) break;
            m_lastcount++;
         }
      }else m_lastcount+=n;
   }else n=0;//нет новых тиков
   return(n);
}
 

Modalità di richiesta di tick - ultimo "tick" di tick - cioè il tempo è "0":

   int copied=CopyTicks(_Symbol,tick_array,type,0,ticks);

Un indicatore (sul grafico di sinistra) richiede CopyTicks() in OnCalculate(), il secondo indicatore (sul grafico di destra) richiede CopyTicks() in OnBookEvent().

Ed ecco la foto:

?

I tick sono visualizzati come segue: l'elemento con indice "0" è in fondo al grafico e il tempo di tick dell'elemento con indice "0" è il più vecchio. L'elemento con indice "29" ha il tempo di tick più giovane. Eccoci qui: ho trovato, almeno in questa figura, due incongruenze, di seguito un esempio per la prima:

Indice degli articoliTempo di spuntaNota



231472205757952Errore: 1472205757952 < 1472205757959
221472205757959Proprio così: 1472205757959 !< 1472205757432
211472205757432
File:
 
Yury Kulikov:
È necessario prendere in considerazione i tick precedentemente caricati in start_time, altrimenti si verifica una duplicazione dei tick.

Ecco un esempio, la funzione restituisce gli ultimi tick, estratti dalla mia classe di elaborazione della storia dei tick, ma penso che sia chiaro dal codice.

Ecco la prevenzione della duplicazione nel mio codice:

if(start_time==ulong(ticks[copied-1].time_msc)) return;
 

Corretto COPY_TICKS_ALL in COPY_TICKS_TRADE e sembra funzionare correttamente,

2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Pred tiks
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Prev ticks, element 0 time = 2016.08.26 10:42:15.576
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Prev ticks, element 1 time = 2016.08.26 10:42:15.595
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr tiks
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 0 time = 2016.08.26 10:42:15.595
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 1 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 2 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 3 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 4 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 5 time = 2016.08.26 10:42:17.235

if(start_time==0)
        {
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_TRADE,0,1)==1)
           {
            start_time=ulong(ticks[0].time_msc);
           }
        }
      else
        {
         sell_deals= 0;
         buy_deals = 0;
         sell_vol= 0;
         buy_vol = 0;
         int copied=CopyTicks(Symbol(),ticks,COPY_TICKS_TRADE,start_time,0);
         if(copied>0)
           {
             int a_size = ArraySize(prev_ticks);
             if (a_size>0)
             {
               if (prev_ticks[a_size-1].time_msc == ticks[0].time_msc)
               {
                 Print("Pred tiks");
                 for(int i=0; i<a_size; i++)
                 {
                   
                   Print("Prev ticks, element ", i, " time = ", ConvTimeMscToStr( prev_ticks[i].time_msc ) );
                 }
                  Print("Curr tiks");
                 for(int i=0; i<copied; i++)
                 {
                  
                   Print("Curr ticks, element ", i, " time = ", ConvTimeMscToStr(ticks[i].time_msc ));
                 }
               }
               else
               {
                 ArrayResize(prev_ticks, copied);
                 for(int i=0; i<copied; i++)
                 {
                   prev_ticks[i]=ticks[i]; 
                 }   
               }
             }
             else
             {
               ArrayResize(prev_ticks, copied);
                 for(int i=0; i<copied; i++)
                 {
                   prev_ticks[i]=ticks[i]; 
                 }
             }
           
           /* for(int i=0; i<copied; i++)
              {
               if(( ticks[i].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
                 {
                  buy_deals++;
                  buy_vol+=ticks[i].volume;
                 }
               else
               if(( ticks[i].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
                 {
                  sell_deals++;
                  sell_vol+=ticks[i].volume;
                 }
              }*/
            if(start_time==ulong(ticks[copied-1].time_msc)) return;
            start_time=ulong(ticks[copied-1].time_msc);
            if(( sell_deals==0) && (buy_deals==0)) return;

ma continuerò a controllare. :)

Non posso guardare il nastro in modo statico, quindi aspetterò il clearing.