Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 854

 
yiduwi:

Aide, comment puis-je trouver la première coordonnée temporelle de la ligne de tendance ?

long  ObjectGetInteger( 
   long     chart_id,         // идентификатор графика 
   string   object_name,      // имя объекта 
   int      prop_id,          // идентификатор свойства 
   int      prop_modifier=0   // модификатор свойства, если требуется 
   );
 

Pourquoi ne puis-je pas faire ce qui suit ? Je déclare une variable et un tableau globalement et je veux assigner la valeur de la variable au tableau immédiatement.

int yo=6;
int masss[4]={0,0,yo,0};

Et le même problème avec les fonctions, si vous assignez une variable à un argument, cela échoue...

void Fulr(int ty=yo){}
 
Seric29:

Pourquoi ne puis-je pas faire ce qui suit ? Je déclare une variable et un tableau globalement et je veux assigner la valeur de la variable au tableau immédiatement.

Et le même problème avec les fonctions si vous assignez une variable à un argument, il échoue

Документация по MQL5: Основы языка
Документация по MQL5: Основы языка
  • www.mql5.com
Язык MetaQuotes Language 5 (MQL5) является объектно-ориентированным языком программирования высокого уровня и предназначен для написания автоматических торговых стратегий, пользовательских технических индикаторов для анализа разнообразных финансовых рынков. Он позволяет не только писать разнообразные экспертные системы, предназначенные для...
 
Alekseu Fedotov:

Merci.

 
Artyom Trishkin:

Apparemment, c'est impossible à dire normalement. En C++ vous pouvez le faire, je pense que c'est parce que mql4 travaille à travers un descripteur, c'est-à-dire qu'il n'a pas d'accès direct à la mémoire, parce que chaque valeur a une adresse et si vous accédez à cette adresse vous pouvez trouver ce qu'il y a, cela rend mql4 excessivement statique et limite beaucoup de possibilités, en particulier le travail avec les tableaux.

 

Est-il possible de créer deux minuteries dans l'EA ? Pour une raison quelconque, je pensais que OnTimer() était appelé dans un thread séparé. Mais j'ai essayé d'ajouter une boucle infinie dans OnInit() et de régler le timer avant, seule la boucle a fonctionné, OnTimer() n'a pas été appelé.

J'ai besoin de deux actions indépendantes qui s'exécutent constamment sur une minuterie. Chacun avec son propre intervalle. Comment cela peut-il être mis en œuvre, le savez-vous ?

 
leonerd:

Est-il possible de créer deux minuteries dans l'EA ? Pour une raison quelconque, je pensais que OnTimer() était appelé dans un thread séparé. Mais j'ai essayé d'ajouter une boucle infinie dans OnInit() et de régler le timer avant, seule la boucle a fonctionné, OnTimer() n'a pas été appelé.

J'ai besoin de deux actions indépendantes qui s'exécutent constamment sur une minuterie. Chacun avec son propre intervalle. Comment cela peut-il être mis en œuvre, le savez-vous ?

Par exemple : compter jusqu'à cent et exécuter le premier code, compter jusqu'à 150 et exécuter le second code. Mais dans le bon sens du terme, vous devriez vous faire une classe de multicartes.
 
Artyom Trishkin:

Dans ce fil de discussion, je veux commencer à aider ceux qui veulent vraiment comprendre et apprendre la programmation dans le nouveau MQL4 et qui veulent passer facilement à MQL5 - les langages sont très similaires.

Ce blog sera un bon endroit pour discuter des tâches, des algorithmes de leur solution et de toute autre question concernant la programmation MT d'une manière ou d'une autre.

J'espère que d'autres membres expérimentés de notre forum se joindront à la discussion et que la branche sera intéressante pour tous.

Bon après-midi. Je suis en train d'écrire un conseiller expert d'essai pour l'auto-apprentissage et l'expérience pratique. Maintenant, il peut recevoir un signal de l'indicateur et a la fonction pour ouvrir des positions BUY et SELL ( Open_BUY_SELL() ). J'ai réalisé cette fonction à partir de quelques scripts publiés dans CodeBase.

QUESTION - Puis-je demander à une personne bien informée dans ce fil de vérifier que ce code n'est pas encombrant ? ? ??

J'ai des doutes et des craintes particulières dans ces endroits :

    m_trade         = new CTrade();
    m_symbol        = new CSymbolInfo();   
    m_position_info = new CPositionInfo();   
    m_account       = new CAccountInfo();
    
    m_symbol.Name(Symbol());
    m_symbol.RefreshRates();

Est-il approprié d'écrire ceci à l'intérieur d'une fonction ? Cela vaut-il la peine de le déplacer vers OnInit() ? J'ai réalisé la fonction à partir de deux scripts, fichiers épinglés au post

CEngine        engine;
CTrade         trade;
CPositionInfo  apos;
CSymbolInfo    asymbol;

CTrade         *m_trade;
CSymbolInfo    *m_symbol;
CPositionInfo  *m_position_info; 
CAccountInfo   *m_account;

Cet endroit est également source de confusion, si je comprends bien - les objets de la même classe se dupliquent les uns les autres. J'ai juste laissé quelques déclarations provenant du travail avec l'indicateur et d'autres provenant de la transformation des scripts en fonction.


Je n'ai pas encore connecté la fonction avec le signal, je veux d'abord comprendre et nettoyer le code. Je comprends que j'ai fait une erreur quelque part, mais je n'ai pas encore les connaissances et l'expérience nécessaires pour comprendre exactement où et comment la réparer.

Veuillez nous soutenir.

 

Fichiers joints - EA, deux scripts et un indicateur.

Le compilateur ne jure pas, il n'y a pas d'erreurs à rechercher, juste quelques considérations stratégiques/tactiques pour savoir si c'est bien de faire cela et, si c'est mal, comment cela aurait dû être fait.

S'il vous plaît.

Dossiers :
 
Artyom Trishkin:
Mais dans un bon sens - la classe multitimer doit faire.

il ne faut pas compliquer les tâches simples ! ... a dit Me, qui a oisivement enveloppé la nouvelle fonction de définition des barres dans une classe )))).

à l'essentiel :

leonerd:

Est-il possible de faire deux timers dans un EA ? Pour une raison quelconque, je pensais que OnTimer() était appelé dans un thread séparé. Mais j'ai essayé d'ajouter une boucle infinie dans OnInit() et de mettre le timer avant, seule la boucle a fonctionné, OnTimer() n'a pas été appelé.

J'ai besoin de deux actions indépendantes qui s'exécutent constamment sur une minuterie. Chacun avec son propre intervalle. Savez-vous comment cela peut être mis en œuvre ?


#property strict
//--- input parameters
input int      Timer1=13;
input int      Timer2=21;
static int timer1=0,timer2=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if((timer1++)>Timer1) { timer1 = 0; Print("Timer №1"); }
   if((timer2++)>Timer2) { timer2 = 0; Print("Timer №2"); }
  }
//+------------------------------------------------------------------+