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

 
Kapizdo4ka:

Bonjour ! Pourriez-vous me dire pourquoi j'ai parfois un opérateur ifle qui ne fonctionne pas.
Voici un exemple :

Où :
H3 est la valeur du prix du niveau
price est le prix actuel

Le résultat est que le prix atteint ce niveau (parfois même s'y arrête), mais l'alerte ne se déclenche pas.
Pouvez-vous me dire quelle est l'erreur ?

L'erreur est que le prix coïncide rarement exactement avec la valeur du niveau. Soit le prix >= H3, soit définir une plage d'erreur.
 
//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "http://vinin.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
extern double gLot=0.1;            // размер лота для покупки 
extern double gPoint=0.001;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
// -------- переменные --- К ----- 
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {

// Открытие позиции
   if(OrdersTotal()==0)
     {
      Print(" Открытие первой позиции ");
      double _Ask=MarketInfo("GBPUSD",MODE_ASK);
      int ticket=OrderSend("GBPUSD",OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0)
        {
         Print(" ОРДЕР ОТКРЫТ ",ticket);
        }
     }

   double _Bid=MarketInfo("GBPUSD",MODE_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS))
        {
         if(OrderOpenPrice()+gPoint<_Bid)
           {
            OrderClose(OrderTicket(),OrderLots(),_Bid,15);
            
ResetLastError();
if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

           }
        }
     }
   return(0);
  }

Bonjour.

Le programme se présente comme suit.

Lors de la compilation, il donne :

Ozero.mq4'Ozero.mq4 1 1
la valeur de retour de 'OrderClose' doit être vérifiée Ozero.mq4 46 13
conversion implicite de 'nombre' en 'chaîne' Ozero.mq4 49 117
0 erreur(s), 2 avertissement(s) 1 3


L'onglet "résultats" montre que des ordres sont ouverts et fermés.

1 2014.08.25 00:00 acheter 1 0.10 1.6550 0.0000 0.0000 0.00 10000.00
2 2014.08.25 06:30 fermer 1 0.10 1.6562 0.0000 0.0000 0.12 10000.12
3 2014.08.25 06:31 acheter 2 0.10 1.6564 0.0000 0.0000 0.00 10000.12
4 2014.08.25 10:00 fermer 2 0.10 1.6574 0.0000 0.0000 0.10 10000.22
5 2014.08.25 10:00 acheter 3 0.10 1.6576 0.0000 0.0000 0.00 10000.22
6 2014.08.25 12:58 fermer 3 0.10 1.6586 0.0000 0.0000 0.10 10000.32
7 2014.08.25 12:58 acheter 4 0.10 1.6590 0.0000 0.0000 0.00 10000.32
8 2014.08.26 13:13 fermer au stop 4 0.10 1.6576 0.0000 0.0000 -0.14 10000.18


8 - J'ai interrompu le travail en fermant le testeur.


Ensuite, nous examinons le "Journal" :

2014.10.31 07:46:44.837 GBPUSD,M15 : 4453 tick events (5608 bars, 340128 bar states) traités en 312876 ms (temps total 324436 ms)
2014.10.31 07:46:44.837 2014.08.26 13:13 Testeur : l'ordre n°4 est clos
2014.10.31 07:46:44.798 2014.08.26 13:13 Visual tester arrêté
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15 : ORDER OPEN 4
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15 : ouvert #4 acheter 0.10 GBPUSD à 1.6590 ok
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15 : Open #4 acheter 0.10 GBPUSD à 1.6590 ok
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15 : Je ne pense pas qu'il ait fermé. Nous y voilà : 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15 : Erreur OrderClose 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15 : ticket 3 inconnu pour la fonction OrderClose
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15 : clôture #3 achat 0.10 GBPUSD à 1.6576 au prix 1.6586
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15 : HOLD OPEN #3
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15 : ouvert #3 acheter 0.10 GBPUSD à 1.6576 ok
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15 : Ouvrir la position #1
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15 : Quoi de neuf ? Nous y voilà : 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15 : Erreur OrderClose 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15 : ticket 2 inconnu pour la fonction OrderClose
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15 : close #2 acheter 0.10 GBPUSD à 1.6564 au prix 1.6574
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15 : HOLD OPEN 2
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15 : open #2 buy 0.10 GBPUSD at 1.6564 ok
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15 : Ouverture de la première position
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15 : Quoi de neuf ? Nous y voilà : 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15 : Erreur OrderClose 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15 : ticket 1 inconnu pour la fonction OrderClose
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15 : clôture #1 achat 0.10 GBPUSD à 1.6550 au prix 1.6562
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15 : ORDER OPEN 1
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15 : ouvert #1 acheter 0.10 GBPUSD à 1.6550 ok
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15 : ouvert #1 acheter 0.10 GBPUSD à 1.6550 ok
2014.10.31 07:41:31.958 Entrées Ozero : gLot=0.1 ; gPoint=0.001 ;

Maintenant, je suis complètement perdu. D'une part, les ordres sont fermés comme vous pouvez le voir sur le graphique et dans les résultats, d'autre part, le code est exécuté avec des erreurs comme vous pouvez le voir dans le journal : (((((((((((.

Ozero.

 
Vous essayez de fermer le même ordre deux fois. Enlevez celui du haut.
 
Roger:
Vous essayez de fermer le même ordre deux fois. Enlevez celui du haut.
De préférence, celle du bas. L'ordre doit être sélectionné au préalable.
 
            
//ResetLastError();
//if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

Bonjour.

Suppression de deux lignes. Tout fonctionne. Et tout s'affiche correctement sur le graphique, dans les résultats et dans les journaux.

Question : lors de la compilation, il donne


"Ozero".mq4'Ozero.mq4 1 1
La valeur de retour de 'OrderClose' doit être vérifiée Ozero.mq4 46 13
0 erreur(s), 1 avertissement(s) 1 2



De quoi le compilateur me met-il en garde ? La 46ème ligne est OrderClose(OrderTicket(),OrderLots(),_Bid,15) ;


Ozero.

 
tuner:

Pouvez-vous me dire ce qui pourrait causer le problème qui s'est produit aujourd'hui ?

L'EA a une option pour arrêter les transactions 15 minutes avant la fermeture du marché le vendredi.

Quand un nouveau jour apparaît, l'EA vérifie si c'est vendredi, alors aujourd'hui nous arrêtons le trading dans StringToTime("23:59")-15*60

Dans le testeur de stratégie, cette fonction fonctionne correctement. Cependant, dans le trading réel, je vois une situation totalement différente - le conseiller expert arrête le trading au premier tick lorsque le vendredi arrive.

Voici les impressions du journal d'Expert Advisor :

Courtier n°1, démo :

0 05:59:47.731 Scalper GBPAUDpt,M1 : Fin dans le vendredi = 2014.10.23 23:44:00

Courtier 2, réel :

0 03:00:11.999 Scalper EURUSD,M1 : Fin dans le vendredi = 2014.10.23 23:44:00

C'est-à-dire que lorsque la barre quotidienne d'aujourd'hui apparaît (vendredi 24 octobre) sur le premier tick, l'EA

convertira la ligne "23:59" en heure d'hier, au lieu de lui attribuer le jour d'aujourd'hui.

Toutefois, si le conseiller expert est redémarré le vendredi en milieu de journée, il déterminera correctement l'heure d'achèvement.

J'ai trouvé la raison de ce problème : https://forum.mql4.com/33023.

Comme prévu, il s'agit pratiquement d'un bug dans la fonction StringToTime. Tous les symptômes sont similaires. Cette fonction convertit la chaîne "23:59" en date avec la date du PC local mais pas avec la date de MT4. Et dans le testeur, comme nous le savons, la date du PC local est émulée et assimilée à l'heure du terminal. C'est pourquoi tout fonctionne correctement dans le testeur, mais la démo/le temps réel entraîne des problèmes et des pertes. Bien sûr, la documentation ne dit pas d'où vient la date et le lien ci-dessus montre que ce problème a été signalé il y a 4 ans, mais apparemment les methaquotes s'en moquent.

 
      RefreshRates();                     // Обновим данные
      _Bid=MarketInfo( "GBPUSD",MODE_BID);

      if (_Bid>=gPoint1)
        {
           for(pos=OrdersTotal();pos>=0;pos--)
             {
                OrderClose(OrderTicket()-1,OrderLots(),_Bid,15);
             }      
       
        }

Une autre question. Est-ce que je comprends bien que :

1. la numérotation des commandes commence à partir de "0".

2. ce code fermera absolument tous les ordres, que je les ouvre manuellement ou par programme ? C'est-à-dire que nous ne trouverons jamais un ordre que cette partie du programme ne peut pas fermer ?


Ozero.

 

Quelqu'un a-t-il fait défiler du texte à l'écran ? Par exemple - la commande d'untel ouverte/fermée/modifiée, etc... Des nouvelles d'untel ou d'untel... ?

Si vous le voulez bien, montrez-moi un bout de code.

Merci !

 
Vinin:
Celle du bas est meilleure. L'ordre doit être choisi au préalable.

C'est mieux comme ça :

//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                         http://bomzh_inc.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Bomzh Inc"
#property link      "http://bomzh_inc.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
input double gLot=0.1;           // Размер лота для покупки 
input double gPoint=0.001;       // Дельта для закрытия 
input string symbol="GBPUSD";    // Рабочая валютная пара
void OnTick() {
   // Открытие позиции
   if(OrdersTotal()==0) {
      int ticket=0;
      double _Ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
      Print(" Открытие первой позиции ");
      ticket=OrderSend(symbol,OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0) Print("ОТКРЫТ ОРДЕР #"+IntegerToString(ticket));
      }
   //--- Закрытие позиций
   double _Bid=SymbolInfoDouble(symbol,SYMBOL_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--) {
      if(OrderSelect(pos,SELECT_BY_POS)) {
         if(OrderSymbol()!=symbol) continue;
         if(OrderType()!=OP_BUY)   continue;
         if(OrderOpenPrice()+gPoint<_Bid) {
            ResetLastError();
            if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) 
               Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+IntegerToString(GetLastError()));
            }
         }
      }
   //--- End OnTick()
}
//+------------------------------------------------------------------+
 
_new-rena:

Quelqu'un a-t-il fait défiler du texte à l'écran ? Par exemple - la commande d'untel ouverte/fermée/modifiée, etc... Des nouvelles d'untel ou d'untel... ?

Si vous le voulez bien, montrez-moi un bout de code.

Senx !

Je faisais un défilement vertical dans une fenêtre d' indicateur vide. Voici la fonction :

//+------------------------------------------------------------------+
// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журнал
void iPrint(string mess1, int sz=9, color color1=clrDarkGray, 
            string mess2="", color color2=clrDarkGray, 
            string mess3="", color color3=clrDarkGray, 
            string mess4="", color color4=clrDarkGray, 
            bool draws=true) {
   string   NameGrafText, message, nm;
   int      i, y, k, shift, Win_Num=-1, num=0;
   color    cl;
   Win_Num=WindowFind("Win_Inform");
   if (mess1=="") {
      //Print("Func iPrint: Передана пустая строка, выходим");
      return;
      }
   if (!draws || Win_Num<0) {
      message=mess1+mess2+mess3+mess4;
      Print(message); 
      return;
      }
   k=ArraySize(Mass_Name_Message)-1;
   if (StringLen(mess1)>0) num++;
   if (StringLen(mess2)>0) num++;
   if (StringLen(mess3)>0) num++;
   if (StringLen(mess4)>0) num++;
// Смещение и перекрашивание старых сообщений   
   for (i=k; i>=0; i--) {                             
      NameGrafText=Mass_Name_Message[i];           
      if (StringLen(NameGrafText)>0) {
         if (ObjectFind(NameGrafText)==Win_Num) {
            if (i+num>k) {                   // Удаляем самую верхнюю строчку
               ObjectDelete(NameGrafText);  
               Mass_Name_Message[i]="";
               }
            else if (i+num<=k) {             // Сдвигаем и перекрашиваем старые сообщения
               Mass_Name_Message[i+num]=Mass_Name_Message[i];
               y=(int)ObjectGet(NameGrafText, OBJPROP_YDISTANCE);          // старая координата Y
               ObjectSet  (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // новая координата Y
               ObjectSet  (NameGrafText, OBJPROP_COLOR, clrDimGray);       // новый цвет
               }
            }
         }
      }
// Вывод новых сообщений
   shift=num;
   uint v=GetTickCount();
   for (i=0; i<num; i++) {
      shift--;
      NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v);   // Уникальное имя объекта
      int app=0;
      while (ObjectFind(NameGrafText)==Win_Num) {  // Если всё-таки такой объект есть
         app++;
         NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v)+"_"+IntegerToString(app); // добавим к его имени "хвостик"
         }
      Mass_Name_Message[num-1-i]=NameGrafText;
      switch (i) {
         case 0: message=mess1; cl=color1; break;
         case 1: message=mess2; cl=color2; break;
         case 2: message=mess3; cl=color3; break;
         case 3: message=mess4; cl=color4; break;
         default:message=mess1; cl=color1; break;
         }
      ObjectCreate (NameGrafText, OBJ_LABEL, Win_Num, 0, 0);
      ObjectSetText(NameGrafText, message, sz, "Courier New", cl);
      ObjectSet    (NameGrafText, OBJPROP_COLOR, cl);                   // цвет
      ObjectSet    (NameGrafText, OBJPROP_CORNER,    2);                // угол
      ObjectSet    (NameGrafText, OBJPROP_XDISTANCE, 150);              // координата Х
      ObjectSet    (NameGrafText, OBJPROP_YDISTANCE, 2+(sz+1)*shift);   // координата Y
      WindowRedraw();
      }
}
//+------------------------------------------------------------------+

Exemple d'utilisation d'un message en une seule couleur (vous pouvez avoir 4 couleurs sur une ligne pour différents mots) :

if(get.BarOpenLastPos(sy,PERIOD_H4,OP_SELL,mn)!=0) {
   string mess1="На D1 вниз, на H4 ниже SAR, M15 сигнал. Продаём";
   iPrint(mess1,9,clrBlue);
   trade.OpenS(sy,lots,mn,0.0,0.0,co);
   }

Il doit y avoir un indicateur vide nommé Win_Inform sur le graphique.