conseiller expert - questions diverses - page 21

 
Marco vd Heijden:

Ou vous pourriez démarrer un compteur une fois que le dragging a été détecté , il y a plusieurs façons de le faire...,

( J'ai juste " une "façon de le faire pour moi pour lemoment - celle de votre dernier commentaire )
M. Marco, vous avez sauvé ma journée, merci beaucoup.

Pas pour l'instant mais j'essaierai plus tard d'ajouter quelques fonctions supplémentaires à ces fonctions'SL et TP '. J'ai juste vraiment besoin de faire beaucoup de recherches à ce sujet avant de commencer à écrire un script pour cela.

Bonne chance à toi !

 

Si je me souviens bien, j'ai vu il y a longtemps un EA " Order Modifier " qui fonctionnait comme ça : il n'y avait pas de mises à jour pendant que je glissais, quand je " Drag OFF " glissait la ligne, après avoir glissé et ensuite les valeurs " Stop Loss and Take Profit " pouvaient changer une seule fois.
J'ai donc lu trois fois et plus votre dernier commentaire et j'ai également essayé de changer un peu plus que je pouvais arrêter les mises à jour pendant que je traîne.

Q : Est-ce que ce n'est pas possible, s'il vous plaît ?

Merci d'avance.

 

Tant que le drapeau booléen drag == 1, vous pouvez utiliser ce même drapeau pour désactiver les mises à jour.

Comme je l'ai dit, vous pouvez aussi lancer un compteur, en voici un exemple :

//+------------------------------------------------------------------+
//|                                                  Drag Hline2.mq4 |
//|      Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

double price;
bool drag;
int cnt=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
   ObjectCreate(0,"line",OBJ_HLINE,0,0,Ask);
   price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
     {
      drag=1;
     }

   if(drag==1)
     {
      cnt++;       // increase counter
        {
         if(cnt>=2)// if counter == 2 seconds
           {
            price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0); // store new value
            Print(" New price: ",DoubleToString(price));
            PlaySound("ok.wav");
            cnt=0;  // reset counter
            drag=0; // reset drag
           }
        }
     }
  }
//+------------------------------------------------------------------+

Ou simplement utiliser une boucle while, celle-ci fonctionne très bien :

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
    {
     PlaySound("ok.wav");
     price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
     Comment(price);
    }
  }
//+------------------------------------------------------------------+
Il s'agit simplement de dire que pendant que (je traîne) le prix est mis à jour jusqu'à ce qu'ils soient tous les deux égaux (quand j'arrête de traîner).
 
Marco vd Heijden:

Eh bien, tant que le drapeau booléen drag == 1, vous pouvez utiliser ce même drapeau pour désactiver les mises à jour.
Comme je l'ai dit, vous pouvez également démarrer un compteur, voici un exemple :
Ou simplement utiliser une boucle while, celle-ci fonctionne très bien :
Il s'agit simplement de dire que pendant que (je traîne) le prix est mis à jour jusqu'à ce qu'ils soient tous les deux égaux (quand j'arrête de traîner).

( et vos codes )

Quels exemples brillants! C'est vraiment un commentaire très très utile, merci beaucoup. Et maintenant, j'essaie d'ajouter plus de choses pour ces lignes (dessins et fonctions ).
( S'il vous plaît, ne me blâmez pas pour cette question : J'ai " graphics() " que j'utilise pour les objets graphiques, et je l'appelle par Init() et j'ai besoin de l'appeler par OnTimer(), donc ma question est : Est-ce que je fais mal, s'il vous plaît ? )

Bonne chance à vous !

 

Vous pouvez rencontrer l'erreur 4200 qui est l'échec de la création de l'objet car il existe déjà.

Vous devez donc vérifier si l'objet existe avant d'essayer de le (re)-créer ou de le modifier.

Vous pouvez utiliser :

   if(ObjectFind(0,"Long")<0)
     {
      //Object does not exist

     }
  
and/or

   if(ObjectFind(0,"Long")>=0)
     {
      // Object already exists
    
     }
 
Marco vd Heijden:

Vous pouvez utiliser :

Hmm, c'est vraiment une nouvelle fonction pour moi.
Je pourrais essayer après avoir fait des recherches à ce sujet. ( Je l'ai vue plusieurs fois mais je ne l'ai jamais utilisée pour moi. )

Merci beaucoup.

 

#Convertir le prix en pixels - Ouvrir

J'utilise " HLine " pour la fonction Take Profit.
J'ai quelques objets (Label, RecLabel... et ainsi de suite) et je voudrais que ces objets puissent se déplacer avec l'objet " HLine ". J'ai donc trouvé la fonction ci-dessous. Mais je ne veux pas convertir " X ". Je veux convertir seulement le prix en Y.
Je n'ai jamais essayé quoi que ce soit avec le code ci-dessous.
Q :
Parce que je veux être sûr qu'il pourrait m'aider pour ce problème ?
(si je sais qu'il peut m'aider alors je commencerai à l'essayer pour mon problème).
Q: Et existe-t-il des méthodes pour que certains objets puissent se déplacer avec " HLine " ?

// this is just example for that what I am thinking
datetime time = 0; // I just want to ignore this because I just want to give to X = 20; fixed mode ( should not change ever )
double price = ObjectGetDouble( 0, "line", OBJPROP_PRICE, 0 );

int x,y;

ChartTimePriceToXY( long chart_id, int sub_window, datetime time, double price, int& x, int& y );

Merci d'avance.

 

Vous devrez être un peu plus spécifique ; vous pouvez faire beaucoup de choses de plusieurs façons.

Ces fonctions sont utilisées dans la fonction OnChartEvent().

ChartPriceToXY - vous donnera la conversion du temps du prix en coordonnées, est-ce vraiment ce dont vous avez besoin ?

Vous voulez peut-être dire ChartXYToTimePrice() ?

https://www.mql5.com/en/docs/chart_operations/chartxytotimeprice

Si vous n'avez pas besoin de la valeur, vous pouvez simplement la passer comme un zéro, voir l'exemple ci-dessous.

//+------------------------------------------------------------------+
//|                                                    CrossHair.mq4 |
//|      Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create some lines
   ObjectCreate(0,"X",OBJ_HLINE,0,0,Ask);          // X = Horizontal Axis (time==0)
   ObjectCreate(0,"Y",OBJ_VLINE,0,TimeCurrent(),0);// Y = Vertical Axis (price==0)      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- clean up  
   ObjectsDeleteAll(0,0,EMPTY);  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- If this is an event of a mouse click on the chart
   if(id==CHARTEVENT_CLICK)
     {
      //--- Prepare variables
      int      x     =(int)lparam;
      int      y     =(int)dparam;
      datetime time  =0;
      double   price =0;
      int      window=0;
      //--- Convert the X and Y coordinates in terms of date/time
      if(ChartXYToTimePrice(0,x,y,window,time,price))
        {
         ObjectMove(0,"X",0,0,price); // notice time==0 because horizontal axis
         ObjectMove(0,"Y",0,time,0);  // notice price==0 because vertical axis
        }
      else
         Print("ChartXYToTimePrice return error code: ",GetLastError());
      Print("+--------------------------------------------------------------+");
     }
  }  
//+------------------------------------------------------------------+



Documentation on MQL5: Chart Operations / ChartXYToTimePrice
Documentation on MQL5: Chart Operations / ChartXYToTimePrice
  • www.mql5.com
Chart Operations / ChartXYToTimePrice - Reference on algorithmic/automated trading language for MetaTrader 5
 

J'ai déjà lu cette documentation mais je ne l'avais pas clairement compris jusqu'à votre dernier commentaire. En fait, je n'ai pas encore essayé, parce que j'ai du mal avec le code ci-dessous, j'ai déjà essayé plusieurs façons pour obtenir de bons résultats, mais je ne peux pas.
M. Marco
, merci pour votre dernier commentaire qui me semble pouvoir être utilisé pour mon problème de déplacement d'objets.

J'ai vraiment passé beaucoup de temps à trouver une solution à mon problème, mais je ne peux pas obtenir de bons résultats.
Mais de toute façon, je peux obtenir (en ouvrant des positions) des prix de prise de bénéfices, c'est-à-dire que je veux que les objets " hline " puissent appeler les prix de prise de bénéfices pour eux-mêmes, et ça marche. Et cela ne fonctionne que les premières fois. Oui, je sais parce que c'est dans " Init() ". Mais j'ai essayé de le mettre dans " OnTimer() " mais cela ne fonctionne pas correctement.

S'il vous plaît laissez-moi savoir quelque chose qui m'aide à comprendre ce que je pourrais apprendre, et faire pour mon problème.
Je vais recommencer à faire des recherches sur cette question après 7 heures plus tard.
Si je reçois de bons commentaires, ce sera mieux pour moi.

// init()------------------------------------------------------------

for ( i = OrdersTotal() - 1; i >= 0; i-- )
{
    if  ( ! OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) ) continue;
    if  ( OrderSymbol() == Symbol() ) tpprice = OrderTakeProfit();

    ObjectCreate    (
                        "#" + IntegerToString( OrderTicket() ) + " -" + "tphline", // name
                        OBJ_HLINE,
                        0,      // subwindow
                        0,      // time
                        tpprice // price1
                    );
    tpprice =
    ObjectGetDouble (
                        0,
                        "#" + IntegerToString( OrderTicket() ) + " -" + "tphline", // name
                        OBJPROP_PRICE, 0
                    );

}
// ontimer() --------------------------------------------------------

if  ( tpprice != ObjectGetDouble( 0, "#" + IntegerToString( OrderTicket() ) + " -" + "tphline", OBJPROP_PRICE, 0 ) )
{
    tpdrag = 1;
}

if  ( tpdrag == 1 )
{
    tpprice = ObjectGetDouble( 0, "#" + IntegerToString( OrderTicket() ) + " -" + "tphline", OBJPROP_PRICE, 0 );
    Print( "tpdrag: ", tpdrag, " - Price: ", DoubleToString( tpprice, Digits ) );

    // actually here is a graphical objects functin()
    // here one of them
    // also which one soon I will try to  below objects could moves together " tphline " - but I can't take a time to research about your latest comment and so...
    ObjectCreate( "recl object", OBJ_RECTANGLE, 0, 0, tpprice ); // I feel I could add something to " string name " - I already tried few things not good results

    tpdrag = 0;
}

//---
return;

Merci d'avance.
Bonne chance à vous !

 

Veuillez utiliser le styler, il se trouve sous l'onglet Outils.

Je n'ai aucune idée de ce que vous essayez d'accomplir et je dois donc deviner ce que vous voulez faire, ce qui n'est jamais bon.

Mais vous pouvez regarder l'exemple ici :

//+------------------------------------------------------------------+
//|                                                    Stealth 4.mq4 |
//|      Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

static input int takeprofit=500;// Take Profit
static input int stoploss=500;  // Stop Loss

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   for(int order=OrdersTotal(); order>=0; order--)
     {
      bool selected=OrderSelect(order,SELECT_BY_POS);
        {
         if(selected==1)
           {
            if(Symbol()==OrderSymbol()) // only for current chart symbol
              {
               switch(OrderType())
                 {
                  case OP_BUY: // for buy order
                    {
                     // if objects not found - create them
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")<0)
                       {
                        ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJ_HLINE,0,0,OrderOpenPrice()+takeprofit*Point());
                        ObjectSet("#"+IntegerToString(OrderTicket())+"-TP",7,3);
                       }
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")<0)
                       {
                        ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJ_HLINE,0,0,OrderOpenPrice()-stoploss*Point());
                        ObjectSet("#"+IntegerToString(OrderTicket())+"-SL",7,3);
                       }
                     // if objects exist
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")>=0)
                       {
                        if(Bid>ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJPROP_PRICE,0))
                          {
                           bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
                             {
                              if(close==0)
                                {
                                 Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
                                }
                              if(close==1)
                                {
                                 Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to TP Profit = "+DoubleToString(OrderProfit(),2));
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
                                }
                             }
                          }
                       }
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")>=0)
                       {
                        if(Ask<ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJPROP_PRICE,0))
                          {
                           bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
                             {
                              if(close==0)
                                {
                                 Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
                                }
                              if(close==1)
                                {
                                 Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to SL Profit = "+DoubleToString(OrderProfit(),2));
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
                                }
                             }
                          }
                       }
                    }
                  break;

                  case OP_SELL: // for sell order
                    {
                     // if objects not found - create them
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")<0)
                       {
                        ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJ_HLINE,0,0,OrderOpenPrice()-takeprofit*Point());
                        ObjectSet("#"+IntegerToString(OrderTicket())+"-TP",7,3);
                       }
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")<0)
                       {
                        ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJ_HLINE,0,0,OrderOpenPrice()+stoploss*Point());
                        ObjectSet("#"+IntegerToString(OrderTicket())+"-SL",7,3);
                       }
                     // if objects exist
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")>=0)
                       {
                        if(Ask<ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJPROP_PRICE,0))
                          {
                           bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
                             {
                              if(close==0)
                                {
                                 Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
                                }
                              if(close==1)
                                {
                                 Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to TP Profit = "+DoubleToString(OrderProfit(),2));
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
                                }
                             }
                          }
                       }
                     if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")>=0)
                       {
                        if(Bid>ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJPROP_PRICE,0))
                          {
                           bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
                             {
                              if(close==0)
                                {
                                 Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
                                }
                              if(close==1)
                                {
                                 Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to SL Profit = "+DoubleToString(OrderProfit(),2));
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
                                 ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
                                }
                             }
                          }
                       }
                    }
                  break;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+


Vous pouvez donc voir que vous pouvez utiliser ObjectGetDouble directement, il n'y a pas besoin de copier la valeur dans un autre double car l'objet lui-même détient la valeur, et lorsque vous faites glisser la ligne, cette valeur change automatiquement, et sera vue la prochaine fois que vous la lirez.

Raison: