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

 
Sergey Likho:

Quelle est la meilleure façon d'écrire l'algorithme ?


Tâche :

Un conseiller expert fonctionne sur différents graphiques.

J'ai besoin d'un fichier séparé contenant des informations minute par minute sur le compte, le solde, les fonds propres, etc.

Il s'avère maintenant que tous les conseillers experts écrivent toutes les informations dans un seul fichier. Par conséquent, nous avons beaucoup d'entrées inutiles.

Quelle est la solution originale possible, pour qu'un seul robot fasse des enregistrements dans le fichier (et, s'il était supprimé, l'autre robot commencerait à faire des enregistrements, etc.)

Créez un objet graphique dans OnInit() avec le nom de l'EA, ou tout autre objet. Peut-être que l'EA crée déjà un objet, vous pouvez l'utiliser, par exemple "MonEA" :ObjectCreate(0,"MonEA",OBJ_...,...))

Dans OnTick(), lorsque nous écrivons dans le fichier, nous devons vérifier le premier ID de graphique avec cette étiquette = cela signifie que c'est le premier conseiller expert installé dans le terminal, nous ne sommes pas intéressés par le reste.

Nous devons utiliser le dépassement :

string ChartGetSymb()
  {
   string symb="";
   long chartID=ChartFirst();
   while(chartID!=-1) 
    {
      if(ObjectGetString(chartID,"MyEA",OBJPROP_NAME)=="MyEA")
       {
        symb=ChartSymbol(chartID);
        break;
       }
      chartID=ChartNext(chartID);
     }
   return(symb);
  }

Nous obtenons le premier graphique/symbole avec un conseiller expert installé dessus

Puis nous le comparons avec le premier Expert Advisor avant de l'écrire dans un fichier :

if(ChartGetSymb() == Symbol()) {
  записываем в файл, если соответствует символу, иначе не записываем
}


Ce n'est pas une construction facile, mais c'est mieux que d'écrire dans une variable globale.

 
Artyom Trishkin:

Prenez la MA standard, changez le type de données du tampon, compilez et vérifiez dans la fenêtre de données du terminal (Ctrl+D).

Cela n'aiderait pas car il n'apparaîtrait pas dans le terminal. Mais je l'ai vérifié dans l'indicateur ZigZag, qui a deux tampons supplémentaires pour High et Low déclarés comme INDICATOR_CALCULATIONS. Elles sont également extraites du programme, bien qu'elles ne soient pas affichées dans le terminal. Merci quand même pour le conseil.
 
Sergey Likho:

ChartID() est écrit dans les variables globales du terminal avec une erreur. Quelle est cette absurdité ?


Essayez ce code :


Le résultat de l'exécution de ce code

2019.11.29 15:22:07.453 Script 00 EURUSD,H1: removed
2019.11.29 15:22:07.453 00 EURUSD,H1: uninit reason 0
2019.11.29 15:22:07.453 00 EURUSD,H1: GVAR id:131992895281608496 GV_id:131992895281608496
2019.11.29 15:22:07.453 00 EURUSD,H1: initialized
2019.11.29 15:22:07.433 Script Test\00 EURUSD,H1: loaded successfully
 
Vitaly Muzichenko:

Créez un objet graphique dans OnInit() avec le nom de l'EA ou tout autre objet, peut-être que l'EA crée déjà un objet, alors vous pouvez l'utiliser, supposons "MyEA" : ObjectCreate(0,"MyEA",OBJ_...,...))

Dans OnTick() où l'on écrit dans le fichier, nous devons vérifier le premier ID de graphique avec cette étiquette = cela signifie que c'est le premier conseiller expert installé dans le terminal, nous ne sommes pas intéressés par le reste.

Nous devons utiliser le dépassement :


Nous obtenons le premier graphique/symbole avec un conseiller expert installé dessus

Puis nous le comparons avec le premier Expert Advisor avant de l'écrire dans un fichier :


Ce n'est pas une construction facile, mais c'est mieux que d'écrire dans la variable globale

Oui, bonne idée.

Merci.


Question, que se passe-t-il si l'EA a été supprimé (par exemple à cause d'une erreur), mais que l'objet est resté. Que faire, si le graphique est complètement fermé, nous devons réaffecter l'EA "principal" ?

 
Sergey Likho:

Oui, c'est une bonne idée.

Merci.


Question ensuite : Que se passe-t-il si l'EA a été supprimé (par exemple à cause d'une erreur), mais que l'objet est resté. Que faire si le graphique est fermé dans son intégralité, nous devons d'une manière ou d'une autre réaffecter le conseiller expert "principal" ?

Il n'y a qu'un seul cas d'erreur - si le conseiller expert a été supprimé accidentellement et que l'objet a été laissé, mais dans ma mémoire, je ne me souviens pas d'une telle erreur dans MT4. Dans tous les autres cas, le conseiller expert en chef sera réaffecté.


P.S. Essayez de vérifier que la fonction OnDeInit() sera émise en cas d'erreur dans le conseiller expert et s'effacera du graphique. Vous pouvez probablement le vérifier facilement en créant une variable, en comptant les ticks et en la divisant par 10/0 au 11ème tick.

Dans OnDeInit() définir Print et voir la cause de la désinitialisation, et si elle se produit, alors par cette cause/numéro supprimer l'objet "MyEA" du graphique

t++;
if(t > 10) {
 int e = 10;
 e /= 0;
}

Vous pouvez écrire sur le résultat, car je n'ai pas le temps de le vérifier moi-même.

 
Vitaly Muzichenko:

Créez un objet graphique dans OnInit() avec le nom de l'EA ou tout autre objet, peut-être que l'EA crée déjà un objet, alors vous pouvez l'utiliser, supposons "MyEA" : ObjectCreate(0,"MyEA",OBJ_...,...))

Dans OnTick() où l'on écrit dans le fichier, nous devons vérifier le premier ID de graphique avec cette étiquette = cela signifie que c'est le premier conseiller expert installé dans le terminal, nous ne sommes pas intéressés par le reste.

Nous devons utiliser le dépassement :


Nous obtenons le premier graphique/symbole avec un conseiller expert installé dessus

Puis nous le comparons avec le premier Expert Advisor avant de l'écrire dans un fichier :


Ce n'est pas une construction facile, mais c'est mieux que d'écrire dans une variable globale.

Je pense que vous vous trompez. Les GV ne sont pas écrits sur le disque à chaque fois. Sinon, il n'y aurait pas besoin de forcer GV sur le disque.

void  GlobalVariablesFlush();
Et en plus de ça, parcourir tous les graphiques à la recherche de l'EA et de l'objet... Vitaly, c'est une déception...
 
Alexey Viktorov:

Je pense que vous vous trompez. Les GV ne sont pas écrits sur le disque à chaque fois. Sinon, nous n'aurions pas besoin de la fonction d'écriture forcée de GV sur le disque.

Oui plus de parcourir tous les graphiques à la recherche d'EA et d'objet.... Vitaly, c'est une vraie déception...

Oui, ils le sont :GlobalVariableSet("GV",ID) ;

profils -> gvariables.dat


 
Vitaly Muzichenko:

On peut aussi les écrire comme suit :GlobalVariableSet("GV",ID) ;

profils -> gvariables.dat


Lorsque vous le créez, peut-être, mais lorsque vous l'écrasez avant de désactiver l'application qui y écrit, vous devez vérifier. Je suis trop paresseux. Pourtant, de manière purement théorique, si elle devait être écrite sur le disque à chaque fois, la fonction ci-dessus serait un hochet.

 
Sergey Likho:

Vous ne pouvez pas faire ça.

Recherchez un programme Windows qui synchronise les données dans des dossiers. Et configurez-le de manière à ce que l'Expert Advisor soit copié automatiquement sur un nouveau terminal.

D'après ce que j'ai compris, il existe de tels programmes, mais ils ne fonctionnent qu'avec des fichiers, mais si c'est un document texte, il ne copie pas le contenu et ne remplace pas les fichiers, peut-être que je n'ai pas trouvé un programme normal. C'est dommage que les développeurs n'aient pas envisagé l'option permettant de spécifier le chemin à partir duquel télécharger le fichier du conseiller expert ou du robot, je pensais pouvoir spécifier le chemin comme cela se fait habituellement, mais comme vous l'avez souligné ci-dessus, c'est impossible.

 
Seric29:

D'après ce que j'ai compris, il existe de tels programmes, mais ils ne fonctionnent qu'avec des fichiers, mais si c'est un document texte, il ne copie pas le contenu et ne remplace pas les fichiers, peut-être n'ai-je pas trouvé un programme normal. Je pense qu'il est dommage que les développeurs n'aient pas pris en compte la possibilité de définir le chemin d'accès au robot ou au fichier expert. Je pensais qu'il serait possible de définir le chemin d'accès comme cela se fait habituellement, mais comme vous l'avez déjà mentionné, ce n'est pas possible.

Notez dans ce post les mots "Tous les terminaux ont des dossiers partagés".

Ce n'est pas possible. Forum sur le trading, les systèmes de trading automatisés et le test des stratégies de trading.

Que dois-je faire si je veux utiliser un produit du marché ?

Sergey Tabolin, 2019.11.23 08:17

Vous pensez sérieusement que je ne sais pas comment et où installer ? )))

Tous les terminaux ont des dossiers communs

J'ai téléchargé un indicateur gratuit sur le marché. Il se lie au matériel.

Pourquoi cela fonctionne-t-il sur un matériel, mais pas sur l'autre ?

Conclusion évidente - il se lie, du moins pas seulement au matériel...


Cherchez des informations sur la façon de procéder et c'est parti... C'est ce qu'on appelle la liaison par dossier.

Raison: