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

 
hoz:



 double lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
        lastOrderOpenTime = -1;                     // Время открытия последнего ордера
Qu'est-ce que c'est ?

Type, int ou date
 
artmedia70:
Une fois, j'ai créé une fonction qui envoie des messages à une fenêtre d'indicateur vide. Vous pouvez ajuster les couleurs des lignes affichées. C'est déjà débogué. Si vous en avez besoin, je peux le partager.


Je regarderai volontiers votre code, Artem. Pour tester l'impression, ce n'est pas l'option la plus pratique...
 

r772ra:

 double lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
        lastOrderOpenTime = -1;                     // Время открытия последнего ордера

Qu'est-ce que c'est ?


Type, int ou date

J'ai réécrit tout le bazar et c'est ressorti comme ça :

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
datetime GetLastOrderState()
{
   datetime lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
            lastOrderOpenTime = -1;                     // Время открытия последнего ордера
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
  
      if (lastOrderOpenTime < OrderOpenTime())
      {
          lastOrderOpenTime = OrderOpenTime();
          lastOrderCloseTime = OrderCloseTime();
      }
   }
   Comment("Время закрытия последнего открытого ордера = ", lastOrderCloseTime);
   return (lastOrderCloseTime);
}

Pour une raison quelconque, même lorsque les commandes sont fermées, l'heure de clôture de la dernière commande ne devrait pas être nulle.

On l'a tout le temps dans les commentaires :

Время закрытия последнего открытого ордера = 0

C'est pourquoi mon code ne fonctionne pas plus loin, car cette fonction ne fonctionne pas.

 
hoz:

Alors j'ai réécrit tout le bazar et ça a donné ça :

Pour une raison quelconque, même lorsque les ordres sont fermés, l'heure de clôture du dernier ordre ne devrait pas être nulle.

J'étais capable de l'avoir dans mon commentaire tout le temps :

C'est pourquoi rien ne fonctionne selon mon code, car cette fonction ne me laisse pas entrer.

Cet EA prend en compte les ordres en attente dans votre code. Eh bien, il va regarder les ordres ouverts en conséquence. Naturellement, le temps de fermeture sera de zéro.

Si vous voulez voir les ordres fermés, vous devez les afficher dans la liste des ordres fermés :

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

и

if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;

Mais... nous devons créer deux fonctions - l'une recherche les ordres ouverts et l'autre les ordres fermés.

 
artmedia70:

Il prend également en compte vos ordres en attente. Et en conséquence, il examine les ordres ouverts. Naturellement, le temps de fermeture sera de zéro.

Si vous voulez voir les ordres fermés, vous devez les voir dans la liste des ordres fermés :

и

Mais... nous devons créer deux fonctions - l'une recherche les ordres ouverts et l'autre les ordres fermés.


Merci, Artyom. Exactement... La suite est une question d'optimisation du code. Il y a des questions sur la structure du code, mais il faudra l'écrire sur une tête fraîche.
 
hoz:

Je regarderai volontiers votre code, Artem. Pour tester l'impression, ce n'est pas la variante la plus pratique...

Voici un EA pour tester la fonction. Il contient la fonction elle-même et son appel. Avant de l'appeler, vous devez préparer un message, qui peut comporter jusqu'à quatre lignes. La longueur de chaque ligne, si je me souviens bien, ne doit pas dépasser 64 caractères. C'est pourquoi j'ai divisé un message en plusieurs lignes. Chaque ligne d'un message peut être éditée dans une couleur différente. C'est assez clair dans le code : nous préparons d'abord les lignes de messages, puis nous appelons la fonction. Je ne l'ai pas beaucoup commenté - je l'ai écrit d'une traite il y a longtemps. Maintenant, j'ai déjà oublié à quoi ça sert. Si j'ai des questions, je m'en souviendrai, mais je ne me souviens que des choses nécessaires maintenant.

//+------------------------------------------------------------------+
//|                                                Test iPrint().mq4 |
//|                             Copyright © 2013, Artyom A. Trishkin |
//|                                                skype: artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013, Artyom A. Trishkin"
#property link      "skype: artmedia70"
//+------------------------------------------------------------------+
//| expert variables                                                 |
//+------------------------------------------------------------------+
int            a,b,c;
string         Exp_Name, Prefix, pref,
               message1, message2, message3, message4, 
               Mass_Name_Message[10];
//+----------------------------------------------------------------------------+
int init() {
   Exp_Name=WindowExpertName(); 
   pref="_r";
   if (IsDemo()) pref="_d";
   if (IsTesting()) pref="_t";
   if (IsVisualMode()) pref="_v";
   Prefix=Exp_Name+"_"+Symbol()+pref;  
//----------------------------
   return;                                         // Выход из init() 
}
//+----------------------------------------------------------------------------+
int deinit() {
   if (!IsTesting()) {
      Comment("");
// -------- Блок удаления всех объектов, построенных на графике --------
      string Name_Del[1]; 
      int Quant_Del=0;                    
      int Quant_Objects=ObjectsTotal();   
      int LenPref=StringLen(Prefix);
      ArrayResize(Name_Del,Quant_Objects);
      for(int k=0; k<Quant_Objects; k++) {
         string Obj_Name=ObjectName(k);   
         string Head=StringSubstr(Obj_Name,0,LenPref);
         if (Head==Prefix) {                              
            Quant_Del+=1;        
            Name_Del[Quant_Del-1]=Obj_Name;
            }
        }
      for(int i=0; i<Quant_Del; i++)    
         ObjectDelete(Name_Del[i]); 
// ----- Конец блока удаления всех объектов, построенных на графике -----
      }
   return;                                // Выход из deinit()
}
//+----------------------------------------------------------------------------+
int start()
  {
//-------------------------------------------------------
// Подготавливаем первое сообщение
   message1=StringConcatenate("Первое сообщение из двух строк: Тик: ",GetTickCount()," ");
   message2=StringConcatenate("Цена Bid: ", DoubleToStr(Bid,Digits));
   iPrint(false, message1, message2, "", "", 9, Aqua, DarkOrange);   // Выводим первое
   Sleep(3000);
//-------------------------------------------------------
// Подготавливаем второе сообщение
   b=4; c=7;
   a=b+c;
   message1=StringConcatenate("Второе сообщение из трёх строк: a=",a," ");
   message2=StringConcatenate("b=",b," ");
   message3=StringConcatenate("c=",c);
   iPrint(false, message1, message2, message3, "", 9, Aqua, LimeGreen, DarkOrange); // Выводим второе
   Sleep(3000);
//-------------------------------------------------------
// Подготавливаем третье сообщение
   message1=StringConcatenate("Третье сообщение из четырёх строк: Время: ", TimeToStr(TimeCurrent())," ");
   message2=StringConcatenate("Тик: ",GetTickCount()," ");
   message3=StringConcatenate("Время бара: ",TimeToStr(Time[0])," ");
   message4=StringConcatenate("Цена Bid: ", DoubleToStr(Bid,Digits));
   iPrint(false, message1, message2, message3, message4, 9, Aqua, Aqua, Aqua, DarkOrange);// Выводим третье
   Sleep(3000);
//-------------------------------------------------------
   return(0);
  }
//+----------------------------------------------------------------------------+
// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журнал
void iPrint(bool print, string mess1, string mess2="", string mess3="", string mess4="", 
            int sz=9, color cl1=Aqua, color cl2=Aqua, color cl3=Aqua, color cl4=Aqua) {
   string   NameGrafText, message, nm;
   int      i, y, k, LenStr, shift, Win_Num=-1, num=0;
   color    cl;
   if (mess1=="") {
      Print("Func iPrint: Передана пустая строка, выходим");
      return;
      }
   Win_Num=WindowFind("Win_Inform");
   if (print || 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=ObjectGet(NameGrafText, OBJPROP_YDISTANCE);               // координата Y
            ObjectSet  (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // координата Y
            ObjectSet  (NameGrafText, OBJPROP_COLOR, DimGray);          // цвет
            }
         }
      }
   shift=num;
   int v=GetTickCount();
   for (i=0; i<num; i++) {
      shift--;
      NameGrafText=Prefix+"_Graf_Text_"+i+"_"+Symbol()+"_"+v;  // Уникальное имя объекта
      int app=0;
      while (ObjectFind(NameGrafText)==Win_Num) {
         app++;
         NameGrafText=Prefix+"_Graf_Text_"+i+"_"+Symbol()+"_"+v+"_"+app;
         }
      Mass_Name_Message[num-1-i]=NameGrafText;
      switch (i) {
         case 0: message=mess1; cl=cl1; break;
         case 1: message=mess2; cl=cl2; break;
         case 2: message=mess3; cl=cl3; break;
         case 3: message=mess4; cl=cl4; break;
         default:message=mess1; cl=cl1; 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();
      }
//---------------------------------      
   nm=Prefix+"_Balance_txt";
   message="Баланс :";
   cl=Yellow;
   SetText(message, cl, nm, 2, 4, 20, "Arial", 9, Win_Num);
   nm=Prefix+"_Balance";
   message=DoubleToStr(AccountBalance(),2);
   cl=DarkTurquoise;
   SetText(message, cl, nm, 2, 70, 20, "Arial", 9, Win_Num);
//---------------------------------      
   nm=Prefix+"_Equity_txt";
   message="Средства :";
   cl=Yellow;
   SetText(message, cl, nm, 2, 4, 8, "Arial", 9, Win_Num);
   nm=Prefix+"_Equity";
   message=DoubleToStr(AccountEquity(),2);
   cl=DarkTurquoise;
   SetText(message, cl, nm, 2, 70, 8, "Arial", 9, Win_Num);
//---------------------------------      
}
//+----------------------------------------------------------------------------+
void SetText(string Text, color cl, string nm, int angle, int x, int y, string font, int sz=0, int wnd=0) {
   if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, wnd, 0, 0);
   ObjectSet(nm, OBJPROP_CORNER   , angle);
   ObjectSet(nm, OBJPROP_XDISTANCE, x);
   ObjectSet(nm, OBJPROP_YDISTANCE, y);
   ObjectSet(nm, OBJPROP_WIDTH    , sz);
   ObjectSetText(nm, Text, sz, font, cl);
   }
//+----------------------------------------------------------------------------+

Et une dinde :

//+------------------------------------------------------------------+
//|                                                   Win_Inform.mq4 |
//|                                Copyright © 2012, Artyom Trishkin |
//|                                                skype: artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, Artyom Trishkin"
#property link      "skype: artmedia70"

#property indicator_separate_window
int start()
  {
  }
//+------------------------------------------------------------------+

C'est comme ça... J'espère que vous trouverez la solution.

Bien sûr, vous pouvez faire un underlay au lieu de l'afficher sur le graphique principal, mais je suis trop paresseux pour le faire... :)

 
artmedia70:

Voici un EA pour tester la fonction. Il contient la fonction elle-même et son appel. Avant de l'appeler, vous devez préparer un message, qui peut comporter jusqu'à quatre lignes. La longueur de chaque ligne, si je me souviens bien, ne doit pas dépasser 64 caractères. C'est pourquoi j'ai divisé un message en plusieurs lignes. Chaque ligne d'un message peut être éditée dans une couleur différente. C'est assez clair dans le code : nous préparons d'abord les lignes de messages, puis nous appelons la fonction. Je ne l'ai pas beaucoup commenté - je l'ai écrit d'une traite il y a longtemps. Maintenant, j'ai déjà oublié à quoi ça sert. Si j'ai des questions, je m'en souviendrai, mais je ne me souviens que des choses nécessaires maintenant.

Et une dinde :

C'est comme ça... J'espère que vous trouverez la solution.

Bien sûr, vous pouvez faire un underlay au lieu de l'afficher sur le graphique principal, mais je suis trop paresseux pour le faire... :)


 

Des gens bien ! J'ai écrit un EA, tout semble fonctionner correctement dans la vie réelle. Mais je l'ai vérifié sur le testeur - il y a des problèmes. L'essentiel est le suivant. Le conseiller expert doit ouvrir les ordres par des lignes horizontales tracées sur le graphique. Dans le testeur, il les ouvre tout le temps à différents niveaux, comme si beaucoup de lignes avaient été posées, alors qu'il n'y en a pas ! Pouvez-vous expliquer ce qui ne va pas ?

Une partie du code responsable des lignes :

int New_gorizont()

{

int tip_o_buy ;

int tip_o_sell ;

int obj_ObjectsTotal() ;

// si aucune nouvelle ligne, sortie

if(obj_=0)

retour ;

// if(obj_Total(), return ; // s'il y en a...

si(obj_total!=0)

chaîne de caractères name=ObjectName(0) ;

double pr=NormalizeDouble(ObjectGet(name,1),Digits) ;

ObjectDelete(name) ; // supprimez et définissez à nouveau.

if(pr>Bid+(Stop_level+1)*Point) // déterminer le type d'ordre

{

tip_o_sell=OP_SELLLIMIT ;

tip_o_buy=OP_BUYSTOP ;

}

si(pr<Bid-(Stop_level+1)*Point)

{

tip_o_sell=OP_SELLSTOP ;

tip_o_buy=OP_BUYLIMIT ;

}

// fixer les commandes

OrderSend(Symb,tip_o_sell,Value,pr,3,pr+StopLoss*Point,pr-TakeProfit*Point, "Order set") ;

Prov_oshibok() ;

................................

}

En d'autres termes, l'objet_objet=0 et c'est tout. Mais il fixe et fixe tout à l'infini pour une raison quelconque.

 
Bonjour à tous.
Est-il normal que le journal ne montre pas qu'un ordre en attente s'est déclenché ? Cela se passe dans le testeur.
Le compte est réel.
 
Dozol:

Des gens bien ! J'ai écrit un EA, tout semble fonctionner correctement dans la vie réelle, tout est normal. Mais j'ai vérifié sur le testeur et il y a un problème.


Je ne le crois pas, cet EA ne peut fonctionner ni sur le site réel ni dans le testeur.