Quel modèle est correct ? - page 5

 
valenok2003:

Le résultat est ce script

Question - Pourquoi ne ferme-t-il pas toujours toutes les commandes ? Par exemple, j'ouvre trois ordres de vente l'un après l'autre et j'essaie de les fermer, mais le script peut en fermer un, deux ou tous. Quelle en est la raison ?

Avez-vous besoin d'un script ?

Dans ce cas, vous n'avez pas besoin d'instruction while, les scripts fonctionnent déjà en boucle.

Pour le script, vous avez besoin de cette construction...

Je ne me souviens pas du lien, voici le script qui ferme tous les ordres ouverts.

//+------------------------------------------------------------------+
//|                                               CloseAllOrders.mq4 |
//|                       Copyright © 2008, PRMQuotes Software Corp. |
//|                                           Jedimedic77@gmail.com  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, PRMQuotes Software Corp."
#property link      ""
//+------------------------------------------------------------------+
//| EX4 imports                                                      |
//+------------------------------------------------------------------+
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//| global variables to program:                                     |
//+------------------------------------------------------------------+
double Price[2];
int    giSlippage;
bool   CloseOpenOrders = true;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start() {
  int iOrders=OrdersTotal()-1, i;
  
  if(CloseOpenOrders) {
    for(i=iOrders; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderType()<=OP_SELL) && GetMarketInfo() && 
      !OrderClose(OrderTicket(),OrderLots(),Price[1-OrderType()],giSlippage)) Print(OrderError());
    }
  }
}
//+------------------------------------------------------------------+
//| Function..: OrderError                                           |
//+------------------------------------------------------------------+
string OrderError() {
  int iError=GetLastError();
  return(StringConcatenate("Order:",OrderTicket()," GetLastError()=",iError," ",ErrorDescription(iError)));
}
//+------------------------------------------------------------------+
//| Function..: GetMarketInfo                                        |
//+------------------------------------------------------------------+
bool GetMarketInfo() {
  RefreshRates();
  Price[0]=MarketInfo(OrderSymbol(),MODE_ASK);
  Price[1]=MarketInfo(OrderSymbol(),MODE_BID);
  double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
  if(dPoint==0) return(false);
  giSlippage=(Price[0]-Price[1])/dPoint;
  return(Price[0]>0.0 && Price[1]>0.0);
}
//+------------------------------------------------------------------+
 
valenok2003:

Le résultat est ce script

Question - Pourquoi ne ferme-t-il pas toujours toutes les commandes ? Par exemple, si j'ouvre trois ordres de vente d'affilée et que j'essaie de les fermer avec le script, il peut en fermer un, deux ou tous. Quelle en est la raison ?
Et les guillemets font combien de chiffres ?
 
khorosh:
Et les guillemets font combien de chiffres ?
cinq
 
Martingeil:

Avez-vous besoin d'un script ?

Merci, bien sûr. Mais il est facile d'obtenir un script standard. Je veux découvrir quelle est la raison.
 
Martingeil:

Avez-vous besoin d'un script ?

alors vous n'avez pas besoin de l'instruction while, les scripts fonctionnent déjà en boucle.


Le script ne fonctionne qu'une fois. Il n'y a pas d'auto-boucle et il n'y en a jamais eu.

Valenok, avez-vous besoin que le script ferme tous les ordres ou seulement ce symbole ?

 
Martingeil:

Avez-vous besoin d'un script ?

Alors vous n'avez pas besoin de l'instruction while, les scripts fonctionnent déjà en boucle.

Pour un script, vous avez besoin de cette construction...

Je ne me souviens pas du lien, voici un script qui ferme tous les ordres ouverts.

Dans le code while , seulement pour retarder pendant que le thread est occupé.
 
Techno:

le script ne fonctionne qu'une fois. Il n'y a pas d'autodéclenchement et il n'y en a jamais eu.

Valenok, voulez-vous que le script ferme tous les ordres ou seulement ce symbole ?

Oui, vous avez tort, je voulais dire que ça ne dépend pas des ticks...
 
Techno:

le script ne fonctionne qu'une fois. Il n'y a pas d'autodéclenchement et il n'y en a jamais eu.

Valenok, vous avez besoin du script pour fermer tous les ordres, ou seulement ce symbole ?



N'ouvrez que des ordres d'un seul symbole. Ceux qui sont en attente ne sont pas affectés.

La chose amusante est que le code critiqué dans kodobase

int start()
{
//----
  while(OrdersTotal()>0)
  {
    for (int i=0; i < OrdersTotal(); i++)                                                        
    {                                                                                          
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
        OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5);  
      }
    }
  }                                               
//----
   return(0);
}

fonctionne sans aucun problème, mais quand j'ai commencé à l'améliorer, j'ai commencé à avoir des problèmes.

zy :

Au sujet de la ficelle erronée

for (int i=0; i < OrdersTotal(); i++)

Je l'ai déjà compris.

 
valenok2003:



N'ouvrez que des ordres d'un seul symbole. Nous ne touchons pas à ceux qui sont en attente.

Alors, passons directement aux reports d'audience et allons-y. Sous une forme générale.

int start()
{
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
    if(OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol())
      switch(OrderType())
         {
         case 0  : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5); break;
         case 1  : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),5); break;
         default : OrderDelete(OrderTicket()); break;
         }
    }
        
}
 
Martingeil:
Tu as raison, je ne voulais pas le dire comme ça, indépendamment des tics...


J'en suis conscient.
Raison: