Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 500

 
Konstantin Seredkin:

Je donnais juste un exemple, il y a beaucoup d'autres algorithmes qu'il serait bon d'avoir sur ce bouton, le spread s'est élargi, le bouton a été pressé, un message texte est arrivé sur mon téléphone disant que le robot est arrêté ou qu'il y a 4 robots qui tradent sur le compte, le 5ème contrôle la marge du compte, quand la marge tombe à la valeur fixée, nous coupons l'auto-trading et tous les robots sont nuls jusqu'à ce que je vienne voir ce qui et où va dans un drawdown.Mais la suppression d'un robot du tableau est un canon contre un lapin... Le bouton est une solution complexe qui permet de tuer tous les robots par un algorithme prédéterminé.

J'ai vu une solution pour mql5 quelque part, mais je ne la trouve pas.

C'est ce que j'ai dit - c'est une solution radicale. La bonne solution consiste à modifier le code du conseiller expert afin que, dans certaines circonstances, il n'exécute pas les actions de trading et tout ce qui y est lié. Par exemple, le contrôle de la propagation est élémentaire :

void OnTick()
{
    double fPoint = Point();
    if (fPoint <= 0.0)
      return;

    int nSpread = int(MathRound((Ask - Bid) / fPoint));
    if (nSpread > 50)
      return;

   ... Действия советника при нормальном спреде
}
 

Eh bien, le bouton AutoTrade peut être pressé/dépressé en émulant Ctrl+E. Mais, comme je l'ai dit, c'est avec l'aide de WinAPI :

#include <WinUser32.mqh>

#define  VK_CONTROL 0x11 
#define  KEY_CODE   'E'


void PressOrReleaseAutotrade()
{
   keybd_event(VK_CONTROL, 0, 0, 0);
   keybd_event(KEY_CODE, 0, 0, 0);
   keybd_event(KEY_CODE, 0, 2, 0);
   keybd_event(VK_CONTROL, 0, 2, 0);   
}
 
Ihor Herasko:

Eh bien, le bouton AutoTrade peut être pressé/dépressé en émulant Ctrl+E. Mais, comme je l'ai dit, cela utilise déjà WinAPI :

Merci ! Et comment rendre triste un visage souriant ?)

 
Ihor Herasko:

Eh bien, le bouton AutoTrade peut être pressé/dépressé en émulant Ctrl+E. Mais, comme je l'ai dit, c'est avec WinAPI :

Exactement, et je pensais que c'était une méthode douloureusement simple et j'ai complètement oublié cette bibliothèque. Merci, maintenant nous pouvons faire ce que nous voulons

 

J'ai créé un script MQL4 (code ci-dessous) qui dessine des rectangles (image ci-dessous), mais voici le problème. Pour la ligne pointillée STYLE_DOT, seule la largeur 1 fonctionne, et avec 2 ou plus, une ligne solide est dessinée. Pouvez-vous me dire où se trouve mon erreur ou est-ce qu'on nous cache quelque chose ?

#property strict
void OnStart()
  {
//---
   RectCreate("rect1",Time[1],Low[1],Time[10],High[10],clrYellow,STYLE_DOT,  1,  false);
   RectCreate("rect2",Time[11],Low[11],Time[20],High[20],clrRed, STYLE_DOT,  2,  false);
//---
   Sleep(20*1000);
   ObjectsDeleteAll(0);
  }
//--- Function creates rectangle
void RectCreate(const string           f_name,     // rectangle name
                datetime               f_time1,    // first point time
                double                 f_price1,   // first point price
                datetime               f_time2,    // second point time
                double                 f_price2,   // second point price
                const color            f_color,    // rectangle color
                const ENUM_LINE_STYLE  f_style,    // style of rectangle lines
                const int              f_width,    // width of rectangle lines
                const bool             f_fill)     // filling rectangle with color

  {
   if(ObjectCreate(0,f_name,OBJ_RECTANGLE,0,f_time1,f_price1,f_time2,f_price2))
     {
      ObjectSetInteger(0,f_name,OBJPROP_COLOR,f_color);
      ObjectSetInteger(0,f_name,OBJPROP_STYLE,f_style);
      ObjectSetInteger(0,f_name,OBJPROP_WIDTH,f_width);
      ObjectSetInteger(0,f_name,OBJPROP_FILL,f_fill);
      ObjectSetInteger(0,f_name,OBJPROP_BACK,false);
      ObjectSetInteger(0,f_name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,f_name,OBJPROP_SELECTED,false);
     }
  }

 
Maxim Khrolenko:

J'ai créé un script MQL4 (code ci-dessous) qui dessine des rectangles (image ci-dessous), mais voici le problème. Pour la ligne pointillée STYLE_DOT, seule la largeur 1 fonctionne, et avec 2 ou plus, une ligne solide est dessinée. Pouvez-vous me dire où se trouve mon erreur ou est-ce qu'on nous cache quelque chose ?

Et dessiner manuellement et changer le style et l'épaisseur essayés ? Et quelle conclusion peut-on tirer de ces expériences ?
 
Artyom Trishkin:
Avez-vous essayé de dessiner manuellement et de modifier le style et l'épaisseur ? Et quelle conclusion peut-on tirer de ces expériences ?

Je crois que j'ai trouvé la réponse. Il est dit ici que "Style de ligne. Il n'est utilisé que lorsque l'épaisseur du trait est de 0 ou 1". Cela doit être la raison pour laquelle les lignes de largeur 2 et plus ne fonctionnent pas avec des lignes autres que solides.

 
Maxim Khrolenko:

Je crois que j'ai trouvé la réponse. Il est dit ici que "Style de ligne. Utilisé uniquement lorsque l'épaisseur du trait est de 0 ou 1". Cela doit être la raison pour laquelle les lignes autres que les lignes pleines ne fonctionnent pas avec une épaisseur de 2 ou plus.

Exactement. Je suis passé par là aussi.

 

Messieurs, veuillez me conseiller, j'ai pris une fonction de Kim qui retourne le numéro de la barre de la dernière position ouverte ou -1.

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot;
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime();
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, True));
  }

J'appelle cette fonction et j'écris une condition

if(Open[2]>Close[2] && Open[1]>Close[1] && Close[1]<Low[2])
     {

      Comment("цена входа = ",DoubleToStr(Low[2],Digits));
      if(NumberOfBarOpenLastPos("",0,-1,-1)!=0)//вызвал здесь

         ticket=OrderSend(Symbol(),OP_SELLLIMIT,0.1,Low[2],2,0,0,magic,0);
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

         TP=NormalizeDouble(OrderOpenPrice()-tp*Point,Digits);
      SL=NormalizeDouble(OrderOpenPrice()+sl*Point,Digits);
      modify=OrderModify(ticket,OrderOpenPrice(),SL,TP,0);
      }

J'ai regardé dans Print et je vois que cette fonction renvoie -1, au début je pensais qu'il n'y avait pas d'ordre mais après un moment l'ordre est réapparu et sur la même barre une transaction a été ouverte après le stop.

 
Bon après-midi. Savez-vous s'il est possible dans MT4 et MT5 de superposer les graphiques d'un instrument avec différents TF, ainsi que les indicateurs pour ces TF ? Par exemple, je veux afficher dans une fenêtre 3 graphiques de la paire EUR/USD avec des TFs : jour, 4h et heure, et également superposer les indicateurs glissants de ces TFs. Est-ce possible ? Je me réjouis de toute aide.
Raison: