1 avril 2016
1 avril 2016
Système de compensation
Avec ce système, vous pouvez n'avoir qu'une seule position commune pour un symbole à la fois :
Ce qui a causé la transaction opposée n'importe pas - un ordre au marché exécuté ou un ordre en attente déclenché.
L'exemple ci-dessous montre l'exécution de deux transactions Buy sur l'EURUSD de 0.5 lots chacunes :
L'exécution des deux transactions a résulté en une seule position d'1 lot.
Système de couverture
Avec ce système, vous pouvez avoir plusieurs positions ouvertes d'un seul et même symbole, incluant des positions opposées.
Si vous avez une position ouverte pour un symbole et que vous exécutez une nouvelle transaction (ou qu'un ordre en attente est déclenché), une nouvelle position est ouverte en supplément. Votre position actuelle ne change pas.
L'exemple ci-dessous montre l'exécution de deux transactions Buy sur l'EURUSD de 0.5 lots chacunes :
L'exécution de ces transactions a résulté dans l'ouverture de deux positions séparées.
Nouveau type d'opération - Close By
Un nouveau type d'opération de trading a été ajouté pour les comptes de couverture - fermer une position par une position opposée. Cette opération permet de fermer deux positions dans des directions opposées d'un même symbole. Si les positions opposées ont des nombres de lots différents, un seul des deux ordres reste ouvert. Son volume sera égal à la différence des lots des positions fermées, tandis que la direction de la position et le prix d'ouverture correspondront (en volume) à la plus grande des positions fermées.
Comparée à une fermeture simple des deux positions, la fermeture par une position opposée permet aux traders d'économiser un spread :
Dans ce dernier cas, un ordre "close by" est placé. Les tickets des positions fermées sont spécifiés dans leurs commentaires. Une paire de positions opposées est fermée par deux transactions "out by". Le profit/perte résultant de la fermeture des deux positions n'est spécifié que dans une seule transaction.
class CAnimal { public: CAnimal(); // constructeur virtual void Sound() = 0; // fonction virtuelle pure private: double m_legs_count; // nombre de pattes de l'animal };Ici Sound() est une fonction virtuelle pure car elle est déclarée avec le spécificateur de fonction virtuelle pure (=0).
class CAnimal { public: virtual void Sound()=NULL; // méthode pure, doit être surchargée dans la classe dérivée, CAnimal est maintenant abstraite et ne peut pas être créée }; //--- descendant de la classe abstraite class CCat : public CAnimal { public: virtual void Sound() { Print("Myau"); } // la méthode pure est surchargée, CCat n'est pas abstraite et peut être créée }; //--- exemples de mauvaises utilisations new CAnimal; // Erreur de 'CAnimal' - le compilateur retourne l'erreur "ne peut pas instantier une classe abstraite" CAnimal some_animal; // Erreur de 'CAnimal' - le compilateur retourne l'erreur "ne peut pas instancier une classe abstraite" //--- exemples d'utilisations correctes new CCat; // aucune erreur - la classe CCat n'est pas abstraite CCat cat; // aucune erreur - la classe CCat n'est pas abstraiteRestrictions concernant les classes abstraites
//+------------------------------------------------------------------+ //| Une classe de base abstraite | //+------------------------------------------------------------------+ class CAnimal { public: //--- une fonction virtuelle pure virtual void Sound(void)=NULL; //--- fonction void CallSound(void) { Sound(); } //--- constructeur CAnimal() { //--- un appel explicite à la méthode virtuelle Sound(); //--- un appel implicite (en utilisant une troisième fonction) CallSound(); //--- un constructeur et/ou un destructeur appelle toujours ses propres fonctions, //--- même si elles sont virtuelles et surchargées par une fonction appellée dans une classe dérivée //--- si la fonction appelée est purement virtuelle //--- l'appel génère une erreur critique d'exécution "appel à une fonction virtuelle pure" } };Cependant, les constructeurs et les destructeurs des classes abstraites peuvent appeler d'autres fonctions membres.
typedef int (*TFunc)(int,int);TFunc est maintenant un type, et il est possible de déclarer une variable pointant vers la fonction :
TFunc func_ptr;La variable func_ptr peut stocker l'adresse de la fonction pour la déclarer par la suite :
int sub(int x,int y) { return(x-y); } int add(int x,int y) { return(x+y); } int neg(int x) { return(~x); } func_ptr=sub; Print(func_ptr(10,5)); func_ptr=add; Print(func_ptr(10,5)); func_ptr=neg; // erreur : neg n'est pas du type int (int,int) Print(func_ptr(10)); // erreur : il devrait y avoir 2 paramètresLes pointeurs de fonctions peuvent être stockés et passés comme paramètres. Vous ne pouvez pas avoir un pointeur vers une méthode de classe non statique.
ulong PositionGetTicket( int index // index dans la liste des positions );
bool PositionSelectByTicket(
ulong ticket // ticket de la position
);