Questions des débutants MQL5 MT5 MetaTrader 5 - page 645

 
Alexey Kozitsyn:
En supposant que la dernière commande par le temps n'est pas la dernière commande de la liste, votre exemple est incorrect car il ne tient pas compte de la toute première commande (n°0).

On trouve d'abord le ticket du dernier ordre dans le temps, puis on effectue un cycle avec des modifications. Lorsqu'un ticket trouvé précédemment et de la dernière commande est rencontré dans la boucle, il est ignoré.

Pour trouver le ticket de la dernière commande, nous n'avons pas besoin de rechercher dans tout l'historique de toutes les commandes - nous pouvons définir la taille de l'historique recherché - un jour, deux, trois, une semaine... "Et ignorez toutes les commandes dont l'heure est antérieure à la plage de recherche. Par exemple, si la taille de l'historique de recherche est fixée à 1 jour, toutes les commandes antérieures à l'heure actuelle (1 jour) sont ignorées. Mais nous avons toujours besoin du cycle. Si nous ne prenons que la dernière commande de la liste, cela peut être Acheter, et nous avons besoin de Vendre. C'est l'avant-dernier. Ainsi, nous n'aurons pas ses données.

 
Artyom Trishkin:

On trouve d'abord le ticket du dernier ordre dans le temps, puis on effectue un cycle avec des modifications. Lorsqu'un ticket trouvé précédemment et de la dernière commande est rencontré dans la boucle, il est ignoré.

Pour rechercher le ticket de la dernière commande, vous n'avez pas besoin d'exécuter l'historique complet de toutes les commandes - vous pouvez définir la taille de l'historique recherché - un jour, deux, trois, une semaine... "Et ignorez toutes les commandes dont l'heure est antérieure à la plage de recherche. Par exemple, si la taille de l'historique de recherche est fixée à 1 jour, toutes les commandes antérieures à l'heure actuelle (1 jour) sont ignorées. Mais la boucle est toujours nécessaire. Si nous ne prenons que la dernière commande de la liste, cela peut être Acheter, et nous avons besoin de Vendre. C'est l'avant-dernier. Ainsi, nous n'aurons pas ses données.

Artem, merci pour l'explication bien sûr, mais je sais comment trouver l'ordre dans la liste. Et ma réponse ne s'adressait pas à vous, mais à Alexei sur son exemple (en particulier, que la condition "> 0" ne fonctionnera pas).

Il vaut mieux écrire de la bonne manière (avec du code uniquement). Je suis paresseux :)

 
Alexey Kozitsyn:
Si l'on suppose que le dernier ordre n'est pas le dernier de la liste, votre exemple est incorrect car il ne tient pas compte du tout premier ordre (ordre 0).

Comment pourrait-il en être autrement ?

Alexey Viktorov:

Une variante supplémentaire : avant la boucle, écrire dans la variable _1 un ticket, par exemple d'ordre zéro, puis

/********************Script program start function********************/
void OnStart()
{
  int i, t1, t2, modTicket , total = OrdersTotal();
   datetime d1, d2;
    if(OrderSelect(0, SELECT_BY_POS))
     {
      t1 = OrderTicket();
       d1 = OrderOpenTime();
     }    
    for(i = 1; i < total; i++)
     {
      if(OrderSelect(i, SELECT_BY_POS))
       {
        t2 = OrderTicket();
         d2 = OrderOpenTime();
          modOrder((d1 < d2) ? t1 : t2);
         t1 = d1 < d2 ? t2 : t1;
        d1 = d1 < d2 ? t2 : t1;
       }
     }
}/********************************************************************/

void modOrder(int ticket);
{
// здесь код модификации ордера.
}/********************************************************************/
J'espère que je n'ai rien gâché d'autre.
 
Alexey Viktorov:

Comment pourrait-il en être autrement ?

/********************Script program start function********************/
void OnStart()
{
  int i, t1, t2, modTicket , total = OrdersTotal();
   datetime d1, d2;
    if(OrderSelect(0, SELECT_BY_POS))
     {
      t1 = OrderTicket();
       d1 = OrderOpenTime();
     }    
    for(i = 1; i < total; i++)
     {
      if(OrderSelect(i, SELECT_BY_POS))
       {
        t2 = OrderTicket();
         d2 = OrderOpenTime();
          modOrder((d1 < d2) ? t1 : t2);
         t1 = d1 < d2 ? t2 : t1;
        d1 = d1 < d2 ? t2 : t1;
       }
     }
}/********************************************************************/

void modOrder(int ticket);
{
// здесь код модификации ордера.
}/********************************************************************/
J'espère que je n'ai pas fait d'autres erreurs, je n'ai pas revérifié...
Si vous le prenez comme une entrée en matière, c'est bien, mais c'est mieux de le faire par la fin... Mais si vous ne supprimez pas les commandes, cela ne pose pas de problème non plus.
 
Alexey Kozitsyn:
Si vous la prenez comme variante de départ, elle fera l'affaire, mais il vaut mieux la faire par la fin... Toutefois, si nous n'avons pas à supprimer de commandes, nous serons également satisfaits.

En fait, pour modifier plusieurs commandes, il faut les parcourir en boucle. Il s'avère donc que les microsecondes supplémentaires ne seront consacrées qu'à la comparaison du temps d'ouverture de l'ordre. Il s'agira d'une variante optimale.

Le sens du cycle ... Cela n'a pas vraiment d'importance, car il ne s'agit pas de fermer les commandes. J'ai confondu ma version précédente et j'ai écrit "close", donc la boucle correspondait là aussi...

 

Bonjour !

Je m'essaie à l'écriture d'un indicateur. Je veux obtenir visuellement ce que j'ai voulu, mais je veux que l'indicateur envoie les informations requises, par exemple, des informations textuelles, ou le type int. Comment puis-je le faire, en tenant compte du fait que j'ai 10 tampons, en fonction desquels les lignes sont tracées ? Merci !

 

Bonjour, ne me donnez pas de coup de pied, mais j'ai trouvé cette rubrique et j'ai décidé de poser quelques questions ... J'ai un terminal ... j'ai téléchargé d'un courtier MT4 (1) ... j'ai exécuté la démo ... après un certain temps, je me suis inscrit à un autre, aussi

On m'a proposé de télécharger le terminal ... téléchargé (2) en conséquence, 2 terminal ne va pas ... et 1 apparu profil 2 courtier ... en général, tous confus ... puis de binaire vient une lettre qu'ils passent à MT5 ... installé et à première vue, tous beaucoup mieux que le MT4 . Ma question est de savoir s'il est possible d'ouvrir un compte avec différents courtiers sur un seul terminal ? et puis-je les transférer tous sur mt5 ? et si les indicateurs de MT4 conviennent à 5 ?

Merci...

 

Une aide si active, merci beaucoup.

Déjà aux prises avec un nouveau problème)

Veuillez m'aider à trouver la cause de la nouvelle apparence des vertex ZigZag.

J'ai essayé de stocker dans une variable le prix du premier sommet, puis de le comparer, si le prix a changé lever un drapeau, il y a un nouveau sommet.
if(newZZH1_PR!=GetExtremumZZPrice(Symbol(),T_F_,1))
{
   newZZH1_PR=GetExtremumZZPrice(Symbol(),T_F_,1);
   newZZH1=true;
}

Mais il s'est avéré que la fonction, au fil du temps, renvoie de manière chaotique, puis le prix du premier sommet, puis le second.

Il s'avère que le nouveau sommet n'est pas formé et que le drapeau est levé.
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0)
{

  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", ExtDepth,ExtDeviation,ExtBackstep, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}
L'idéal serait de modifier la fonction pour qu'elle renvoie toujours le prix du premier sommet, mais toute solution me conviendrait.
 
mila.com:

Une aide si active, merci beaucoup.

Déjà aux prises avec un nouveau problème)

Veuillez m'aider à trouver la cause de la nouvelle apparence des vertex ZigZag.

J'ai essayé de mémoriser dans une variable le prix du premier sommet, puis de comparer, si le prix a changé lever un drapeau, il y a un nouveau sommet.
if(newZZH1_PR!=GetExtremumZZPrice(Symbol(),T_F_,1))
{
   newZZH1_PR=GetExtremumZZPrice(Symbol(),T_F_,1);
   newZZH1=true;
}

Mais il s'est avéré que la fonction, au fil du temps, renvoie de manière chaotique, puis le prix du premier sommet, puis le second.

Il s'avère qu'aucun nouveau sommet n'est formé, mais le drapeau est levé.
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0)
{

  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", ExtDepth,ExtDeviation,ExtBackstep, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}
L'idéal serait de modifier la fonction pour qu'elle renvoie toujours le prix du premier sommet, mais toute solution me conviendrait.

Le zigzag a en fait trois tampons - 0 au total, 1 - l'extrémité supérieure, 2 - l'extrémité inférieure.

À la barre du zéro, il y a toujours une valeur dans l'un des tampons - soit dans le premier (si le genou est en haut), soit dans le second (s'il est en bas). Par conséquent, le tampon zéro de la bougie actuelle a toujours une valeur - soit du premier tampon, soit du second.

Pour trouver une extrémité supérieure claire, il faut chercher la première valeur non vide du premier tampon, à partir de la mesure 1. Pour l'extrémité inférieure, nous devons trouver la première valeur non vide du deuxième tampon, en partant de la mesure 1.

Pour comprendre s'il s'agit d'un nouveau sommet ou d'un nouveau creux, nous devons nous souvenir de l'heure du précédent sommet/bas trouvé, et le comparer à ce que nous avons trouvé jusqu'à présent.

C'est un peu décousu, mais j'espère que vous comprendrez...

 
Il y a deux bornes MT5. Problème : puis-je écrire des scripts pour autoriser uniquement les transactions longues dans un terminal et uniquement les transactions courtes dans l'autre ?
Raison: