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

 
void CheckForClose()
  {
   double PriceHigh, PriceLow;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
   
   PriceHigh = iCustom (Symbol(), 0, "ExtremeTMALine", TimeFrame, HalfLength , Price, ATRMultiplier, ATRPeriod, Interpolate, TrendThreshold, Distances, 1, 0); 
   PriceLow = iCustom (Symbol(), 0, "ExtremeTMALine", TimeFrame, HalfLength , Price, ATRMultiplier, ATRPeriod, Interpolate, TrendThreshold, Distances, 2, 0); 
   
   
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
        {
         if(Low[1]<=PriceHigh && Ask>PriceHigh) OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Ask<=PriceLow && High[1]>PriceLow) OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
         break;
        }
     }
//----
  }

artmedia70

Pour en revenir à mes béliers, concernant la fermeture d'une position lorsque le prix traverse une ligne d'indicateur. Je pense que l'erreur se trouve dans cette fonction
.

si(Volume[0]>1) retour ;

J'ai lu dans le tutoriel qu'au lieu de compter les ticks, nous pouvons ouvrir (fermer) une position à l'apparition des barres. Est-ce possible ? Si c'est le cas, pouvez-vous me donner un indice sur la façon de le programmer pour ma situation.

 
alexey1979621:

artmedia70

Pour en revenir à mes béliers, concernant la fermeture d'une position lorsque le prix traverse une ligne d'indicateur. Je pense que l'erreur se trouve dans cette fonction
.

si(Volume[0]>1) retour ;

J'ai lu dans le tutoriel qu'au lieu de compter les ticks, nous pouvons ouvrir (fermer) une position à l'apparition des barres. Est-ce possible ? Si c'est le cas, pouvez-vous nous envoyer un indice sur la façon de le programmer pour ma situation.

Peut-être que ça sera utile :

La fonction retourne vrai lorsqu'une nouvelle barre apparaît sur M15.

bool CheckOpenM15()
{
   static int PrevTime=0;
   if (PrevTime==iTime(NULL, PERIOD_M15,0)) return(false);
   PrevTime=iTime(NULL, PERIOD_M15,0);
   return(true);
}
 
ex1m:

Veuillez me conseiller ! !!

J'écris des ordres en attente à un moment donné

{

Définir le temps d'ouverture

}

if ((condition)==true)//
{
OrderSend ( OP_BUYSTOPP, parameters);// ouvrir un ordre BuyStop en attente
OrderSend ( OP_SELLSTOP, parameters);// ouvrir un ordre SellStop en attente
}

Je pense avoir écrit l'heure correctement ; il la détecte mais pour une raison quelconque, il ouvre soit le Sell Stop soit le Buy Stop et n'ouvre pas deux ordres à la fois. J'essaie d'ouvrir deux ordres en suspens de types différents (Bistop et Sellstop) en même temps et un par un. La question semble être primitive, merci d'aider les nuls).

Pour coller le code correctement ici, cliquez d'abord sur SRC et copiez ensuite le code à cet endroit.

Si j'ai bien compris, à un moment donné, je dois ouvrir une OP_BUYSTOP et une OP_SELLSTOP ? Est-il acceptable d'avoir d'autres ordres en attente en ce moment ? Par exemple, il y a des ordres en attente, mais nous devons supprimer les anciens avant d'ouvrir les nouveaux ?

 
artmedia70:
Cette erreur concerne les objets graphiques, et non les commandes

.
Exactement ! L'erreur fait référence aux objets, mais je n'ai aucun objet dans cette EA...


borilunad:
Bonsoir, Victor ! Bizarre, l'ordre en attente n'est pas un objet ! Peut-être avez-vous un objet qui aurait déjà dû être supprimé, mais qui ne l'a pas été !

Bonjour, Boris ! Le conseiller expert ne crée pas d'objets. Cette erreur provient de la fonction qui place un ordre en attente. Voici la version de la fonction (pour le testeur) :

bool OpenPendingBuy(double lot, double price)
{
   int g_ticket = -1;
   double OOP = price + i_distanceFromLastPos * pt;

   if (OOP > Ask)
   {
       fCheck_ValidPendingOOP(Symbol(), OP_BUYSTOP, OOP);
       
       g_ticket = OrderSend(Symbol(), OP_BUYSTOP, lot, ND(OOP), 30, 0, 0, NULL, i_magic, 0, CLR_NONE);
   }
   if (g_ticket > 0)
   {
       return (true);
   }
   else
       pr ("OpenPendingBuy(): Ордер послать не удалось " + GetLastError());
   
   return (false);
}

Si aucun ordre n'a été passé, cela signifie qu'un blocage a été déclenché :

else
       pr ("OpenPendingBuy(): Ордер послать не удалось " + GetLastError());

C'est le bloc qui signale l'erreur.


Quelqu'un a-t-il compris la logique ?

 
artmedia70:

Puisqu'il n'y a pas de réponse à la question, voici une fonction qui renverra le ticket du dernier ensemble de commandes :



Merci ! !! juste ce dont j'ai besoin

 
hoz:
Exactement ! L'erreur concerne les objets, mais je n'ai aucun objet dans cette EA...

Bonjour, Boris ! Le conseiller expert ne crée pas d'objets. Cette erreur provient de la fonction qui place un ordre en attente. Voici la version de la fonction (pour le testeur) :

Si la commande n'a pas été passée, cela signifie qu'un blocage a été déclenché :

C'est le bloc qui signale l'erreur.

Quelqu'un a-t-il compris la logique ?

Alors, vérifiez votre contrôle d'erreur ? Il doit y avoir un problème !
 
borilunad:
Alors, vérifiez votre contrôle d'erreur ? Il doit y avoir un problème !

Heh)) Qu'y a-t-il à redire sur Boris ? Tout est transparent...

pr est une fonction d'impression. Et l'erreur, c'est déjà une constante standard. Logiquement, c'est inacceptable d'être comme ça. Si vous avez encore des doutes sur la fonction pr, la voici :

//+-------------------------------------------------------------------------------------+
//| Распринтовка на экран                                                               |
//+-------------------------------------------------------------------------------------+
void pr (string txt)
{
string info [];
ArrayResize(info,20);
string h,m,s,cm; int i;
h=DoubleToStr(Hour(),0);    if (StringLen(h)<2) h="0"+h;
m=DoubleToStr(Minute(),0);  if (StringLen(m)<2) m="0"+m;
s=DoubleToStr(Seconds(),0); if (StringLen(s)<2) s="0"+s;
txt=h+":"+m+":"+s+" - "+txt;
for(i=20-1; i>=1; i--)
info[i]=info[i-1];
info[0]=txt;
for(i=20-1; i>=0; i--)
if(info[i]!=""){
cm=info[i];
ObjectCreate ("txtw"+i,OBJ_LABEL,0,0,0);
ObjectSet    ("txtw"+i,OBJPROP_CORNER,1);
ObjectSet    ("txtw"+i,OBJPROP_XDISTANCE,10);
ObjectSet    ("txtw"+i,OBJPROP_YDISTANCE,30+15*i);
ObjectSetText("txtw"+i,cm, 10, "Times New Roman", Green);}}
 

  • Quelqu'un comprend-il la logique ?


Le lot est-il normalisé ? Bien et vérifiez le prix.

Est-ce que i_magic, pt, i_distanceFromLastPos sont globaux ?

 
splxgf:

i_magic, pt, i_distanceFromLastPos sont globaux ?


Oui. Les variables avec i_ sont des variables d'entrée (du mot intut, qui peut être modifié par l'utilisateur...), et pt est aussi une variable globale, qui est visible partout...
.
splxgf:


  • Quelqu'un comprend-il la logique ?


Le lot est-il normalisé ? Bien et vérifiez le prix.


Non, le lot n'a pas été normalisé. Je ne l'ai jamais rencontré dans le testeur... Et qu'est-ce que Lot a à voir avec l'objet (erreur 4200) ?
 
hoz:

Je reçois occasionnellement, mais pas constamment, une erreur 4200 lorsque je place un ordre en attente. Selon la documentation, cette erreur signifie que l'objet existe déjà :

ERR_OBJECT_ALREADY_EXISTS 4200 Объект уже существует

Il s'avère qu'un ordre de ce type est déjà sur le marché lorsque l'ordre en attente est envoyé ?

Peut-être qu'un autre programme crée un objet graphique portant le même nom, auquel l'EA réagit. Vous devez peut-être changer le nom des objets.