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

 
законопослушный гражданин #:

D'après ce que je vois, la différence est la suivante :

Vous pouvez parcourir l'histoire depuis le début ou depuis la fin. Il n'y a pas de différence. Quoi qu'il en soit, la fonction recherche l'ordre dont l'heure de clôture est la plus récente. Et si l'on veut supprimer ou clôturer des ordres, il faut chercher à partir de la fin de la liste. Sinon, la boucle sautera des commandes.

 
законопослушный гражданин #:

D'après ce que je peux voir, la différence est la suivante :

Dans ce cas, il n'y a pas de différence. Le cycle de OrersTotal à 0 n'est obligatoire que dans le cas de la fermeture de positions ou de la suppression d'ordres. Dans les autres cas, c'est vous qui décidez.

 
Mihail Matkovskij #:

Vous pouvez parcourir l'histoire depuis le début ou depuis la fin. Il n'y a pas de différence. Quoi qu'il en soit, la fonction recherche l'ordre dont l'heure de fermeture est la plus tardive. Et si vous souhaitez supprimer ou clôturer des ordres, vous devez effectuer une recherche à partir de la fin de la liste. Sinon, la boucle sautera des commandes.

Si la fonction recherche l'ordre dont l'heure de clôture est la plus récente, la recherche sera évidemment plus rapide en partant de la fin - de l'heure actuelle vers le passé, plutôt que du début de l'historique.

 
Artyom Trishkin #:

Si la fonction recherche un ordre dont l'heure de clôture est la plus tardive, la recherche sera évidemment plus rapide, non pas en partant du début de l'historique, mais de la fin - de l'heure actuelle à l'heure passée.

Dans le sens inverse, la fonction trouvera plus rapidement l'ordre avec le dernier temps de fermeture, elle ne le changera pas jusqu'à la fin du cycle et retournera le résultat. Dans le sens direct, il cherchera dans tous les ordres et retournera l'un des derniers ordres. La différence est que les variables seront écrasées à chaque passage de la boucle. Oui, il y a une différence. Mais je pense que ce n'est pas très significatif. Bien que je préférerais la boucle dans le sens inverse à celle dans le sens direct. Malgré le fait que la fonction fonctionnera d'une manière ou d'une autre.

 
Bonjour à tous, existe-t-il un moyen de passer d'une fenêtre de graphique à l'autre de manière programmatique, c'est-à-dire de rendre n'importe quel graphique actif à partir du programme ?
 
Maksim Mihajlov #:
Bonjour à tous, existe-t-il un moyen de passer d'une fenêtre de graphique à l'autre de manière programmatique, c'est-à-dire de rendre n'importe quel graphique actif à partir d'un programme ?

Vérifiez

CHART_BRING_TO_TOP

Afficher le graphique au dessus de tous les autres graphiques

bool

 
Alexey Viktorov #:

Vérifiez

CHART_BRING_TO_TOP

Afficher le graphique au dessus de tous les autres graphiques

bool

Merci !

 
Mihail Matkovskij #:

Vous pouvez parcourir l'histoire depuis le début ou depuis la fin. Il n'y a pas de différence. Quoi qu'il en soit, la fonction recherche l'ordre dont l'heure de fermeture est la plus tardive. Et si vous souhaitez supprimer ou clôturer des ordres, vous devez alors effectuer une recherche à partir de la fin de la liste. Sinon, la boucle sautera des commandes.

Quoi qu'il en soit, j'ai créé deux EAs complètement identiques, à l'exception du comptage des lots de commande ! !! et voici le résultat :

NE FONCTIONNE PAS (c'est-à-dire qu'il n'ouvre pas BAY au lieu de SELL)

void OnTick()
{
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
 {
//Если появился сигнал на покупку, то откроем ордер на покупку
  if(bSignalBuy())
  {
   if(GetLotSize()>LotControl) vOrderOpenSell();
   else vOrderOpenBuy();
  }
// Если появился сигнал на продажу, то откроем ордер на продажу
  if(bSignalSell())
  {
   if(GetLotSize()>LotControl) vOrderOpenBuy();
   else vOrderOpenSell();
  }
 }
}
,,,
double GetLotSize()
  {
   double Ls=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) {Ls=OrderLots();}
           }
        }
     }
   return Ls;
  }

TRAVAIL ( (c'est-à-dire qu'il ouvre BAY au lieu de SELL)


void OnTick()
{
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
 {
//Если появился сигнал на покупку, то откроем ордер на покупку
  if(bSignalBuy())
  {
   if(GetLotSize()>LotControl) vOrderOpenSell();
   else vOrderOpenBuy();
  }
// Если появился сигнал на продажу, то откроем ордер на продажу
  if(bSignalSell())
  {
   if(GetLotSize()>LotControl) vOrderOpenBuy();
   else vOrderOpenSell();
  }
 }
}
...
double GetLotSize()
  {
   double Ls=0;
   datetime t=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }
 
законопослушный гражданин #:

Quoi qu'il en soit, j'ai créé deux EAs complètement identiques, à l'exception du comptage des lots de commande ! !! et voici le résultat :

NE FONCTIONNE PAS (c'est-à-dire qu'il n'ouvre pas BAY au lieu de SELL)

TRAVAIL (c'est-à-dire qu'il ouvre BAY au lieu de SELL)


Une fois de plus, je souligne la différence

1 variante

double GetLotSize()
  {
   double Ls=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))

2 variantes

double GetLotSize()
  {
   double Ls=0;
   datetime t=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
 
законопослушный гражданин #:

Quoi qu'il en soit, j'ai créé deux EAs complètement identiques, à l'exception du comptage des lots de commande ! !! et voici le résultat :

NE FONCTIONNE PAS (c'est-à-dire qu'il n'ouvre pas BAY au lieu de SELL)

TRAVAIL ( (c'est-à-dire qu'il ouvre BAY au lieu de SELL)


Essayez de comprendre ce que vous codez, plutôt que de copier aveuglémentOrdersTotal,OrdersHistoryTotal,

CommandeSélection

pool=MODE_TRADES

[Source des données à sélectionner. Utilisé lorsque le paramètre de sélection est SELECT_BY_POS. Peut être l'une des valeurs suivantes :

MODE_TRADES (par défaut) - l'ordre est sélectionné parmi les ordres ouverts et en attente,
MODE_HISTORY - l'ordre est sélectionné parmi les ordres fermés et supprimés.

    OrdersTotal - Торговые функции - Справочник MQL4
    OrdersTotal - Торговые функции - Справочник MQL4
    • docs.mql4.com
    OrdersTotal - Торговые функции - Справочник MQL4
    Raison: