[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 65

 

Roll, merci pour le conseil, voici une fonctionnalité pour afficher un commentaire dans le coin inférieur gauche du graphique si quelqu'un en a besoin :

void mycomment(color c,string mytext)
{
string name="mycomment";
if(ObjectFind(name)<0) ObjectCreate(name,OBJ_LABEL,0,0,0);
ObjectSet("mycomment", OBJPROP_CORNER, 2);
ObjectSet(name,OBJPROP_XDISTANCE,5);
ObjectSet(name,OBJPROP_YDISTANCE,7);
ObjectSetText(name,mytext,12,"",c);
}

 
Pouvez-vous me dire comment rouvrir un fichier en un seul script : ouvrir le fichier - regarder jusqu'à la fin - fermer le fichier, lorsque l'on essaie de le rouvrir il est dit "fin du fichier" ...
 
Bonjour, Pouvez-vous m'indiquer si quelqu'un a rencontré le problème suivant : Dans la fenêtre du graphique des devises, il arrive que le graphique lui-même disparaisse, puis il est indiqué de le rafraîchir et tout est restauré. À ce moment-là, il arrive que les conseillers experts commencent à fonctionner de manière incorrecte (ouverture de transactions sans conditions). Aujourd'hui, j'ai même ouvert une transaction avec le lot maximum. Je l'ai remarqué et j'ai fermé avec une perte de 2,5 points. Voici le code pour déterminer le lot. Je pense que cela ne devrait pas être le cas. Je soupçonne que c'est à cause des deux dernières lignes. Mais comment ?
//========================================================================                                                                              
//определение лота
//========================================================================

double Free =AccountFreeMargin();
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
LOT=NormalizeDouble(AccountFreeMargin()*RISK/100000,2);
if (LOT*One_Lot > Free) // Не хватает даже..
     {                                         // ..на минимальн. лот:(
         Comment("денег нет  " );  
            return(0);                           // ..и выход 
     }
     else Comment("деньга есть  " );
if(LOT<Min_Lot)
 LOT=Min_Lot;
if(LOT>Max_Lot)
 LOT=Max_Lot;
далее открытие ордера по условиям.
 
Lians:

Bonjour à tous !

Pouvez-vous me dire s'il est possible d'afficher du texte sur un graphique, comme par exemple

comme une fonction séparée pour qu'elle puisse être appelée comme ceci :

Regardez cette fonction :

//+----------------------------------------------------------------------------+
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, LightSeaGreen);    // цвет
            }
         }
      }
   shift=num;
   int v=GetTickCount();
   for (i=0; i<num; i++) {
      shift--;
      NameGrafText=Prefix+"_Graf_Text_"+i+"_"+sy+"_"+v;
      int app=0;
      while (ObjectFind(NameGrafText)==Win_Num) {
         app++;
         NameGrafText=Prefix+"_Graf_Text_"+i+"_"+sy+"_"+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();
      }
   return;
}
//+----------------------------------------------------------------------------+

Il recherche la fenêtre vide de l'indicateur Win_Inform sur le graphique et, si elle est présente, affiche des messages dans celle-ci. Si ce n'est pas le cas, il faut l'éditer avec print.

Exemple d'appel :

//-------------------------------------------------------
   message1=StringConcatenate("Тик: ",GetTickCount()," ");
   message2=StringConcatenate("Цена Bid: ", DoubleToStr(Bid,dg));
   iPrint(false, message1, message2, "", "", 9, Aqua, DarkOrange);
   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);
   
   message1=StringConcatenate("Время: ", TimeToStr(TimeCurrent())," ");
   message2=StringConcatenate("Тик: ",GetTickCount()," ");
   message3=StringConcatenate("Время бара: ",TimeToStr(Time[0])," ");
   message4=StringConcatenate("Цена Bid: ", DoubleToStr(Bid,dg));
   iPrint(false, message1, message2, message3, message4, 9, Aqua, Aqua, Aqua, DarkOrange);
//-------------------------------------------------------

Utilise le tableau de chaînes Mass_Name_Message[10] déclaré au niveau global. Il s'agit d'un tableau permettant de stocker les noms d'objets. Vous pouvez modifier sa taille en fonction de vos besoins. La variable Prefix stocke les noms des experts afin de leur permettre d'identifier leurs propres objets pour une manipulation correcte des objets graphiques. Il est également déclaré globalement et possède le type chaîne de caractères. Vous pouvez probablement le découvrir...

La dinde dans une remorque

Dossiers :
 

Confronté à un petit problème avec ma fonction :

void mycomment(color c,string mytext)
{
string name="mycomment";
if(ObjectFind(name)<0) ObjectCreate(name,OBJ_LABEL,0,0,0);
ObjectSet("mycomment", OBJPROP_CORNER, 2);
ObjectSet(name,OBJPROP_XDISTANCE,5);
ObjectSet(name,OBJPROP_YDISTANCE,7);
ObjectSetText(name,mytext,12,"",c);
}

Il coupe un long message, par exemple si vous essayez de commenter la ligne "Vérifiez les paramètres de votre EA, pour ouvrir la fenêtre des paramètres, appuyez sur F7".

ça laisse juste ça : "Vérifiez les paramètres de votre EA pour ouvrir la fenêtre des paramètres", puis elle est coupée, alors que le texte n'est même pas à la moitié de la fenêtre.

Pouvez-vous me dire s'il existe un moyen de supprimer cette restriction ?

 

Vous ne pouvez pas, la longueur maximale de la ligne dans l'étiquette = 62 caractères.

Formatez le texte en plusieurs lignes (étiquettes), ou utilisez la fonction Commentaire() - il y a 255 caractères.

 
Bonjour !
J'ai rencontré un problème lors de l'ouverture d'un certain nombre(défini par l'utilisateur) de commandes.
J'ai écrit un petit code pour résoudre ce problème.
Mais il arrive qu'un nombre arbitraire d'ordres soit ouvert, généralement vers la fin du test.

Voici le code lui-même.

extern string Kolichestvo_orderov = "Количество единовременно открытых ордеров";
extern int OrederBuy = 1;
extern int OrederSell = 1;


int OrdS=1,OrdB=1,ticketBuy,ticketSell,lastticketSell=0,lastticketBuy=0;

//========================================================================================================//     
                                  //---- Открытие ордеров SELL ----//
//========================================================================================================//

if(OrdS<=OrederSell)
  { //----- start
 
if(trendDn==true && SthFast>88.2 && SthSlow<38.2)
     {
ticketSell=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,0,magick,0,Blue);OrdS++; //--- Если ордер открыт параметр OrdS увеличиваю 
     }
   } //-----end
          
//========================================================================================================//  
                                   //----Открытие ордеров BUY ----//
//========================================================================================================//  

if(OrdB<=OrederBuy)
  { //-----start

if(trendUp==true && SthFast<11.8 && SthSlow>61.8)
      {
ticketBuy=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,0,magick,0,Red);OrdB++; //--- Если ордер открыт параметр OrdB увеличиваю
      }

  } //------end
  

//------------------------------- Подсчет количества ордеров BUY & SELL ----------------------------------//
   
  if(ticketBuy<=OrdersHistoryTotal()) //------ проверка тикетов тех  ордеров которые уже закрыты
   {
  for(int ordBuy=lastticketBuy;ordBuy<=OrdersHistoryTotal();ordBuy++) //--- перебор новых закрытых ордеров
    {
     if(OrderSelect(ordBuy,SELECT_BY_POS,MODE_HISTORY)==true){if(OrderType()==OP_BUY)OrdB--;lastticketBuy=ticketBuy;} //--- если добавился новый закрытый ордер бай, то параметр OrdB уменьшаю
    }
   }
  
  //-----
    
 if(ticketSell<=OrdersHistoryTotal()) //------ проверка тикетов тех  ордеров которые уже закрыты
  {
 for(int ordSell=lastticketSell;ordSell<=OrdersHistoryTotal();ordSell++) //--- перебор новых закрытых ордеров
     {
     if(OrderSelect(ordSell,SELECT_BY_POS,MODE_HISTORY)==true){if(OrderType()==OP_SELL)OrdS--;lastticketSell=ticketSell;} //--- если добавился новый закрытый ордер селл, то параметр OrdS уменьшаю

Si vous avez une solution plus simple, je serais heureux de recevoir des commentaires.

 
Lians:

Confronté à un petit problème avec ma fonction :

void mycomment(color c,string mytext)
{
string name="mycomment";
if(ObjectFind(name)<0) ObjectCreate(name,OBJ_LABEL,0,0,0);
ObjectSet("mycomment", OBJPROP_CORNER, 2);
ObjectSet(name,OBJPROP_XDISTANCE,5);
ObjectSet(name,OBJPROP_YDISTANCE,7);
ObjectSetText(name,mytext,12,"",c);
}

Il coupe un long message, par exemple si vous essayez de commenter la ligne "Vérifiez les paramètres de votre EA, pour ouvrir la fenêtre des paramètres, appuyez sur F7".

ça laisse juste ça : "Vérifiez les paramètres de votre EA pour ouvrir la fenêtre des paramètres", puis elle est coupée, alors que le texte n'est même pas à la moitié de la fenêtre.

Pouvez-vous me dire s'il existe un moyen de supprimer cette restriction ?

Essayez ma fonction. Il se trouve au-dessus de votre message sur cette page. Divise une chaîne de caractères en plusieurs chaînes de manière à ce que chacune d'entre elles ne compte pas plus de 64 caractères. Ma fonction produit ces lignes fractionnées l'une au-dessus de l'autre. Ensuite, lorsque le message suivant s'affiche, il met en niveaux de gris les anciens messages ci-dessus et affiche le nouveau message dans la couleur que vous avez définie lorsque vous avez appelé ma fonction.
 
J'ai téléchargé l'historique et j'ai découvert par hasard que j'ai un trou dans USDJPY de 2012.01.16 à 2012.03.20. Quand j'ai essayé de le retélécharger, le terminal m'a répondu que j'avais tout l'historique.
Comment puis-je combler cette lacune ?
Comment puis-je télécharger l'historique sans aucun trou ?
Et y a-t-il un moyen de vérifier s'il y a un trou dans l'histoire ?
 
artmedia70:
Essayez ma fonction. Il se trouve au-dessus de votre message sur cette page. Divise une chaîne de caractères en plusieurs chaînes de manière à ce que chacune d'entre elles ne compte pas plus de 64 caractères. Ma fonction produit ces lignes fractionnées l'une au-dessus de l'autre. Ensuite, lorsque le message suivant s'affiche, il met en gris les anciens messages et affiche le nouveau message dans la couleur que vous avez définie lorsque vous avez appelé ma fonction.
Merci, mais c'est un peu compliqué pour moi, et votre fonction sort 4 messages à la fois, alors que j'ai besoin d'un seul. Il s'avère que pas plus de 64 caractères dans une ligne ?