Tisch für alle Berufe. Zugriff über MQL5 - Seite 4

 
prostotrader:

Ich denke nicht in die Tiefe, ich sehe "angeheftet" aus der Tiefe.

Warum denken?

Führen Sie den Indikator aus und überzeugen Sie sich selbst!

Und lesen Sie überhaupt, was dort geschrieben steht?

Ich habe es gelesen, aber jetzt sind die Trades geschlossen, wenn ich es starte, werde ich wieder prüfen, in welche Richtung Ticks heruntergeladen werden (auf meinem Skript).
 
Karputov Vladimir:
Ich habe es gelesen, aber die Ausschreibung ist jetzt geschlossen, ich werde noch einmal prüfen, in welche Richtung die Zecken heruntergeladen werden (in meinem Skript).

Sie sollten nicht auf das Skript zu überprüfen, sondern führen Sie den Indikator auf RTS-9.16 chavs bei - 8-9 Uhr, Moskauer Zeit (zu sehen).

Und die Ticks werden nicht immer in die Tiefe kopiert, sondern nur, wenn der erste Tick in einem neuen Block mit der Zeit des vorherigen Blocks übereinstimmt.

Sie müssen die neuen Zecken abwarten (blockieren) und nicht postfaktisch kopieren.

Wenn Sie Ihr Skript ausführen, ist alles in Ordnung, denn es wird aus dem Verlauf kopiert und nicht

Kein"Warten" auf neue Blöcke.

 
prostotrader:

Es ist notwendig, nicht auf Skript zu überprüfen, sondern laufen Indikator auf RTS-9.16 chavs bei - 8-9 PM, Moskauer Zeit.

Und die Ticks werden nicht immer in die Tiefe kopiert, sondern nur, wenn ein neuer Block den ersten Tick mit der Zeit des vorherigen Blocks hat.

Sie sollten neue Zecken (Block) erwarten, anstatt post factum zu kopieren.

Ich habe einen Indikator, der 20-30 letzte Ticks ausgibt. Ich denke, ich kann eine Prüfung hinzufügen: alle empfangenen Ticks daraufhin überprüfen, ob sie in der Historie der Ticks mit abnormaler Zeit enthalten sind.
 
Karputov Vladimir:
Ich habe einen Indikator, der 20-30 letzte Ticks ausgibt. Ich denke, ich kann eine Prüfung hinzufügen: alle empfangenen Ticks daraufhin überprüfen, ob sie in der Geschichte der Ticks mit abnormaler Zeit enthalten sind.

Sie können den Scheck nicht "anschrauben" (bei mir hat das nicht funktioniert), weil Sie nicht wissen, ob es sich um alte Zecken handelt,

Was ist das Kriterium für die Kontrolle? Dies ist nur mit dem "Auge" zu erkennen, wenn der Indikator und das Band nebeneinander gelegt werden.

Aber Sie werden lange warten müssen (wie gesagt, nur nach einem Kriterium in die Tiefe kopiert)

Beachten Sie, dass der Fehler nur unter zwei Bedingungen auftritt.

1. Wir "warten" auf neue Ticks (Block)

2. Es wird nur dann in der Tiefe "angehängt", wenn im neuen Block der 1. Tick die Zeit des/der vorherigen Ticks des vorherigen Blocks hat.

 
prostotrader:

Sie können den Scheck nicht "anschrauben" (bei mir hat das nicht funktioniert), weil Sie nicht wissen, ob es sich um alte Zecken handelt,

Was ist das Kriterium für die Kontrolle? Dies ist nur mit dem "Auge" zu erkennen, wenn der Indikator und das Band nebeneinander gelegt werden.

Aber Sie werden lange warten müssen (wie gesagt, nur nach einem Kriterium in die Tiefe kopiert)

Beachten Sie, dass der Fehler nur unter zwei Bedingungen auftritt.

1. Wir "warten" auf neue Zecken (Block)

2. Es wird nur dann in der Tiefe "angehängt", wenn im neuen Block der 1. Tick die Zeit des/der vorherigen Ticks des vorherigen Blocks hat.

Unnötige Dinge abschneiden - Berechnung und Darstellung des Indikators. Lassen Sie nur get und überprüfen Sie das Array der Zecken. Um nach einem Fehler zu suchen (egal von wem), müssen Sie den Code so weit wie möglich vereinfachen.
 
Karputov Vladimir:
Schneiden Sie unnötige Dinge ab - die Berechnung und Zeichnung des Indikators. Lassen Sie nur den Erhalt und die Überprüfung des Tick-Arrays. Um nach einem Fehler zu suchen (egal von wem), müssen Sie den Code so weit wie möglich vereinfachen.

Wenn mein Code einen Fehler enthielt, wurde dieser immer angezeigt.

Aber so wie es ist, funktioniert der Indikator richtig (ich habe es viele Male mit Daten aus der Tabelle überprüft)

Dies ist deutlich zu erkennen, wenn Sie den Indikator auf die mittelflüssigen Instrumente anwenden.

Und es ist fast unmöglich, sich "durch zwei Kiefern zu verirren" (es gibt keine einzige Zeile in diesem Code, die man kürzen könnte:( ).

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:

Wenn mein Code einen Fehler enthielt, wurde dieser immer angezeigt.

Aber so wie es ist, funktioniert der Indikator richtig (ich habe es viele Male mit Daten aus der Tabelle überprüft)

Dies ist deutlich zu erkennen, wenn Sie den Indikator auf die mittelflüssigen Instrumente anwenden.

Und es ist fast unmöglich, sich "durch zwei Kiefern zu verirren" (es gibt keine einzige Zeile in diesem Code, die man kürzen könnte :() ).

Bei der Startzeit müssen die zuvor geladenen Ticks berücksichtigt werden, da es sonst zu einer Verdoppelung der Ticks kommt.

Hier ist ein Beispiel, Funktion gibt letzte Ticks, zog aus meiner Klasse von Tick Geschichte Verarbeitung, aber ich denke, alles wird aus dem Code klar sein.

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

Tick-Anforderungsmodus - letzte "Ticks" von Ticks - d.h. Zeit ist "0":

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

Ein Indikator (im linken Diagramm) fordert CopyTicks() in OnCalculate(), der zweite Indikator (im rechten Diagramm) fordert CopyTicks() in OnBookEvent().

Und hier ist das Bild:

?

Die Ticks werden wie folgt angezeigt: Das Element mit dem Index "0" befindet sich ganz unten im Diagramm und die Tickzeit des Elements mit dem Index "0" ist die älteste. Das Element mit dem Index "29" hat die jüngste Tickzeit. Ich habe, zumindest in dieser Abbildung, zwei Ungereimtheiten gefunden, unten ist ein Beispiel für die erste:

ArtikelindexZeit tickenHinweis



231472205757952Fehler: 1472205757952 < 1472205757959
221472205757959Das ist richtig: 1472205757959 !< 1472205757432
211472205757432
Dateien:
 
Yury Kulikov:
Sie müssen die zuvor geladenen Ticks bei start_time berücksichtigen, da es sonst zu einer Verdoppelung der Ticks kommt.

Hier ist ein Beispiel, die Funktion gibt die letzten Ticks zurück, die von meiner Tick-History-Verarbeitungsklasse stammen, aber ich denke, es ist klar aus dem Code.

Hier ist die Vermeidung von Duplikaten in meinem Code:

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

Ich habe COPY_TICKS_ALL in COPY_TICKS_TRADE umgewandelt und es scheint richtig zu funktionieren,

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;

aber ich werde weiter nachsehen. :)

Ich kann mir das Band nicht statisch ansehen, also warte ich auf die Freigabe.

Grund der Beschwerde: