intCopyTicks( 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.
intCopyTicks( 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...
intCopyTicks( 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?
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( conststring Symb, constint TimeFrame, constint iShift ) \ { \ T tValue[]; \ \ return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \ } \ \ T operator []( constint iPos ) const \ { \ return(CLASS##NAME::Get(_Symbol, _Period, iPos)); \ } \ }; \ \ CLASS##NAME NAME; \ \ T i##NAME( conststring Symb, constint TimeFrame, constint iShift ) \ { \ return(CLASS##NAME::Get(Symb, TimeFrame, iShift)); \ }
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.
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.
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.1815:12:32.949 Test14 (Si-12.16,M1) Time: 29089 msc for1503 records 2016.10.1815:12:32.822 Test14 (Si-12.16,M1) Time: 33207 msc for1501 records 2016.10.1815:12:32.639 Test14 (Si-12.16,M1) Time: 21389 msc for1500 records 2016.10.1815:12:31.959 Test14 (Si-12.16,M1) Time: 21926 msc for1500 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.1815:14:47.159 Test14 (GBPUSD,M1) Time: 31086 msc for1836 records 2016.10.1815:14:46.999 Test14 (GBPUSD,M1) Time: 30698 msc for1836 records 2016.10.1815:14:46.779 Test14 (GBPUSD,M1) Time: 46306 msc for1836 records 2016.10.1815:14:46.612 Test14 (GBPUSD,M1) Time: 30440 msc for1836 records 2016.10.1815:14:46.532 Test14 (GBPUSD,M1) Time: 36227 msc for1836 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.2018:47:06.499 GetTickHistory: Получено 4 тиков за 46 мкс (пинг = 62214 мкс) 2016.10.2018:47:06.499 GetTickHistory: Получены все доступные тики. Время [0]: 2016.10.2016:47 2016.10.2018:47:06.499 GetTickHistory: Получено 3 тиков за 20 мкс (пинг = 62214 мкс) 2016.10.2018:47:06.499 GetTickHistory: Получены все доступные тики. Время [0]: 2016.10.2016:47 2016.10.2018:47:06.499 GetTickHistory: Получено 3 тиков за 19 мкс (пинг = 62214 мкс) 2016.10.2018:47:06.499 GetTickHistory: Получены все доступные тики. Время [0]: 2016.10.2016:47 2016.10.2018:47:06.540 GetTickHistory: Получено 8 тиков за 107 мкс (пинг = 62214 мкс) 2016.10.2018:47:06.540 GetTickHistory: Получены все доступные тики. Время [0]: 2016.10.2016:47 2016.10.2018:47:06.540 GetTickHistory: Получено 5 тиков за 19 мкс (пинг = 62214 мкс) 2016.10.2018:47:06.540 GetTickHistory: Получены все доступные тики. Время [0]: 2016.10.2016:47 2016.10.2018:47:06.540 GetTickHistory: Получено 5 тиков за 19 мкс (пинг = 62214 мкс) 2016.10.2018:47:06.540 GetTickHistory: Получены все доступные тики. Время [0]: 2016.10.2016:47 2016.10.2018:47:06.540 GetTickHistory: Получено 5 тиков за 18 мкс (пинг = 62214 мкс) 2016.10.2018:47:06.540 GetTickHistory: Получены все доступные тики. Время [0]: 2016.10.2016:47
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!
Warum?
string symbol_name, // имя символа
MqlTick& ticks_array[], // массив для приёма тиков
uint flags=COPY_TICKS_ALL, // флаг, определяющий тип получаемых тиков
ulong from=0, // дата, начиная с которой запрашиваются тики
uint count=0 // количество тиков, которые необходимо получить
);
string symbol_name, // имя символа
MqlTick& ticks_array[], // массив для приёма тиков
uint flags=COPY_TICKS_ALL, // флаг, определяющий тип получаемых тиков
ulong from=0, // дата, начиная с которой запрашиваются тики
uint count=0 // количество тиков, которые необходимо получить
);
string symbol_name, // имя символа
MqlTick& ticks_array[], // массив для приёма тиков
uint flags=COPY_TICKS_ALL, // флаг, определяющий тип получаемых тиков
ulong from=0, // дата, начиная с которой запрашиваются тики
uint count=0 // количество тиков, которые необходимо получить
);
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?
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-функции: 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)
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.
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)
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.
Bei Ihrer Demo ist das in der Tat der Fall. Bei BCS ist das nicht der Fall.
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.
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: Получены все доступные тики. Время [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
CopyTicks() scheint eine asynchrone Funktion zu sein?
Ich bin das Terminal leid. Das Drehbuch
{
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) -1
Ändern von TF und Symbol - ähnlich. Nach dem Neustart funktioniert es.