Erreurs, bugs, questions - page 1742

 
Andrey Dik:

L'aide indique :

Dans les modes d'exécution "Par marché" et "Bourse" , la politique de remplissage "Retour" est toujours autorisée pour tous les types d'ordres. L'autorisation d'autres types est vérifiée à l'aide des propriétés SYMBOL_FILLING_FOK et SYMBOL_FILLING_IOC.

Mais pas toujours. Ainsi, sur les comptes Robo, "Return" ne fonctionne pas, ni sur les comptes Pro, ni sur les comptes ECN.

Je viens de tomber sur un robot

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Bugs, bugs, questions

fxsaber, 2016.10.20 08:24

SB sur tous les serveurs de trading
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TYPE_FILLING"                      |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING COrderInfo::TypeFilling(void) const
  {
   return((ENUM_ORDER_TYPE_FILLING)OrderGetInteger(ORDER_TYPE_FILLING));
  }

TOUJOURS dans le testeur retourneENUM_ORDER_TYPE_FILLING::ORDER_FILLING_RETURN.

C'est pourquoi, si vous définissez le remplissage dans OrderModify via COrderInfo::TypeFilling(), le même RoboForexEU-MetaTrader 5 affichera une erreur logique [Unsupported filling mode]. Cependant, cette erreur ne se produit pas dans MetaQuotes-Demo - le serveur du développeur est mal configuré ?



 
Andrey Dik:

L'aide indique :

Dans les modes d'exécution "Par marché" et "Bourse" , la politique de remplissage "Retour" est toujours autorisée pour tous les types d'ordres. L'autorisation d'autres types est vérifiée à l'aide des propriétés SYMBOL_FILLING_FOK et SYMBOL_FILLING_IOC.

Mais pas toujours. Par exemple, "Return" ne fonctionne pas sur les comptes Robo, ni sur les comptes Pro, ni sur les comptes ECN.

Je soupçonne que le paramètre "Retour" est par défaut sur tous les serveurs de commerce (au moins FxPro a répondu ainsi).

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Modes de remplissage des serveurs

Karputov Vladimir, 2016.10.14 19:18

Mode de remplissage "Retour" :

Retourner à

Pas d'identification

Ce mode est utilisé pour les ordres au marché (Achat et Vente), les ordres à cours limité et les ordres stop-limite et uniquement dans les modes "Exécution au marché" et "Exécution en bourse". En cas d'exécution partielle, un ordre au marché ou à cours limité avec un volume résiduel n'est pas supprimé, mais reste en vigueur.

Voici la réponse de la société de courtage concernantle mode "retour".

Notre expert MT5 a confirmé avec Metaquotes que le retour est utilisé par défaut, et qu'il est appliqué lorsque vous ne choisissez rien sur le remplissage.

)

En d'autres termes, c'est une sorte de talon.
 
Karputov Vladimir:

On soupçonne que le paramètre de remplissage "Retour" est le paramètre par défaut de tous les serveurs de négociation (du moins, FxPro a répondu comme tel).

En d'autres termes, c'est une sorte de talon.

Dans certaines entreprises (en particulier MT5 a été lancé récemment), il est nécessaire de spécifier clairement le type de remplissage - si vous ne le spécifiez pas, il y aura une erreur.

Bien que, dans Robo, le serveur renvoie vrai pour la vérification "Retour", mais en fait, ce type de remplissage ne fonctionne pas. En bref, c'est un désordre total avec ces remplissages.

 
Les commentaires non pertinents pour ce sujet ont été déplacés vers "CHART_SHOW_OHLC for OBJ_CHART".
 
Il est évident que je suis lent.
class A
{
public:
  virtual int f()
  {
    Print(__FUNCSIG__);
    
    return(0);
  }
};

class B : public A
{
public:
  virtual int f()
  {
    Print(__FUNCSIG__);
    
    return(0);
  }
};

void OnStart()
{
//  A* b = new B;
  B* b = new B;
  
  ((A*)b).f();

  delete b;
}
Ai-je bien compris que si le virtuel du descendant est surchargé, le virtuel de base ne peut jamais être atteint ? C'est-à-dire qu'il n'y a aucun moyen d'appeler A::f depuis b.
 
fxsaber:
Est-ce que je comprends bien que si le virtuel en descendant est surchargé, le virtuel de base ne peut jamais être atteint ? C'est-à-dire qu'il n'y a aucun moyen d'appeler A::f depuis b.

Presque. En C++, l'entrée suivante est autorisée :

B* b = new B;
b.A::f();

Mais vous ne pouvez pas faire ça ici. Donc, uniquement et exclusivement par béquille :

class B : public A
{
public:
  virtual int f()
  {
    Print(__FUNCSIG__);
    
    return(0);
  }
  
  int f1()
  {
    return A::f();
  }
};
 
Комбинатор:

Presque. En C++, l'entrée suivante est autorisée :

B* b = new B;
b.A::f();

Alors je ne comprends pas pourquoi ça marche en C++. Après tout, un virtual surchargé dans la table des méthodes virtuelles devrait être complètement surchargé. Et il ne devrait y avoir aucune trace de la base.

Mais il est impossible de le faire ici. C'est pourquoi elle n'est que par béquille :

class B : public A
{
public:
  virtual int f()
  {
    Print(__FUNCSIG__);
    
    return(0);
  }
  
  int f1()
  {
    return A::f();
  }
};
Alors A* b = new B ; ne fonctionnera pas.
 
fxsaber:

Après tout, le virtuel surchargé dans le tableau des méthodes virtuelles devrait être complètement surchargé. Et il ne devrait y avoir aucune trace de la méthode de base.

Si le type est explicitement spécifié, la méthode est appelée directement, sans utiliser la table des fonctions virtuelles.

De cette façon, même une fonction purement virtuelle peut être appelée si elle possède un corps.

fxsaber:
Alors A* b = new B ; ne fonctionnera pas.

Dans ce cas, vous avez besoin d'une autre béquille : déplacez les internes de la fonction dans la classe de base vers une méthode non virtuelle et appelez-la à l'intérieur de la méthode virtuelle. Nous pourrions alors appeler explicitement les méthodes non virtuelles de la classe de base et de l'héritier.

 
Комбинатор:

Si le type est explicitement spécifié, la méthode est appelée directement, sans utiliser la table des fonctions virtuelles.

Même une fonction purement virtuelle peut être appelée de cette manière si elle possède un corps.

Dans ce cas, nous avons besoin d'une autre béquille, qui consisterait à déplacer les internes de la fonction vers une méthode non virtuelle de la classe de base et à l'appeler à l'intérieur de la méthode virtuelle. Ensuite, vous pouvez appeler explicitement la méthode non virtuelle à partir de la base et du descendant.

Je l'ai, merci !
 
Comment le débogueur peut-il voir quelle valeur la fonction a renvoyé via return ? J'ai mis un point d'arrêt sur le retour. Quand j'y arrive, j'appuie sur F10. Comment puis-je voir ce qui est sorti du retour ?