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

 
Ihor Herasko:

OrderSelect() est exécuté dans le terminal, il n'y a pas de requête au serveur. Il n'y a donc rien de mal à accéder à la liste des ordres à chaque tick. C'est ce que font la plupart des conseillers experts.

Et votre question sur le tableau est liée à l'architecture du programme. Dans le cas d'un EA complexe qui fonctionne avec un grand nombre d'ordres, cela est absolument nécessaire. Si le conseiller expert fonctionne avec un seul ordre avec une logique simple, le tableau est redondant.

Il faut seulement mentionner le fait que même si nous avons un tableau de commandes, nous ne pouvons pas nous passer d'appeler OrderSelect(). En effet, nous devons vérifier à chaque tick si l'ordre existe toujours ou non. Ses paramètres peuvent également être modifiés.

Merci.
 
Rustam Bikbulatov:

Les gars, dites-moi comment faire et par où commencer !

Exemple : J'ai 15 ordres avec un lot de 0,01. Je dois fermer une ou plusieurs transactions avec un lot de 0,07 à un moment donné.

Ma question est la suivante : comment puis-je clôturer 7 ordres ou 0,07 en un seul OrderClose(...) ?

Si je mets 0,07 en une fois, il ne voit pas les transactions avec un volume de 0,01.

Je suis novice en matière de programmation.


    int countS = 3;
   if(LastTime!=iTime(NULL,1,0)){
      for(int i=OrdersTotal()-1; i>=0; i--){
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
        if(OrderSymbol()==Symbol() && OrderMagicNumber()==321){ 
         if(OrderType()==OP_SELL){
           irvb=OrderClose(OrderTicket(),0.01,Ask,3,CLR_NONE);
           LastTime=iTime(NULL,1,0); countS--; if(countS==0)break;   
          }}}}} 

J'ai reçu un conseil sur la façon de faire un compteur sous la forme decountS .

Il devrait conclure trois transactions de 0,01 lot par minute. Maintenant, nous nous demandons comment le convertir pour que toutes les commandes soient calculées dans l'ordre.

Si nous définissonsfor(int i=OrdersTotal()-1; i>=0; i--){ les dernières commandes seront comptées dans l'ordre,

Si for(int p=0 ; p<OrdersTotal() ; p++){ alors passez de la première à la dernière commande.

Le compteur fonctionne, mais lorsque la taille du lot est par exemple de 0,15, il ne ferme pas 0,03 lot, il ferme 0,01 lot chaque minute.

Que conseillez-vous d'ajouter ?

Comment faire pour qu'il soit possible de clôturer une partie du lot total indépendamment du nombre et de la taille des ordres ?
 
Rustam Bikbulatov:


Une astuce sur la façon de faire un compteur decomptage .

Il devrait y avoir trois transactions de 0,01 lot fermées par minute. J'ai maintenant une question : comment le convertir pour que toutes les commandes soient comptées dans l'ordre.

Si nous définissonsfor(int i=OrdersTotal()-1; i>=0; i--){ les dernières commandes seront comptées dans l'ordre,

Si for(int p=0 ; p<OrdersTotal() ; p++){ alors passez de la première à la dernière commande.

Le compteur fonctionne, mais lorsque la taille du lot est de 0,15, par exemple, il ne ferme pas 0,03 lot et ferme 0,01 lot toutes les minutes.

Que conseillez-vous d'ajouter ?

Comment faire pour qu'il soit possible de clôturer une partie du lot total indépendamment du nombre et de la taille des ordres ?

Pour régler ce problème (très étrange, d'ailleurs), vous devez travailler avec la liste "Historique du compte". À chaque nouvelle itération, nous devrions parcourir cette liste et trouver les ordres qui ont été fermés pendant la minute en cours et faire la somme de leur volume. S'il n'y a pas assez de volume, il faut faire le tri (ne demandez pas comment, c'est vous qui décidez) et prendre une seule commande. Fermez-le à 0,01. À la prochaine itération, recommencez.

 
Ihor Herasko:

Lorsque vous définissez une telle tâche (très étrange, d'ailleurs), vous devez travailler avec la liste "Historique du compte". À chaque nouvelle itération, parcourez cette liste et trouvez les ordres qui ont été fermés pendant la minute en cours, en faisant la somme de leur volume. S'il n'y a pas assez de volume, il faut faire le tri (ne demandez pas comment, c'est vous qui décidez) et prendre une seule commande. Pour le fermer à 0.01. A la prochaine itération, tout recommence.

Je vais essayer ! Merci.

 
harbor:
Je ne peux pas configurer l'envoi de courrier depuis le terminal.
Je n'arrive pas à le faire fonctionner avec myl.ru, mais je l'ai configuré de la même manière et il n'envoie pas le message de test.
Quelqu'un s'en est occupé ?

si c'est pour vous-même (et non pour la vente), alors le bon traitement pour les problèmes de courrier est :

1) obtenir un mailer sur localhost pour gérer le transfert, garantir la livraison et ne pas s'embêter avec les autorisations et la protection anti-spam. Sinon, les EA se retrouveront très vite sur toutes sortes de listes noires.
Ce n'est pas difficile - il y a un smtp win intégré et gratuit avec des paramètres simples, dans une pincée vous pouvez script vous-même :-)

2) Utiliser une alternative à SendMail() . Pour contrôler l'ensemble du processus, pour envoyer des rapports plus intelligents, avec des balises, des drapeaux, éventuellement en html et avec des images.

Lorsque vous combinez 1+2 vous obtenez un total de 3 :-) c'est donc une solution raisonnable et stable.

en savoir plus sur l'envoi de courrier : https://www.mql5.com/ru/blogs/post/718364

-----

Si vous avez besoin d'aide concernant les spécificités de SendMail et la configuration de MT, veuillez joindre des captures d'écran, des extraits de code source, des diagnostics d'erreur...
Donc ce n'est pas seulement un "coup souterrain".

TradeBiff - отправка почты со скриншотами
TradeBiff - отправка почты со скриншотами
  • 2018.05.19
  • Maxim Kuznetsov
  • www.mql5.com
Очень важно получать детальные оповещения о действиях любого робота. Универсальный способ оповещений - это отправка почты. TradeBiff будет следить за изменениями и отправлять вам необходимые отчёты. Таким образом у вас в почтовом ящике получится хороший торговый журнал. Постановка задачи Ставим себя на место заказчика и формулируем задачу...
 
Ai-je bien compris que"TimeCurrent()" renvoie l'heure du dernier tick lorsqu'il est appelé par une fonction utilisateur ?
 
Asa saas:
Ai-je bien compris que "TimeCurrent()" renvoie l'heure du dernier tick lorsqu'il est appelé par une fonction utilisateur ?

Oui

 

Salutations !


On peut accéder à une commande en utilisant la commandeOrderSelect par son numéro.

Question : est-il possible de connaître à l'avance les numéros des commandes existantes, afin de ne pas les passer toutes en revue ? Par exemple, nous pouvons mémoriser ce numéro lors de l'ouverture d'une nouvelle commande.

Je comprends que ce numéro est attribué dans l'ordre en partant de 1. Quelles sont les nuances possibles ?

Merci beaucoup.

 
Decromor:

Salutations !


On peut accéder à une commande en utilisant la commande OrderSelect par son numéro.

Question : est-il possible de connaître à l'avance les numéros des commandes existantes, afin de ne pas les passer toutes en revue ? Par exemple, nous pouvons mémoriser ce numéro lors de l'ouverture d'une nouvelle commande.

Je comprends que ce numéro est attribué dans l'ordre en partant de 1. Quelles sont les nuances possibles ?

Merci beaucoup.

CommanderEnvoyer
CommandeSélection

 

J'ai cassé mon cerveau, aidez-moi s'il vous plaît !

J'ai écrit une unité de calcul de corrélation. Mais OANDA et investing.com donnent des résultats complètement différents ! C'est drôle, ils ne sont pas assortis non plus !

Où ai-je tort ?


La paire de devises actuelle est EURUSD, je vérifie la corrélation avec GBPUSD.


extern string SubSymbol = "GBPUSD" ;

extern int correlation_time = 24 ; // combien d'heures pour vérifier la corrélation des paires de devises sélectionnées ?

.....

// ------------------------ bloc de calcul de la corrélation --------------------------------------

int période = 15 ;

int bars_number = MathRound(correlation_time*60/period) ;

double symbol_avg = 0 ;

double symbol_avg = 0 ;

double symbol_price[], double subsymbol_price[] ;

double x,y ;

int j ;

int shift = 0 ;

ArrayResize(symbol_price, bars_number) ;

ArrayResize(subsymbol_price, bars_number) ;

for (j=0 ; j < nombre de barres ; j++)

{

symbol_price[j] = (iHigh(NULL,period,j+shift) - iLow(NULL,period,j+shift))/2 ;

subsymbol_price[j] = (iHigh(SubSymbol,period,j+shift) - iLow(SubSymbol,period,j+shift))/2 ;

symbol_avg = symbol_avg + symbol_price[j] ;

subsymbol_avg = subsymbol_avg + subsymbol_price[j] ;

}

symbol_avg = symbol_avg/bars_number ;

subsymbol_avg = subsymbol_avg/bars_number ;

double ss_xx = 0 ;

double ss_xy = 0 ;

double ss_yy = 0 ;

for (j=0 ; j < nombre de barres ; j++)

{

x = symbol_price[j] - symbol_avg ;

y = subsymbol_price[j] - subsymbol_avg ;

ss_xy = ss_xy + x*y ;

ss_xx = ss_xx + x*x ;

ss_yyy = ss_yy + y*y ;

}

double corrélation = ss_xy/MathSqrt(ss_xx*ss_yyy) ;

Alert(correlation, " ", bars_number) ;

ArrayFree(symbol_price) ;

ArrayFree(subsymbol_price) ;

// ------------------------ fin du bloc de calcul de la corrélation ---------------------------------

Raison: