Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 122

 
skyjet:

Bonjour, je recherche des erreurs dans cette fonction.

L'idée est que les ordres en attente qui n'ont pas été ouverts soient supprimés deux jours après avoir été placés.

min=1440 ;

if (OrdersTotal()>0)
{  for (int i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderSymbol()!=Symbol()) continue;
         if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
         {  if(TimeCurrent()-OrderOpenTime()>=min)
            {  OrderDelete(OrderTicket());
               return;
         }  }
}  }  }
 
skyjet:

Bonjour, je recherche des erreurs dans cette fonction.

L'idée est que les ordres en attente qui n'ont pas été ouverts soient supprimés deux jours après avoir été placés.

min=1440 ;


Pourquoi voudriez-vous suivre et supprimer les commandes en attente? Vous devez définir leur date d'expiration=TimeCurrent()+min*60+sec ; ils seront supprimés eux-mêmes après min*60+sec.
 
Sepulca:

Pourquoi devez-vous surveiller et supprimer les ordres en attente ? Vous devez définir la date expiration=TimeCurrent()+min*60+sec ; ils seront supprimés d'eux-mêmes après min*60+sec.
Peut-être que l'ordre en attente sera clôturé selon un certain algorithme, donc il sera clôturé en 1 jour s'il y a une autre condition, par exemple, 2 jours. 2 jours.
 
Sepulca paladin80 Merci ! l'expiration de la date est exactement ce dont nous avons besoin :)
 

paladin80:

OrderOpenTime() renvoie l'heure d'ouverture de l'ordre.

Pour un ordre en attente, cette fonction renvoie zéro.

 
PapaYozh:

OrderOpenTime() renvoie l'heure d'ouverture de l'ordre.

Pour un ordre en attente, cette fonction renvoie zéro.

Hmm, j'ai rapidement modifié le code sans vérifier les fonctions elles-mêmes. Exact, OrderOpenTime() indique l'heure d'ouverture de la position par le courtier, mais pas l'heure d'acceptation de l'ordre en attente par le courtier. C'est-à-dire, probablement, il serait mieux de spécifier l'heure de fermeture immédiatement dans l'ordre, ou d'enregistrer l'heure d'envoi de l'ordre dans le numéro magique (s'il n'est pas utilisé de toute façon) et de comparer TimeCurrent() avec OrderMagicNumber( ).
 

Bon après-midi. Aidez-moi à gérer l'indicateur personnalisé.

Je résous le problème de la détermination de la distance à la ligne de tendance. J'ai besoin d'obtenir la distance à la ligne de tendance exactement sur le cadre temporel où elle est tracée (indépendamment du cadre temporel qui est ouvert dans le terminal). La valeur actuelle de la ligne de tendance peut être obtenue à l'aide de la fonction ObjectGetValueByShift. Comme les calculs ne peuvent être effectués que par le temps d'ouverture, j'ai écrit un petit indicateur. J'ai été attiré par le fait que la fonction iCustom possède le paramètre timeframe, mais je me demande dans quelle mesure ce paramètre est pris en compte lors de l'appel de l'indicateur.

Voici l'indicateur :


#property indicator_chart_window
#property indicator_buffers 1
//--------------------------------------------------------------------   
extern string TL_name = "TL_1";
//--------------------------------------------------------------------   
double valueBuf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
   //---- indicators
   SetIndexBuffer(0,valueBuf);
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1, White);
   //----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
   //----
   //----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int i;
   int    counted_bars = IndicatorCounted();
   //----
   i = Bars - counted_bars - 1;           // Индекс первого непосчитанного
   
   // Цикл по непосчитанным барам
   while(i>=0) {
      valueBuf[i] = NormalizeDouble(ObjectGetValueByShift(TL_name,i), Digits);
      i--;
   }     
   //----
   return(0);
}

L'indicateur prend en compte la valeur actuelle de la tendance.
J'appelle l'indicateur lui-même :

TL_price_now = iCustom(NULL,PERIOD_D1,"TL_value",TL_name,0,0);

Ici, par exemple, le temps PERIOD_D1 est passé à l'indicateur comme un paramètre, sur lequel la tendance est tracée, et pour lequel la distance doit être calculée.

Je calcule simplement la distance à la tendance :

dist = NormalizeDouble(TL_price_now - Bid, Digits);
Il semble que ce soit le cas, mais ce n'est pas le cas : lorsque je passe à d'autres timings (différents de D1), l'indicateur renvoie d'autres valeurs (correctes pour les timings sur lesquels je passe).
Nous avons ici une question : dans quelle mesure une période est prise en compte lors de l'appel de la fonction iCustom ?
Ou peut-être que j'ai raté l'indicateur ?
 
pako:


t = OrdersTotal() ;

pourquoi compter ???? compté ???


Je l'ai donc fait pour passer la valeur par référence. La logique est simple !
 
artmedia70:

Dans ma version, la fonction est plus courte ... :)



Oui, d'ailleurs, cette façon de procéder est plus intelligente. Ce n'est qu'au démarrage que l'espace est occupé par des fonctions supplémentaires. Ça s'est passé comme ça :

void FindOrders(int& massive[])
{
   int oType;
   ArrayInitialize(massiveOfOrders, 0);
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      
      oType = OrderType();
      massiveOfOrders[oType] = massiveOfOrders[oType] + 1;
   }
}

int start()
{
   int i, oTotal = 0, oPending = 0;
   
   FindOrders(massiveOfOrders);
   
   for (i=0; i<=7; i++)
   {
       if (i > 1 && i < 6)
       {
           oPending += massiveOfOrders[i];
       }
       if (i < 6)
       {
          oTotal += massiveOfOrders[i];
       }
   }
   pr ("FindOrders(): " + "oTotal = " + oTotal);
   pr ("FindOrders(): " + "oPending = " + oPending);

Ce n'est pas comme s'il y avait quelque chose à optimiser, n'est-ce pas ?

Je veux dire, c'est beaucoup plus pratique, quand il n'y a rien du tout au départ. Et tout est appelé purement par des fonctions. Et la dernière fois, il s'est avéré que le départ a beaucoup de surcroîts de toutes sortes sur les fonctions principales et des surcroîts de fonctions supplémentaires...

 

Bonne journée !

Veuillez nous aider et nous expliquer pourquoi le conseiller expert ne fonctionne pas ou n'effectue pas de transactions ?