intCopyTicks( string symbol_name, // имя символа MqlTick& ticks_array[], // массив для приёма тиков uint flags=COPY_TICKS_ALL, // флаг, определяющий тип получаемых тиков ulong from=0, // дата, начиная с которой запрашиваются тики uint count=0// количество тиков, которые необходимо получить );
Surligné en gras. Le tableau à la fin est un rejet des valeurs par défaut.
intCopyTicks( string symbol_name, // имя символа MqlTick& ticks_array[], // массив для приёма тиков uint flags=COPY_TICKS_ALL, // флаг, определяющий тип получаемых тиков ulong from=0, // дата, начиная с которой запрашиваются тики uint count=0// количество тиков, которые необходимо получить );
Surligné en gras.
Non souligné, mais probablement répondu ci-dessus...
intCopyTicks( string symbol_name, // имя символа MqlTick& ticks_array[], // массив для приёма тиков uint flags=COPY_TICKS_ALL, // флаг, определяющий тип получаемых тиков ulong from=0, // дата, начиная с которой запрашиваются тики uint count=0// количество тиков, которые необходимо получить );
Je l'ai mis en gras. Tableau à la fin - éviter les valeurs par défaut.
Oui, la taille des ticks dans le cache peut être allouée explicitement dans la documentation. Si vous voulez obtenir le cache entier - regardez la documentation et demandez le nombre requis avec la fonction, avec des paramètres comme ici :
intCopyBuffer( intindicator_handle,// manche de l'indicateur intbuffer_num,// numéro de tampon de l'indicateur intstart_pos,//où commencer intcount,// combien nous copions doublebuffer[]// tableau où les données seront copiées ) ;
Tout a déjà été inventé, pourquoi inventer quelque chose de nouveau ?
Je pense qu'il est bien plus important d'effectuer un téléchargement à jour que d'essayer de conserver les paramètres par défaut.
Donc, de date en date, ce sera. Les CopyTicks qui tentent de correspondre en syntaxe aux fonctions de copie uniquement en raison de la présence de Copy dans le nom ne sont pas pratiques. C'est pratique et justifié lorsque vous pouvez faire des trucs de préprocesseur comme ceci
// Позволяет, как в 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)); \ }
Donc, de date en date, ce sera. Les CopyTicks qui essaient de faire correspondre la syntaxe des fonctions de copie juste à cause de la présence de Copy dans le nom ne sont pas pratiques. C'est pratique et justifié quand on peut faire des trucs de préprocesseur comme ça.
Et pour CopyTicks ce genre de chose ne peut pas être fait, car il y a deux fils physiques différents (TRADE et INFO) et un synthétique (ALL) - drapeaux.
Avant que vous n'apparaissiez sur le forum, je n'avais jamais rencontré cette façon d'écrire, pour laquelle je vous remercie bien sûr, mais je ne suis pas sûr que beaucoup de programmeurs la trouveraient utile.
Sur votre démo, c'est en effet le cas. Sur BCS, ce n'est pas le cas.
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
Et sur Alpari, ce n'est pas bon du tout.
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
J'ai parlé plus haut des inconvénients de Copytix. L'indicateur présenté est ralenti par le fait que je dois appeler copytix plusieurs fois. Et tous les décalages sont dus à ça. Le point est le suivant
La solution a été proposée.
Maintenant, pour télécharger des ticks entre deux dates, vous devez faire des demandes pour N'IMPORTE QUEL nombre de ticks, à partir de la date de départ. Et puis regarder à chaque fois, et si elle a atteint la date limite. Et étant donné que chaque demande de copytix est très coûteuse, et que vous obtenez de tels freins.
Données provenant d'une ouverture réelle, seuls les ticks frais sont chargés :
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
J'aimerais avoir l'avis des développeurs sur CopyTicks() dans le testeur... J'ai de mauvais soupçons à ce sujet. Je suis de nouveau intéressé à travailler avec COPY_TICKS_TRADE !
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
Pourquoi ?
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 // количество тиков, которые необходимо получить
);
Oui, la taille des ticks dans le cache peut être allouée explicitement dans la documentation. Si vous voulez obtenir le cache entier - regardez la documentation et demandez le nombre requis avec la fonction, avec des paramètres comme ici :
intCopyBuffer(
intindicator_handle,// manche de l'indicateur
intbuffer_num,// numéro de tampon de l'indicateur
intstart_pos,//où commencer
intcount,// combien nous copions
doublebuffer[]// tableau où les données seront copiées
) ;
Tout a déjà été inventé, pourquoi inventer quelque chose de nouveau ?
Je pense qu'il est bien plus important d'effectuer un téléchargement à jour que d'essayer de conserver les paramètres par défaut.
Donc, de date en date, ce sera. Les CopyTicks qui tentent de correspondre en syntaxe aux fonctions de copie uniquement en raison de la présence de Copy dans le nom ne sont pas pratiques. C'est pratique et justifié lorsque vous pouvez faire des trucs de préprocesseur comme ceci
// А так же задает привычные 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)
Donc, de date en date, ce sera. Les CopyTicks qui essaient de faire correspondre la syntaxe des fonctions de copie juste à cause de la présence de Copy dans le nom ne sont pas pratiques. C'est pratique et justifié quand on peut faire des trucs de préprocesseur comme ça.
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)
Avant que vous n'apparaissiez sur le forum, je n'avais jamais rencontré cette façon d'écrire, pour laquelle je vous remercie bien sûr, mais je ne suis pas sûr que beaucoup de programmeurs la trouveraient utile.
Sur votre démo, c'est en effet le cas. Sur BCS, ce n'est pas le cas.
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
Et sur Alpari, ce n'est pas bon du tout.
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
J'ai parlé plus haut des inconvénients de Copytix. L'indicateur présenté est ralenti par le fait que je dois appeler copytix plusieurs fois. Et tous les décalages sont dus à ça. Le point est le suivant
La solution a été proposée.
Maintenant, pour télécharger des ticks entre deux dates, vous devez faire des demandes pour N'IMPORTE QUEL nombre de ticks, à partir de la date de départ. Et puis regarder à chaque fois, et si elle a atteint la date limite. Et étant donné que chaque demande de copytix est très coûteuse, et que vous obtenez de tels freins.
Données provenant d'une ouverture réelle, seuls les ticks frais sont chargés :
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() semble être une fonction asynchrone ?
Fatigué du terminal. Le scénario
{
MqlTick Ticks[];
Print(CopyTicks(_Symbol, Ticks));
Print(GetLastError());
}
les hangars. En le supprimant manuellement, vous le déconnecterez.
2016.10.28 16:48:57.737 Test (GBPUSD,M1) -1
Changement de TF et de symbole - similaire. Après le redémarrage, cela fonctionne.