Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
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);
}
}
//+------------------------------------------------------------------+
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 :
{
//Object does not exist
}
and/or
if(ObjectFind(0,"Long")>=0)
{
// Object already exists
}
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 " ?
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("+--------------------------------------------------------------+");
}
}
//+------------------------------------------------------------------+
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.
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.