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

 
Roman Sharanov:

J'ai aussi trouvé un sérieux inconvénient, trop d'appels à CopyClose()

Pouvez-vous me dire comment copier les cotations d'un tableau de paires de devises dans une boucle ?

Cela semble être un tableau double, c'est pourquoi MQL ne le supporte pas, comme %.

MQL4 semble fonctionner avec des tableaux dynamiques à deux dimensions. Vous pouvez modifier la première dimension avec ArayResize(), et passer la seconde àCopyClose().

Ou une solution universelle des développeurs, parce que les tableaux dynamiques à deux dimensions ne fonctionnent pas dans MQL5, enveloppez un tableau unidimensionnel dans une structure et créez un tableau de telles structures..... Si vous y arrivez, considérez que vous avez presque créé une classe, et c'est plus optimal - une classe avec des méthodes qui chargent les données et les stockent dans les propriétés de la classe (champs)
 
Igor Makanu:

MQL4 semble fonctionner avec des tableaux dynamiques à deux dimensions. Utilisez ArayResize() pour modifier la première dimension etCopyClose() pour modifier la seconde.

ou une solution universelle des développeurs, car les tableaux dynamiques à 2 dimensions ne fonctionnent pas dans MQL5, enveloppez un tableau à une dimension dans une structure et créez un tableau de telles structures..... Si vous y arrivez, considérez que vous avez presque créé une classe, et c'est plus optimal - la classe avec la méthode qui charge les données elle-même et les stocke dans les propriétés de la classe (champs)

Merci et je vais essayer

 

Une autre question sur l'indicateur, je ne sais pas quoi faire d'autre ici.

J'ai besoin d'imprimer la différence entre la clôture des paires saisies et la moyenne mobile de celles-ci.

Je ne sais pas quoi faire d'autre.

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 2
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_style1 STYLE_SOLID
#property indicator_type2 DRAW_LINE
#property indicator_style2 STYLE_SOLID
#property indicator_width1 1
#include <MovingAverages.mqh>

input string active_1 = "EURUSD";
input string active_2 = "USDJPY";
input ENUM_TIMEFRAMES timeframe = PERIOD_H1;
input int ma_period = 30;

double firstBuffer[], secondBuffer[], dataBuffer[], maBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, dataBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, maBuffer, INDICATOR_DATA);
   SetIndexBuffer(2, firstBuffer, INDICATOR_CALCULATIONS);
   SetIndexBuffer(3, secondBuffer, INDICATOR_CALCULATIONS);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---

   CopyClose(active_1,timeframe,0,rates_total,firstBuffer);
   CopyClose(active_2,timeframe,0,rates_total,secondBuffer);

   int first, bar;
   if(prev_calculated == 0) first = begin; else first = prev_calculated - 1;

   for(bar = first; bar<rates_total; bar++){
      dataBuffer[bar] = firstBuffer[bar]-secondBuffer[bar];
   }

   ExponentialMAOnBuffer(rates_total,prev_calculated,begin,ma_period,dataBuffer,maBuffer);
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

Les ordres doivent être énumérés dans une boucle, pas à chaque tick... Pour être plus précis, un tick est arrivé et tous vos ordres dans la boucle ont été comptés : for(j=0;j<OrderTotal;j++)

OrdersTotal() montre combien d'ordres sont ouverts (y compris les ordres en attente, y compris les ordres sur tous les symboles...). au total... Voici le nombre d'ordres ouverts dans le terminal - voici le nombre de )))).

La numérotation des commandes se fait comme dans les tableaux, de 0 à OrdersTotal()-1 - c'est la dernière commande, et vous avez probablement un numéro de ticket inexistant [OrdersTotal()] ou d'autres informations dans le journal à chaque tick, ce qui est difficile à deviner.

Oui, je le veux - et je veux qu'il passe par toutes les commandes. Le fonctionnement était un peu différent au départ, mais je l'ai simplifié au maximum dans l'espoir de trouver la cause et de la réparer. Le retracement consécutif complet ne se produit que lorsque les ticks sont rares ou après que j'ai retiré l'EA du graphique et qu'aucun nouveau ticks n'est apparu.

J'ai toujours pensé que si l'EA est entré dans le corps d'une fonction, il ne devrait pas réagir aux autres ticks avant de sortir de la boucle, mais il semble que ce ne soit pas le cas. Comment éviter cette situation ?

int test()
{
int total ;
total = OrdersTotal() ;
log("total = " + total +" ; ") ;

pour (int j = 0 ; j < total ; j++)
{
log("j = " + j +" ; ") ;
}
retour(0) ;
}

 
Андрей:
Pourquoi avons-nous besoin d'informations sur tous les ordres à chaque tick? Ne serait-il pas préférable d'introduire des restrictions sur l'affichage de l'ordre, par exemple toutes les nouvelles minutes, cinq minutes, ..., heure ?

Le problème n'est même pas que j'ai besoin d'informations pour chaque tick, mais que, si je comprends bien, la boucle n'a pas le temps de se terminer avant qu'un nouveau tick n'arrive et que ce nouveau tick casse en quelque sorte le compte. Voici une autre capture d'écran, pour que vous n'ayez pas à chercher la précédente. Il montre que l'EA a compté jusqu'à 52 puis a sauté à 93. J'ai eu du mal à croire que c'est à cause des nouveaux ticks, mais je ne trouve pas d'autre raison, car avec les rares ticks le compte se termine bien, ainsi que le dernier cycle après la suppression de l'EA du graphique.

J'ai déjà simplifié le code autant que possible :

int test()
{
int total ;
total = OrdersTotal() ;
log("total = " + total +" ; ") ;

pour (int j = 0 ; j < total ; j++)
{
log("j = " + j +" ; ") ;
}
retour(0) ;
}

Dossiers :
test.jpg  82 kb
 
Artyom Trishkin:

Comment le savez-vous ? Ce n'est pas le cas.

Tant que tous les calculs qui ont commencé avec l'arrivée du tick ne sont pas terminés, tous les ticks suivants sont ignorés.

Comme je l'ai écrit juste au-dessus, j'ai la même situation, sauf que je l'ai déjà simplifiée à un certain point et que je suis arrivé à la conclusion que non seulement je ne peux normalement faire aucun calcul, mais que je dois simplement passer les commandes une par une et imprimer leurs numéros dans le journal.

Moi aussi, j'ai toujours cru que "Tant que tous les calculs qui ont commencé avec l'arrivée d'un tic n'ont pas été achevés, tous les tics suivants sont ignorés". J'aimerais que ce soit le cas, mais je n'ai pas encore trouvé d'autre raison, à part de nouveaux tics.

 
Artyom Trishkin:

Personne ne le saura sans le code.

Voici un code extrêmement simplifié, qui présente le même problème - les nouveaux ticks perturbent la sortie successive des numéros d'ordre.

int test()
{
int total ;
total = OrdersTotal();
log("total = " + total +" ; ") ;

for (int j = 0 ; j < total ; j++)
{
log("j = " + j +" ; ") ;
}
return(0) ;
}

 
Algotrader18:

Voici un code extrêmement simplifié qui présente le même problème - les nouveaux ticks perturbent la sortie séquentielle des numéros d'ordre.

int test()
{
int total ;
total = OrdersTotal() ;
log("total = " + total +" ; ") ;

pour (int j = 0 ; j < total ; j++)
{
log("j = " + j +" ; ") ;
}
retour(0) ;
}

Ce code compile-t-il vraiment sans erreur ? Je n'y crois pas...
 
Roman Sharanov:

Une autre question sur l'indicateur, je ne sais pas quoi faire d'autre ici.

J'ai besoin d'imprimer la différence entre la clôture des paires saisies et la moyenne mobile de celles-ci.

Au final, il ne fait qu'afficher la différence sans MA, quel est le problème ?

C'est cool !

Roman !

Moi, par exemple, je suis un trader prospère avec 20 ans d'expérience.

Je ne comprends pas pourquoi vous avez besoin de "la différence entre les clôtures des paires saisies, etune moyenne mobile de celles-ci".

De plus, savez-vous comment construire une moyenne mobile de ces différences ? - Fantastique !

Pouvez-vous simplement dessiner la moyenne mobile des cotations ? - Non aussi ?

Quel est donc le problème ?

 
Algotrader18:

Voici un code extrêmement simplifié qui présente le même problème - les nouveaux ticks perturbent la sortie séquentielle des numéros d'ordre.

int test()
{
int total ;
total = OrdersTotal() ;
log("total = " + total +" ; ") ;

for (int j = 0 ; j < total ; j++)
{
log("j = " + j +" ; ") ;
}
retour(0) ;
}

ce code fonctionne, faites-le par analogie :

int NumberOfOrders(int magic_)
  {
   int i,res=0,k=OrdersTotal(); string sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if((OrderMagicNumber()==magic_) && (OrderSymbol()==sy)) res++;
        }
     }
   return(res);
  }
Raison: