Questions des débutants MQL4 MT4 MetaTrader 4 - page 85

 
deathmond1990:
Bonjour. La question est la suivante : peut-on charger les valeurs des ticks (les prix correspondants) pour une certaine période de négociation (c'est-à-dire pour une seule bougie) dans un tableau unidimensionnel ? Et de le faire de telle sorte que le réseau se forme pendant la formation d'une bougie. Est-ce réaliste dans MQL4 ? J'apprécierais vos commentaires.


C'est réel. Une gamme dynamique et un départ.

//-----------------------+
int k=0;       //на глобальном уровне
double тики[];
//----------------
void OnTick()
  {
   ArrayResize(тики,k+1);
   тики[k]=Bid;
   k++;
  }
//+------------------------
 
Alekseu Fedotov:


De façon réaliste. Un tableau dynamique et c'est parti.

Merci beaucoup =)
 
Salutations messieurs ! Je ne veux pas que ce soit une inondation, mais je ne peux pas me passer de cette fonction. Alors les gars, quelqu'un peut-il m'aider avec cette fonction qui passe par tous les ordres et supprime deux ordres en même temps, celui avec le plus petit lot et un profit négatif, et celui avec le plus grand lot et un profit positif.
 
Arseniy Barudkin:
Salutations messieurs ! Je ne veux pas que cela ressemble à une inondation, mais je ne peux pas me passer de cette fonction. Alors les gars, quelqu'un peut-il m'aider avec cette fonction qui passe par tous les ordres et supprime deux ordres en même temps, celui avec le plus petit lot et un profit négatif, et celui avec le plus grand lot et un profit positif, également à partir des ordres existants.

Essayez de rechercherOrderCloseBy
 

Comment faire pour que les données de toutes les variables globales soient sauvegardées même après la fermeture du terminal en mode normal et anormal ?

La question concerne les variables déclarées au début du code comme ceci :

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  VAR1 = 1;

double VAR2[1000];

J'ai besoin de ne pas perdre les valeurs de VAR1 et VAR2 (le tableau est rempli de données pendant le fonctionnement de l'Expert Advisor). Jusqu'à présent, la seule idée est d'écrire des données dans un fichier (global.txt) à chaque tick, puis, lorsque le terminal est lancé, de lire le fichier (global.txt) et de recréer les variables, puis de les écrire à nouveau à chaque tick. Quelles sont les autres options ?

 
smart_man:

Comment s'assurer que les données de toutes les variables globales sont préservées même après la fermeture du terminal client en mode normal et anormal ?

La question concerne les variables déclarées comme ceci :

extern double  VAR1 = 1;

double VAR2[1000];

J'ai besoin de ne pas perdre les valeurs de VAR1 et VAR2 (le tableau est rempli de données pendant le fonctionnement de l'Expert Advisor). Jusqu'à présent, la seule idée est d'écrire des données dans un fichier (global.txt) à chaque tick, puis, lorsque le terminal est lancé, de lire le fichier (global.txt) et de recréer les variables, puis de les écrire à nouveau à chaque tick. Quelles sont les autres options ?

Option

Variables globales du terminal client

//--------

À ne pas confondre avec les variables déclarées globalement

 
fxtz:

Question Puis-je écrire un programme dans Metatrader 4 pour ouvrir de 2 à 250 positions de mon choix avec un stoploss et un profit définis en un clic ? Je n'ai pas besoin d'en ouvrir un manuellement


Avez-vous trouvé une société de courtage où vous pouvez ouvrir autant d'ordres pour un seul instrument ? Habituellement, 100 ordres est une limite pour tous les instruments...

Et oui, je pourrais en ouvrir 100.

 
Alekseu Fedotov:

Essayez de rechercherOrderCloseBy

Merci ! Mais je dois sélectionner les tickets de ces ordres à partir d'au moins 3 ordres, souvent il y a plus de 5 à 10 ordres, dois-je calculer et comparer les lots et les profits de ces ordres séparément ?

 
Arseniy Barudkin: Nous devons sélectionner les tickers d'ordres, alors pourquoi devrions-nous calculer et comparer les lots et les profits de ces ordres séparément ?

La situation est bien pire que vous ne l'imaginez. Une seule commande, sélectionnée par OrderSelect(), est disponible à un moment donné. Et lorsque la toute première commande est sélectionnée, à quoi devons-nous la comparer ? Les gars intelligents font vraiment quelque chose comme ça

double МинПрофит=1000000, МаксПрофит=-1000000;
int МаксТикет=0, МинТикет=0;
for(int Номер=OrdersTotal-1; Номер>=0; Номер--)
{
   if(!OrderSelect(Номер,SELECT_BY_POS)) continue;
   if(OrderProfit()>МаксПрофит)
   {
      МаксТикет=OrderTicket();
      МаксПрофит=OrderProfit();
   }
   else if(OrderProfit()<МинПрофит)
   {
      МинТикет=OrderTicket();
      МинПрофит=OrderProfit();
   }
 }
Ensuite, regardez la valeur des billets trouvés - tout à coup, ils sont à zéro !!!
 
STARIJ:

La situation est bien pire que vous ne l'imaginez. Une seule commande, sélectionnée par OrderSelect(), est disponible à un moment donné. Et lorsque la toute première commande est sélectionnée, à quoi devons-nous la comparer ? Les gars intelligents font vraiment quelque chose comme ça

Ensuite, regardez la valeur des billets trouvés - tout à coup, ils sont à zéro !!!

Merci pour votre aide ! Jusqu'à présent, je l'ai laissé comme ça, maintenant j'ai décidé de changer un peu les conditions dans lesquelles la fonction est appelée. Et en général, vous m'avez beaucoup aidé))
void MarginDefuse(double lot1=0,double lot2=0)
{
 int ticket1=0,ticket2=0,type=-1;
 double profit1=0,profit2=0;
 bool res1=false,res2=false;
 // Выделение
 for(int i=0; i<OrdersTotal(); i++)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots()>=lot1 && OrderProfit()<0)
   {
    ticket1=OrderTicket();
    lot1=OrderLots();
    type=OrderType();
    profit1=OrderProfit();
   }
  }
 }
 for(int i=OrdersTotal()-1; i>=0; i--)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType() != type && OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots() >= lot2/Multipler && OrderProfit()>0 && OrderLots()>lot1)
   {
    ticket2 = OrderTicket();
    lot2 = OrderLots();
    profit2=OrderProfit();
   }
  }
 }
 if((profit1+profit2)>0 && lot1<lot2)
 {
  while (!RefreshRates());
  if(ticket1)
  {
   if(OrderSelect(ticket1,SELECT_BY_TICKET))
   res1=OrderCloseX(ticket1,lot1);
  }
  if(ticket2)
  {
   if(OrderSelect(ticket2,SELECT_BY_TICKET))
   res2=OrderCloseX(ticket2,lot2);
  }
  if(res1 && res2)
   DeletePos();
 }
}
Raison: