Erreurs, bugs, questions - page 1723

 

Comment supprimer un projet avec tous ses fichiers ?

J'ai téléchargé un projet avec une douzaine de fichiers depuis le terminal kodobase, mais comment le supprimer ?

 

Erreur de compilation

class A {};
template<typename T> //---------------------------------------------------//(1)
T *f( T* t ) { return t; }              //      A *f(       A* )          //(2)
                                        //const A *f( const A* )          //(3)
template<typename T> //---------------------------------------------------//(4)
 T *f( T* t, const T* ) { return t; }    //      A *f(       A*, const A* )//(5)
void OnStart()
{
    const A *a;
    const A *a1 = f( a );    // ошибка не обоснована: T -> const A, и в отсутствии (6) применимо (3)
          A *a2 = f( a );    //ошибка    обоснована, но по другой причине: A* = const A*
                  f( a, a ); //ошибка    обоснована, но по другой причине: T -> A, и отсутствует f(const A*,const A*)
}

(*) En général, dans le schéma (1), on peut substituer T à la fois à A->(2) et à A->(3). Contrairement au modèle (4), par exemple, où seul A->(5) peut être substitué à T.

Maintenant, seule la substitution A->(2) fonctionne, donc pour une utilisation complète, nous devons faire deux modèles au lieu d'un :

template<typename T> //---------------------------------------------------//(1)
      T *f(       T* t ) { return t; }
template<typename T> //---------------------------------------------------//(6)
const T *f( const T* t ) { return t; }

Note : La définition explicite (6) est plus prioritaire que le cas général (*).

Total : En l'absence du modèle (6), le modèle (1) avec signature (3) devait s'appliquer.

 
A100:
Je vous demande vraiment de poster quelque chose sur la kodobase ! A des fins éducatives.
 
1) Le MT5 met-il à jour les positions ouvertes et l'historique des transactions après un appel d'ordre (OrderSend) avec un certain retard ? Si oui, quel est le délai d'attente recommandé ?

2) Même question pour MT4, à titre de comparaison.
 

RickD:
1) Обновление открытых позиций и торговой истории в MT5 после вызова OrderSend происходит с некоторой задержкой? Если да, какой рекомендуется timeout для ожидания?

MT5-OrderSend n'est PAS entièrement synchronisé - il n'y a pas de synchronisation avec l'environnement de trading. Cela signifie que les relevés historiques ne correspondent pas à la situation réelle.

Aucun temps mort n'est envisageable. Il n'existe pas de solution fiable à ce problème, car vous devez traiter les questions de synchronisation au niveau du terminal, et non au niveau du serveur.

En fait, les utilisateurs de MT5 sont confrontés à ce que les développeurs de ponts MT4 rencontrent.

Si un OrderSend est envoyé, vous devez vous RAPPELER (c'est là que se trouve la vulnérabilité potentielle) qu'il est fait. Ensuite, ignorez l'historique actuel (environnement de trading) jusqu'à ce que le message correspondant arrive dans OnTrade. Une fois qu'il est arrivé, N'OUBLIEZ PAS d'oublier.

Lorsqu'il n'y a pas de REMEMBER, vous pouvez vous fier à l'historique comme dans MT4.

2) Même question pour MT4, à titre de comparaison.
MT4-OrderSend est TOTALEMENT synchronisé.
 

Версия и битность терминала

Version : 5.00, build 1445 (07.10.2016), 32 bits.

Description du problème

L'indicateur ne parvient pas à copier les données des indicateurs standards (intégrés à MT5) à partir d'un autre cadre temporel (différent du cadre temporel actuel du graphique où l'indicateur est installé). En même temps, le "handle" de l'indicateur standard peut être obtenu, mais la fonction CopyBuffer() renvoie toujours -1. Dans le mode de visualisation du testeur, le problème ne se produit pas, mais dans le terminal sur le graphique (auquel l'indicateur est attaché), le problème est toujours présent.

Séquence d'actions

décrite ci-dessus.

Résultat obtenu

Décrit ci-dessus.

Résultat attendu

Copie correcte des données des indicateurs standard (et de préférence personnalisés) d'autres périodes dans l'indicateur.

Informations complémentaires

Dans les "builds" antérieures, ce problème ne se produisait pas.

Quelqu'un a-t-il rencontré un tel problème ? Est-ce un "bug" du terminal ou le mien ?

 

fxsaber:

...Si un OrderSend est envoyé, vous devez vous RAPPELER (c'est là que réside la vulnérabilité potentielle) qu'il est fait. Ensuite, il faut ignorer l'historique actuel (environnement de négociation) jusqu'à ce que le message OnTrade approprié arrive. Dès qu'il arrive, le REQUIS doit être INTERDIT...

Soit ma mémoire est défaillante, soit la documentation de la partie OnTrade a été mise à jour :

...Si l'appel de la fonction OrderSend() est réussi et renvoie true, cela signifie que le serveur de trading a mis en file d'attente l'ordre à exécuter et lui a attribué un numéro de ticket. Dès que le serveur traite cet ordre, l'événement Trade est généré. Et si l'utilisateur se souvient de la valeur du ticket, il peut découvrir ce qu'il est advenu de la commande en utilisant ce ticket lors du traitement de l'événement OnTrade()...

En d'autres termes, le déclenchement de OnTrade à la i-ième étape est une garantie que l'ordre est accepté sur le serveur.

 
Dennis Kirichenko:

Soit ma mémoire est floue, soit la partie OnTrade de la documentation a été mise à jour :

En d'autres termes, le déclenchement de OnTrade à l'étape i est une garantie que l'ordre est accepté sur le serveur.

Se souvenir du ticket (et non du fait qu'il sera retourné par OrderSend) ou du fait même qu'un OrderSend avec retour vrai a été effectué est RÉEL.
 
fxsaber:
Il est IMPÉRATIF de se souvenir du ticket (et non pas du fait qu'il sera renvoyé par OrderSend) ou du fait que OrderSend avec true-return a été effectué.

Tout va bien ici, le placement des ordres doit être contrôlé par OnTradeTransaction, d'ailleurs, si vous vous connectez à l'échange directement par Plaza2, la situation est la même - vous devez contrôler l'arrivée des messages concernant le placement des ordres. Dans MT4, cette fonction est synchrone, mais la même option est disponible dans MT5, seulement dans ce cas, la logique s'arrêtera jusqu'à ce que la fonction ne reçoive aucune réponse.

Si vous avez besoin, je peux vous envoyer la classe de contrôle, bien qu'elle soit écrite pour le placement de marché, mais bientôt je la finaliserai pour les limiteurs.

 
MK, pourquoi n'ajoutez-vous pas des fonctions normales pour la recherche binaire à la bibliothèque standard? ArrayBsearch n'est applicable que dans les cas où les types sont simples et où vous n'avez pas besoin d'un comparateur personnalisé. Les modèles sont là, faites une surcharge sur c++::std::lower/upper_bound. Jusqu'à présent, j'ai dû l'écrire moi-même, ce qui n'est pas normal (presque entièrement copié de cppreference).
template<typename A, typename T, typename Compare>
uint lower_bound(const A &ar[], const T &value, Compare &comp){
   long count = ArraySize(ar);
   uint first = 0;
  
   while(count > 0){
      uint it = first;
      uint step = count / 2;
      it += step;
      if(comp.comp(ar[it], value)){
         first = ++it;
         count -= step + 1;
      }
      else
         count = step;
   }
   return first;
}

void OnStart(){
   struct M_point{
      double price;
      datetime time;
   };
   M_point ar[5];
   ar[0].time = 2; ar[1].time = 4; ar[2].time = 6;
   ar[3].time = 8; ar[4].time = 10;
   struct Comp{
      bool comp(const M_point &p, datetime value) {return p.time < value;}
   }cmp;
   datetime value = 6;
   lower_bound(ar, value, cmp);
   return;
}

Au cours de ce processus, quelques questions ont été soulevées :
1. Pourquoi est-il impossible d'écrire operator() dans Comp (c'est interdit pour une raison quelconque) ?
bool operator()(const M_point &p, datetime value) {return p.time < value;}
2. Pourquoi ne pouvons-nous pas passer prvalue à une fonction qui accepte une référence constante ?
lower_bound(ar, 6, cmp) ); // ошибка
ZS : et aussi très ennuyeux cet avertissement : "struct has no members, size assigned to 1 byte ".