Discussion de l'article "L'utilisation des bibliothèques MQL5 Standard de Cours de Trade dans la rédaction d'un Expert Advisor"

 

Un nouvel article L'utilisation des bibliothèques MQL5 Standard de Cours de Trade dans la rédaction d'un Expert Advisor a été publié :

Cet article explique comment utiliser les principales fonctionnalités de la bibliothèque standard MQL5 de classes de trade dans la rédaction des conseillers experts qui implémente la fermeture de la position et la modification , la passation et la suppression de commande en attente et la vérification de la marge avant de passer un trade.. Nous avons également démontré comment les classes de trade peuvent être utilisés pour obtenir les détails des commandes et des deals.

Jusqu'à présent, nous avons examiné comment nous pouvons utiliser les bibliothèques de classe Trade pour écrire un Expert Advisor. La chose suivante est de tester notre Expert Advisor avec le testeur de stratégie et de constater ses performances.

Compilez le code EA, puis chargez-le dans le Testeur de Stratégie

compilez le rapport pour EA

         Figure 3. Rapport de compilation d'un Expert Advisor

Sur le graphique quotidien GBPUSD en utilisant les paramètres par défaut : Prise de Bénéfice- 270, Arrêt de Perte - 100 et Point de pistes (TP/SL) - 32, on a les résultats suivants :

 

Figure 4. Rapport de test Expert Advisor - Graphique quotidien GBPUSD

Auteur : Samuel Olowoyo

 

Article très utile pour moi. Tout est beaucoup plus facile si vous utilisez des bibliothèques !

Demande aux développeurs : écrivez une classe pour travailler avec High[i] , Low[i]. Open[i], Close[i]. Je pense que cette classe sera utile à tout le monde ! J'ai résolu ce problème moi-même, mais je ne suis pas sûr qu'il soit correct, car les tests prennent beaucoup de temps....

 
 
#include <Indicators\Series.mqh>

double High[];
 CiHigh z;

pourquoi ce code donne une erreur

'1.mq5' 1.mq5 1 1

'Series.mqh' Series.mqh 1 1

'ArrayObj.mqh' ArrayObj.mqh 1 1

'Array.mqh' Array.mqh 1 1

'Object.mqh' Object.mqh 1 1

'StdLibErr.mqh' StdLibErr.mqh 1 1

'ArrayDouble.mqh' ArrayDouble.mqh 1 1

'CiHigh' - déclaration sans type 1.mq5 12 2

1 erreur(s), 0 avertissement(s) 2 1

dans tous les exemples, il n'est pas nécessaire de déclarer le type...

s'il n'est pas difficile d'écrire comment obtenir

Print High[2], par exemple.

 
dimeon:

pourquoi ce code donne une erreur


il n'est pas nécessaire de déclarer le type dans tous les exemples...

si ce n'est pas difficile, veuillez écrire comment obtenir

Print High[2], par exemple.

il y a une erreur dans la documentation. Cette classe se trouve dans le fichier TimeSeries.mqh.

Exemple d'utilisation (le script imprime les trois derniers sommets du graphique actuel) :

#include <Indicators\TimeSeries.mqh>
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double High[];
   CiHigh z;
   int count=3;
   if(z.Create(_Symbol,_Period)==true)
     {
      if(z.GetData(0,count,High)==count)
        {
         for(int i=0; i<count; i++) Print(i,"=",High[i]);
        }
      else
         Print("Échec de la récupération",count,"Données de séries temporelles".);
     }
   else Print("Erreur lors de la création d'une série temporelle".);
  }
//+------------------------------------------------------------------+
 
Quantum:

il y a une erreur dans la documentation. Cette classe se trouve dans le fichier TimeSeries.mqh.

Exemple d'utilisation (le script affiche les trois derniers sommets du graphique actuel) :

Merci beaucoup ! Je me suis creusé la tête !
 

Je comprends que chacun programme pour lui-même et pour ses besoins, mais je n'aime pas fondamentalement le groupe des classes de séries temporelles, parce qu'elles consistent toutes en une méthode et une partie descriptive plus qu'une fonctionnalité, et généralement il est nécessaire d'avoir toutes les séries temporelles pour un outil particulier, j'ai fait une classe dans laquelle il y a toutes les séries temporelles pour l'outil nécessaire, dans les méthodes est fait par la pagination de l'histoire, à peu près comme ceci :

struct str_bars{
   datetime    time[];     // Tableau de séries temporelles contenant l'heure d'ouverture de chaque barre du graphique actuel
   double      open[];     // Tableau de séries temporelles contenant les prix d'ouverture de chaque barre du graphique actuel.
   double      close[];    // Tableau de séries temporelles contenant les prix de clôture de chaque barre du graphique actuel.
   double      high[];     // Tableau de séries temporelles contenant les prix maximums de chaque barre du graphique actuel.
   double      low[];      // Un tableau de séries temporelles contenant les prix minimums de chaque barre du graphique actuel.
};
struct str_info{
   double   point;         // Taille du point de l'instrument actuel dans la devise de cotation
   int      spread;        // Diffusion actuelle
};
//____________________________________________________________________
class currency {
   public:
//---- данные      
      MqlTick TICK;        // données relatives au tic-tac
      str_bars  BAR;       // données de séries temporelles
      str_info INFO;       // informations sur l'outil
      int error;
//---- методы      
      int create(string sym,ENUM_TIMEFRAMES period, int numbars);
      int refresh(void);
   private:
      string            symbol;
      ENUM_TIMEFRAMES   per;
      int               num;
      datetime          lastbar_time;
      int               tmpint1,tmpint2;
      int ch_load(void);
};
//____________________________________________________________________

Je travaille avec ma classe uniquement dans la partie des données déjà préparées, et bien sûr la classe elle-même reçoit des données en appelant la méthode refresh().

 
Article utile !
 

il y a une inexactitude dans l'article

double lot_price = myaccount.MarginCheck(_Symbol,otype,Lot); // prix du lot/nombre de marges requises

devrait être

   double lot_price=myaccount.MarginCheck(_Symbol,otype,Lot,price);  //--- prix du lot/nombre de marges requises
[Supprimé]  

Excellent article. Merci beaucoup à l'auteur. J'aimerais également écrire une vérification du niveau du Stop avant de passer un ordre, et une vérification de la valeur du spread. En effet, si le spread est flottant, vous ne pouvez pas entrer sur le marché lorsque sa valeur est élevée, car il n'est pas rentable. Cela aidera l'Expert Advisor à ne pas négocier pendant les nouvelles. J'aimerais également vérifier la déviation - le raisonnement est similaire. J'ai également une question concernant la bibliothèque : qu'est-ce qu'une fonction (quel type de processus désigne-t-elle et décrit-elle) ?

Niveau de gel

Obtient la distance de gel des opérations commerciales en points.

int FreezeLevel() const

en langage simple - veuillez l'expliquer si vous le savez.

Et une dernière question. Nous pouvons connaître les limites, par exemple, Stop_Level au moment présent (disons 10 points). Nous plaçons un ordre en attente avec SL=10 points. Après, par exemple, une heure, le prix atteint le prix spécifié dans l'ordre, mais le Stop_Level à ce moment est égal, par exemple, à 15 pips. Que se passera-t-il - l'ordre en attente fonctionnera-t-il ou sera-t-il rejeté ? En outre, lorsque le prix atteint le prix spécifié dans l'ordre, mais que le spread a changé, cela signifie-t-il que l'entrée ou la sortie est possible à un prix inférieur au prix attendu au moment de l'ouverture de l'ordre, ou que l'ordre ne fonctionnera pas du tout ?

 

Pourquoi la candidature n'est-elle pas imprimée ?

Voici le journal de travail


2011.01.31 20:20:18 00(EURUSD,M1) EURUSD 0

Voici le code

#include <Trade\SymbolInfo.mqh>  //--- Classe CSymbolInfo
CSymbolInfo    my_symbol;        //--- Objet de la classe CSymbolInfo
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
int OnInit()
  {   return(0);  }
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  }
//+------------------------------------------------------------------+
//| Fonction de tic-tac expert|
//+------------------------------------------------------------------+
void OnTick()
  {
   my_symbol.Name(_Symbol);
   my_symbol.Refresh();
   Print(_Symbol," ",my_symbol.Bid());
  }
//+------------------------------------------------------------------+