La table de tous les métiers. Accès via MQL5 - page 4

 
prostotrader:

Je ne pense pas en profondeur, je vois "plaqué" depuis les profondeurs.

Pourquoi penser ?

Lancez l'indicateur et voyez par vous-même !

Et lisez-vous seulement ce qui est écrit ?

Je l'ai lu, mais maintenant les trades sont fermés, quand je le relancerai je vérifierai à nouveau dans quelle direction les ticks sont téléchargés (sur mon script).
 
Karputov Vladimir:
Je l'ai lu, mais l'enchère est fermée maintenant, je vais vérifier à nouveau dans quelle direction les ticks sont téléchargés (sur mon script).

Il ne faut pas vérifier sur le script, mais lancer l'indicateur sur les chavs RTS-9.16 à - 20-9 heures, heure de Moscou (pour voir).

Et les ticks ne se copient pas toujours en profondeur, mais seulement si le premier tick d'un nouveau bloc est avec le temps du bloc précédent.

Il faut attendre les nouveaux ticks (bloc) et ne pas copier post factum.

Si vous exécutez votre script, tout se passera bien, car il copiera depuis l'historique et non pas

Pas"d'attente" de nouveaux blocs.

 
prostotrader:

Il est nécessaire de vérifier non pas sur le script, mais de lancer l'indicateur sur RTS-9.16 chavs à - 8-9 PM, heure de Moscou.

Et les ticks ne sont pas toujours copiés en profondeur, mais seulement si un nouveau bloc a le premier tick avec l'heure du bloc précédent.

Vous devriez vous attendre à de nouveaux ticks (bloc) au lieu de copier post factum.

J'ai un indicateur qui produit 20-30 derniers ticks. Je pense que je peux y ajouter un contrôle : vérifier tous les ticks reçus pour voir s'ils sont dans l'historique des ticks avec un temps anormal.
 
Karputov Vladimir:
J'ai un indicateur, il sort 20-30 derniers ticks. Je pense que je peux y ajouter un contrôle : vérifier tous les ticks reçus pour voir s'ils sont dans l'historique des ticks avec un temps anormal.

Vous ne pourrez pas "boulonner" le contrôle (cela n'a pas fonctionné pour moi) car vous ne savez pas s'il s'agit de vieilles tiques,

quel est le critère de contrôle ? Cela ne peut être vu qu'à l'œil nu si l'indicateur et le ruban sont placés côte à côte.

Mais vous devrez attendre longtemps (comme je l'ai dit, copié en profondeur par un seul critère)

N'oubliez pas que le défaut n'apparaît que dans deux conditions.

1. Nous " attendons " de nouveaux ticks (bloc).

2. Il n'est "ajouté" en profondeur que si, dans le nouveau bloc, le premier tick a l'heure du ou des tick(s) précédent(s) du bloc précédent.

 
prostotrader:

Vous ne pourrez pas "boulonner" le contrôle (cela n'a pas fonctionné pour moi) car vous ne savez pas s'il s'agit de vieilles tiques,

quel est le critère de contrôle ? Cela ne peut être vu qu'à l'œil nu si l'indicateur et le ruban sont placés côte à côte.

Mais vous devrez attendre longtemps (comme je l'ai dit, copié en profondeur par un seul critère)

N'oubliez pas que le défaut n'apparaît que dans deux conditions.

1. Nous " attendons " de nouveaux ticks (bloc).

2. Il n'est "ajouté" en profondeur que si, dans le nouveau bloc, le premier tick a l'heure du ou des tick(s) précédent(s) du bloc précédent.

Supprimez les choses inutiles - calcul et rendu de l'indicateur. Laissez seulement obtenir et vérifier le tableau des tics. Pour rechercher une erreur (quelle qu'elle soit), vous devez simplifier le code autant que possible.
 
Karputov Vladimir:
Supprimez les choses inutiles - le calcul et le dessin de l'indicateur. Il ne reste que l'obtention et la vérification du tableau des tics. Pour rechercher une erreur (quelle qu'elle soit), vous devez simplifier le code autant que possible.

S'il y avait une erreur dans mon code, elle apparaissait toujours.

Mais tel qu'il est, l'indicateur fonctionne correctement (je l'ai vérifié plusieurs fois avec les données du tableau).

Ceci est clairement visible, si vous exécutez l'indicateur sur les instruments mid-liquides.

Et il est presque impossible de "se perdre à travers deux pins" (il n'y a pas une seule ligne de ce code qui puisse être coupée :( ).

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:

S'il y avait une erreur dans mon code, elle apparaissait toujours.

Mais tel qu'il est, l'indicateur fonctionne correctement (je l'ai vérifié plusieurs fois avec les données du tableau).

Ceci est clairement visible, si vous exécutez l'indicateur sur les instruments mid-liquides.

Et il est presque impossible de "s'égarer entre deux pins" (il n'y a pas une seule ligne dans ce code qui puisse être coupée :() ).

Vous devez prendre en compte les ticks précédemment chargés au moment du démarrage, sinon la duplication des ticks se produit.

Voici un exemple, la fonction renvoie les derniers ticks, il est tiré de ma classe d'histoire des ticks, mais je pense que tout sera clair dans le code.

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);
}
 

Mode de demande de ticks - derniers "ticks" des ticks - c'est-à-dire que le temps est "0" :

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

Un indicateur (sur le graphique de gauche) demande CopyTicks() dans OnCalculate(), le second indicateur (sur le graphique de droite) demande CopyTicks() dans OnBookEvent().

Et voici la photo :

?

Les ticks sont affichés comme suit : l'élément avec l'indice "0" est tout en bas du graphique et le tick time de l'élément avec l'indice "0" est le plus ancien. L'élément avec l'index "29" a le temps de tic le plus jeune. Nous y voilà : j'ai trouvé, au moins dans cette figure, deux incohérences, ci-dessous un exemple pour la première :

Index des articlestemps de tic-tacNote



231472205757952Erreur : 1472205757952 < 1472205757959
221472205757959C'est exact : 1472205757959 !< 1472205757432
211472205757432
Dossiers :
 
Yury Kulikov:
Vous devez prendre en compte les ticks chargés précédemment à l'heure de début, sinon il y a duplication des ticks.

Voici un exemple, la fonction renvoie les derniers ticks, tiré de ma classe de traitement de l'historique des ticks, mais je pense que c'est clair dans le code.

Voici la prévention de la duplication dans mon code :

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

J'ai remplacé COPY_TICKS_ALL par COPY_TICKS_TRADE et cela semble fonctionner correctement,

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;

mais je vais continuer à vérifier. :)

Je ne peux pas regarder la bande de façon statique, donc j'attends le dédouanement.