Testen von 'CopyTicks' - Seite 24

 
Alexey Kozitsyn:

Warum?

int  CopyTicks(
   string           symbol_name,           // имя символа
   MqlTick&         ticks_array[],         // массив для приёма тиков
   uint             flags=COPY_TICKS_ALL,  // флаг, определяющий тип получаемых тиков
   ulong            from=0,                // дата, начиная с которой запрашиваются тики
   uint             count=0                // количество тиков, которые необходимо получить
   );
Hervorgehoben in Fettdruck. Das Array am Ende ist eine Ablehnung von Standardwerten.
 
fxsaber:
int  CopyTicks(
   string           symbol_name,           // имя символа
   MqlTick&         ticks_array[],         // массив для приёма тиков
   uint             flags=COPY_TICKS_ALL,  // флаг, определяющий тип получаемых тиков
   ulong            from=0,                // дата, начиная с которой запрашиваются тики
   uint             count=0                // количество тиков, которые необходимо получить
   );
Hervorgehoben in Fettdruck.
Nicht hervorgehoben, aber wahrscheinlich oben beantwortet...
 
fxsaber:
int  CopyTicks(
   string           symbol_name,           // имя символа
   MqlTick&         ticks_array[],         // массив для приёма тиков
   uint             flags=COPY_TICKS_ALL,  // флаг, определяющий тип получаемых тиков
   ulong            from=0,                // дата, начиная с которой запрашиваются тики
   uint             count=0                // количество тиков, которые необходимо получить
   );
Ich habe es fett gedruckt. Array am Ende - vermeiden Sie Standardwerte.

Ja, die Größe der Ticks im Cache kann in der Dokumentation explizit angegeben werden. Wenn Sie den gesamten Cache erhalten möchten, sehen Sie in der Dokumentation nach und fragen Sie die erforderliche Anzahl mit der Funktion ab, mit Parametern wie hier:

intCopyBuffer(
intindicator_handle,// Indikator-Handle
intbuffer_num,// Nummer des Anzeigepuffers
intstart_pos,//Anfangspunkt
intcount,// wie viele wir kopieren
doublebuffer[]// Array, in das die Daten kopiert werden
);

Alles ist schon erfunden worden, warum sollte man etwas Neues erfinden?

 
Alexey Kozitsyn:

Ich denke, es ist viel wichtiger, einen Download auf das aktuelle Datum durchzuführen, als zu versuchen, die Standardeinstellungen beizubehalten.

So wird es von Datum zu Datum sein. CopyTicks, die versuchen, in der Syntax mit Copy-Funktionen übereinzustimmen, nur weil das Wort Copy im Namen vorkommt, ist nicht sinnvoll. Praktisch und gerechtfertigt ist es, wenn Sie Präprozessor-Zeug wie dieses machen können

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
Bei CopyTicks ist dies nicht möglich, da es zwei verschiedene physische Threads (TRADE und INFO) und einen synthetischen Thread (ALL) gibt - Flags.
 
fxsaber:

So wird es von Datum zu Datum sein. CopyTicks, die versuchen, die Syntax an Copy-Funktionen anzupassen, nur weil Copy im Namen vorkommt, ist unpraktisch. Praktisch und gerechtfertigt ist es, wenn man so etwas mit dem Präprozessor machen kann.

#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
Bei CopyTicks ist dies nicht möglich, da es zwei verschiedene physische Threads (TRADE und INFO) und einen synthetischen (ALL) gibt.

Bevor Sie im Forum aufgetaucht sind, hatte ich diese Art zu schreiben noch nicht kennengelernt, wofür ich Ihnen natürlich danke, aber ich bin mir nicht sicher, ob viele Programmierer sie nützlich finden würden.

 
fxsaber:

Bei Ihrer Demo ist das in der Tat der Fall. Bei BCS ist das nicht der Fall.

Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 46.66 ms)


2016.10.18 15:12:32.949 Test14 (Si-12.16,M1)    Time: 29089 msc for 1503 records
2016.10.18 15:12:32.822 Test14 (Si-12.16,M1)    Time: 33207 msc for 1501 records
2016.10.18 15:12:32.639 Test14 (Si-12.16,M1)    Time: 21389 msc for 1500 records
2016.10.18 15:12:31.959 Test14 (Si-12.16,M1)    Time: 21926 msc for 1500 records

Und bei Alpari ist es gar nicht gut.

Network 'xxx': authorized on Alpari-MT5 through mt5.nl.3 (ping: 61.87 ms)

2016.10.18 15:14:47.159 Test14 (GBPUSD,M1)      Time: 31086 msc for 1836 records
2016.10.18 15:14:46.999 Test14 (GBPUSD,M1)      Time: 30698 msc for 1836 records
2016.10.18 15:14:46.779 Test14 (GBPUSD,M1)      Time: 46306 msc for 1836 records
2016.10.18 15:14:46.612 Test14 (GBPUSD,M1)      Time: 30440 msc for 1836 records
2016.10.18 15:14:46.532 Test14 (GBPUSD,M1)      Time: 36227 msc for 1836 records

Oben wurde bereits über die Unannehmlichkeiten von Copytix gesprochen. Der vorgestellte Indikator verlangsamt sich, weil ich Copytix mehrmals aufrufen muss. Und alle Verzögerungen sind darauf zurückzuführen. Der Punkt ist folgender

Die Lösung wurde bereits vorgeschlagen.

Um nun Ticks zwischen den Daten herunterzuladen, müssen Sie Anfragen für eine beliebige Anzahl von Ticks stellen, beginnend mit dem Startdatum. Und dann schauen Sie jedes Mal, ob es das Enddatum erreicht hat. Und wenn man bedenkt, dass jede Copytix-Anfrage sehr teuer ist und man solche Bremsen bekommt.

Daten aus echter Öffnung, es werden nur frische Ticks geladen:

2016.10.20 18:47:06.499 GetTickHistory: Получено 4 тиков за 46 мкс (пинг = 62214 мкс)
2016.10.20 18:47:06.499 GetTickHistory: Получены все доступные тики. Время [0]: 2016.10.20 16:47
2016.10.20 18:47:06.499 GetTickHistory: Получено 3 тиков за 20 мкс (пинг = 62214 мкс)
2016.10.20 18:47:06.499 GetTickHistory: Получены все доступные тики. Время [0]: 2016.10.20 16:47
2016.10.20 18:47:06.499 GetTickHistory: Получено 3 тиков за 19 мкс (пинг = 62214 мкс)
2016.10.20 18:47:06.499 GetTickHistory: Получены все доступные тики. Время [0]: 2016.10.20 16:47
2016.10.20 18:47:06.540 GetTickHistory: Получено 8 тиков за 107 мкс (пинг = 62214 мкс)
2016.10.20 18:47:06.540 GetTickHistory: Получены все доступные тики. Время [0]: 2016.10.20 16:47
2016.10.20 18:47:06.540 GetTickHistory: Получено 5 тиков за 19 мкс (пинг = 62214 мкс)
2016.10.20 18:47:06.540 GetTickHistory: Получены все доступные тики. Время [0]: 2016.10.20 16:47
2016.10.20 18:47:06.540 GetTickHistory: Получено 5 тиков за 19 мкс (пинг = 62214 мкс)
2016.10.20 18:47:06.540 GetTickHistory: Получены все доступные тики. Время [0]: 2016.10.20 16:47
2016.10.20 18:47:06.540 GetTickHistory: Получено 5 тиков за 18 мкс (пинг = 62214 мкс)
2016.10.20 18:47:06.540 GetTickHistory: Получены все доступные тики. Время [0]: 2016.10.20 16:47
COPY_TICKS_TRADE!
 
CopyTicks() scheint eine asynchrone Funktion zu sein? Oft kommen Ticks für Kerzen an, die sich noch nicht geöffnet haben...
 
Alexey Kozitsyn:
CopyTicks() scheint eine asynchrone Funktion zu sein?
Ja.
 
Ich würde gerne von den Entwicklern etwas über CopyTicks() im Tester hören... Ich habe da einen schlimmen Verdacht. Ich bin wieder an einer Zusammenarbeit mit COPY_TICKS_TRADE interessiert!
 

Ich bin das Terminal leid. Das Drehbuch

void OnStart()
{
  MqlTick Ticks[];
  
  Print(CopyTicks(_Symbol, Ticks));
  Print(GetLastError());
}

hängt. Wenn Sie es manuell löschen, wird es abgemeldet.

2016.10.28 16:48:57.737 Test (GBPUSD,M1)        4401
2016.10.28 16:48:57.737 Test (GBPUSD,M1)        -1

Ändern von TF und Symbol - ähnlich. Nach dem Neustart funktioniert es.