[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 192

 

Bonjour.

Problème avec les ordres en attente, notamment la date d'expiration.

   ticket=OrderSend(symb, OP_SELLLIMIT, Lots, price, Slippage, 0, 0, lsComm, mn, TimeCurrent() + 60*60, op_color);

C'est ainsi qu'un nouvel ordre est ouvert, c'est-à-dire que s'il n'a pas été déclenché dans une heure, le serveur doit le fermer.

Ensuite, je vérifie quelle est la date d'expiration :

   if (ticket>0)
   {
    OrderSelect(ticket, SELECT_BY_TICKET);
    Alert("OrderExpiration = ", TimeToStr(OrderExpiration(), TIME_DATE),":",TimeToStr(OrderExpiration(), TIME_MINUTES)); 
.......
   } 

Voici ce que j'obtiens lorsque l'EA fonctionne dans le testeur :

2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1 : open #1 sell limit 2.00 EURUSD à 1.27972 ok
2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1 : Alerte : OrderExpiration = 2012.01.11:12:00
2013.03.01 12:45:58 2012.01.12 16:29 Testeur : ordre #1, vendre 2.00 EURUSD est ouvert à 1.27972

Autrement dit, la date et l'heure d'expiration sont correctement définies, comme je le souhaite, mais je ne ferme pas à l'heure d'expiration - une position est ouverte après 24 heures.

J'ai cherché sur quelques forums et le problème se pose. Les réponses habituelles sont "ça marche pour moi" ou "tracez vous-même les ordres en attente". Je ne veux pas les suivre moi-même et cela ne fonctionne pas pour moi.

 
artmedia70:
Igor Kim a un conseiller qui fait ce qui suit à un intervalle déterminé

Il fonctionne très bien.

Merci pour le conseil !

 
DhP:

Il fonctionne très bien.

Merci pour le conseil !


Ce n'est pas moi, c'est Google.

Je pense que vous pouvez tirer la fonction de sauvegarde d'écran de là vous-même et définir vos propres paramètres pour l'appeler - j'étais trop paresseux....

 
borilunad:
Sergey, je laisse la question de la fonction ouverte pour le moment, car demain je vais insérer d'autres fonctions dans votre EA de test pour mener une expérience propre. Je l'ai regardé en mode visuel et presque toutes les doubles fermetures sont les dernières, les précédentes sont fermées par le SL et le TP, c'est-à-dire qu'il n'y a rien à choisir. J'ai supprimé les arrêts et les prises afin d'avoir quelque chose à choisir. Demain, je vous montrerai votre conseiller expert avec toutes les fonctions supplémentaires et des commentaires ! Vous pourrez voir par vous-même comment la fonction fonctionne. Je veux vraiment qu'il montre que j'avais tort ! Si j'ai raison, j'essaierai de faire de mon mieux ! A demain !

Sergey, Dubakin J'ai fait une vérification visuelle et je me suis assuré que cette fonction sélectionne les maximums, ce qui est ce dont j'avais besoin ! Je suis heureux de ne plus avoir de doutes, et je vous présente mes excuses ! Mais dans notre métier, "il vaut mieux mesurer sept fois...". Je montre à votre testeur l'EA pour tester la fonction, avec des caractéristiques et des commentaires ajoutés pour un contrôle visuel plus clair ! Merci !

extern int EA_Magic=135; // внешняя переменная

int TimeNow, TimePrev, PrevType; // глобальные переменные

int start()
{
  double Price,SL,TP;
     int Ticket;

  TimeNow=iTime(NULL,240,0);
  if(TimePrev==TimeNow) return(0);

  if(PrevType!=1) {
   Price=NormalizeDouble(Ask,Digits);    
//   SL=NormalizeDouble(Price-300*Point,Digits);    
//   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,0,0,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }

  else if(PrevType!=-1) {
   Price=NormalizeDouble(Bid,Digits);    
//   SL=NormalizeDouble(Price+300*Point,Digits);    
//   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,0,0,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }

  Comment("BuyPos: ",NumberOfBuyPositions(),"; SellPos: ",NumberOfSellPositions(),
  "; LotPos: ",GetAmountLotFromOpenPos(),
  "\nMaxLoss: ",DoubleToStr(GetMinProfit(),2),"; MaxProf: ",DoubleToStr(GetMaxProfit(),2),
  "\nLossDiff: ",DoubleToStr(GetMinProfit()+GetMaxProfit(),2));

  if(Hour()==0 && TimePrev==TimeNow) LockOFF(EA_Magic);

  return(0);
}

bool LockOFF(int EA_Magic) {
  double Result, PrevLoss, PrevProfit;
     int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
    bool Ans;

  MaxProfitTicket=-1; MaxLossTicket=-1;

  orders_total=OrdersTotal();
  for(pos=orders_total-1; pos>=0; pos--) {
    if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
    if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
    if(OrderType()>1) continue;
    Result=OrderProfit()+OrderSwap()+OrderCommission();
    if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
      PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType();  // end of for
  } }
  if(MaxLossTicket==-1) return(false); // нет убыточной позиции
  if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

  orders_total=OrdersTotal();
  for(pos=orders_total-1; pos>=0; pos--) {
    if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
    if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
    if(order_type!=OrderType()) continue;
    Result=OrderProfit()+OrderSwap()+OrderCommission();
    if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
      PrevProfit=Result; MaxProfitTicket=OrderTicket();  // end of for
  } }
  if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

  Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
  if(!Ans) { 
    Print("Ошибка при встречном закрытие!"); return(false); 
  }
  return(true); 
}
//+----------------------------------------------------------------------------+
int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY) {
        if (op<0 || OrderType()==op) {
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+
int NumberOfSellPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+
double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
  double l=0;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          l+=OrderLots();
  } } } }
  return(l);
}
//+----------------------------------------------------------------------------+
double GetMinProfit(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          if (p>OrderProfit()+OrderCommission()+OrderSwap())
          p=OrderProfit()+OrderCommission()+OrderSwap();
  } } } }
  return(p);
}
//+----------------------------------------------------------------------------+
double GetMaxProfit(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          if (p<OrderProfit()+OrderCommission()+OrderSwap())
          p=OrderProfit()+OrderCommission()+OrderSwap();
  } } } }
  return(p);
}
//+----------------------------------------------------------------------------+
 
borilunad:

Sergey, Dubakin J'ai fait une vérification visuelle et je me suis assuré que cette fonction sélectionne les maximums, ce qui est ce dont j'avais besoin ! Je suis heureux de ne plus avoir de doutes, et je vous présente mes excuses ! Mais dans notre métier, "il vaut mieux mesurer sept fois...". Je montre à votre testeur l'EA pour tester la fonction, avec des caractéristiques et des commentaires ajoutés pour un contrôle visuel plus clair ! Merci !

Comment... En se basant sur Igor Kim a fait quelque chose... Une seule de vos caractéristiques... les autres sont les mêmes...

//+----------------------------------------------------------------------------+
int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) { // для чего присвоены значения по-умолчанию, если они нигде не используются? Кроме op (и то неверно)
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY) {                               // тут жесткая проверка на тип Buy
        if (op<0 || OrderType()==op) {                         // тут лишняя проверка на значение op, используемое по умолчанию и ещё одна лишняя проверка на ==op
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+

quelque chose comme ça, je suppose :

//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy, int op, int mn) {
  int i, k=OrdersTotal()-1, kp=0;
  for (i=k; i>=0; i--) {
   if (OrderSelect(i,SELECT_BY_POS)) {           // если ордер выбран
      if (OrderMagicNumber()!=mn)   continue;    // если не наш магик - смотрим следующий ордер
      if (OrderSymbol()!=sy)        continue;    // если не наш символ - смотрим следующий ордер
      if (OrderType()!=op)          continue;    // если не соответствует тип - смотрим следующий
      kp++;                                      // тут искомый ордер - увеличим счётчик
      }
   }
  return(kp);
}
//+----------------------------------------------------------------------------+

Et l'appeler :

pour le comptage des achats et des ventes par le symbole actuel, avec Magic

//+----------------------------------------------------------------------------+
   int BuyPos= NumberOfPositions(Symbol(), OP_BUY,  Magic);
   int SellPos=NumberOfPositions(Symbol(), OP_SELL, Magic);
//+----------------------------------------------------------------------------+
 
alsu:
pasha5282 :
Pouvez-vous me dire comment choisir le plus petit lot parmi toutes les transactions ouvertes ?

int i, ot = OrdersTotal() ;
double min=0 ;
int min_ticket=0 ;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue ;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue ;
if(i==0||min>OrderLots()) {min = OrderLots() ; min_ticket=OrderTicket();}
}


J'ai parcouru le fil de discussion. Votre logique est étrange. Je suis intéressé par la dernière ligne de code :

if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();
La variable i a une valeur de 0 uniquement au début de la boucle. En outre, il ajoutera une valeur à chaque itération.

Ensuite, il y a une condition qui fera en sorte que la boucle continue :

min>OrderLots()
Mais min est déclaré comme étant zéro et sa valeur ne change nulle part ailleurs dans le code. Ce qui signifie que cette valeur ne sera jamais vraie! Où est la logique ?
 
hoz:


J'ai parcouru le fil de discussion. Votre logique est étrange. Je suis intéressé par la dernière ligne de code :

La variable i a une valeur de 0 uniquement au début de la boucle. En outre, il ajoutera de la valeur à chaque itération par 1.

Ensuite, il y a une condition pour que le cycle continue :

Mais min est déclaré comme étant zéro, et sa valeur ne change jamais ailleurs dans le code. Ce qui signifie que cette valeur ne sera jamais vraie ! Où est la logique ?

int i, ot = OrdersTotal();
double min=0.0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
if(min==0.0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}
Si nous procédons de cette façon, toutes les choses étranges devraient disparaître.
 
hoz:


J'ai regardé à travers la branche. Votre logique est étrange. Je suis intéressé par la dernière ligne de code :

La variable i a la valeur 0 uniquement au début de la boucle. En outre, il ajoutera de la valeur à chaque itération par 1.

Ensuite, il y a une condition pour que le cycle continue :

Mais min est déclaré comme étant zéro, et sa valeur ne change jamais ailleurs dans le code. Ce qui signifie que cette valeur ne sera jamais vraie ! Où est la logique ?

Veuillez noter

if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();

Si min>OrderLots(), alors min = OrderLots() ;

 
r772ra:

Veuillez noter

Si min>OrderLots() alors, min = OrderLots() ;

Si min est égal à zéro, il ne peut jamais devenir supérieur à OrderLots().
 
Diubakin:
Si vous faites cela, toutes les bizarreries devraient disparaître.

Pour supprimer la condition "supplémentaire", vous pouvez procéder comme suit :

    int i, ot = OrdersTotal();
    double min = 1000.0;
    int min_ticket=0;
    for (i=ot - 1; i>= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS)) continue;
        if (OrderType()!=OP_BUY) if (OrderType()!=OP_SELL) continue;
        if (min <= OrderLots()) continue;
        min = OrderLots();
        min_ticket=OrderTicket();
    }
Raison: