Merci ! Je ne savais pas que MQL avait une fonction pour ça. J'étais sur le point de créer le mien. Mais avant cela, j'ai décidé deposer la question sur le forum.
C'est la conséquence d'une mauvaise approche de l'apprentissage des langues. Si vous aviez travaillé avec la documentation, et non avec le g.code de......... en lisant l'aide de la ressource, vous auriez lu à ce sujet. Et vous n'auriez pas à demander.
J'ai fait en sorte que lorsque je suis le suivi d'un contrat, le Take Profitest égal à 500 et le Stop Loss est égal à 150.
Jusqu'à cinq contrats supplémentaires sont achetés.
Puis-je interdire l'ouverture de nouveaux postes lorsque deux sont déjà ouverts ? Limitez le volume des positions ouvertes.
//--------------------------------------------------------------------void OPENORDER(string ord)
{
double priceL=m_symbol.Ask();
if(ord=="Sell")
//--- check for free moneyif(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,my_lot,priceL)<0.0)
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
elseif(!m_trade.Sell(my_lot,Symbol(),m_symbol.Bid(),my_SL,my_TP,""))
Print("BUY_STOP -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of Retcode: ",m_trade.ResultRetcodeDescription(),
", ticket of order: ",m_trade.ResultOrder()); // Если sell, то не открываемсяdouble priceS=m_symbol.Bid();
if(ord=="Buy")
//--- check for free moneyif(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,my_lot,priceS)<0.0)
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
elseif(!m_trade.Buy(my_lot,Symbol(),m_symbol.Ask(),my_SL,my_TP,""))
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription(),
", ticket of deal: ",m_trade.ResultDeal());
return;
}
double iMAGet(constint handle,constint index)
{
double MA[];
ArraySetAsSeries(MA,true);
//--- reset error codeResetLastError();
//--- fill a part of the iMABuffer array with values from the indicator buffer that has 0 indexif(CopyBuffer(handle,0,0,index+1,MA)<0)
{
//--- if the copying fails, tell the error codePrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
//--- quit with zero result - it means that the indicator is considered as not calculatedreturn(0.0);
}
return(MA[index]);
}
//+------------------------------------------------------------------+//| Refreshes the symbol quotes data |//+------------------------------------------------------------------+bool RefreshRates()
{
//--- refresh ratesif(!m_symbol.RefreshRates())
return(false);
//--- protection against the return value of "zero"if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
return(false);
//---return(true);
}
//+------------------------------------------------------------------+//| Get Time for specified bar index |//+------------------------------------------------------------------+datetimeiTime(constint index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
{
if(symbol==NULL)
symbol=Symbol();
if(timeframe==0)
timeframe=Period();
datetime Time[];
datetime time=0;
ArraySetAsSeries(Time,true);
int copied=CopyTime(symbol,timeframe,index,1,Time);
if(copied>0)
time=Time[0];
return(time);
}
//+------------------------------------------------------------------+//| Get value of buffers |//+------------------------------------------------------------------+bool iGetArray(constint handle,constint buffer,constint start_pos,
constint count,double &arr_buffer[])
{
bool result=true;
if(!ArrayIsDynamic(arr_buffer))
{
PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
return(false);
}
ArrayFree(arr_buffer);
//--- reset error codeResetLastError();
//--- fill a part of the iBands array with values from the indicator bufferint copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
if(copied!=count)
{
//--- if the copying fails, tell the error codePrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
__FILE__,__FUNCTION__,count,copied,GetLastError());
//--- quit with zero result - it means that the indicator is considered as not calculatedreturn(false);
}
return(result);
}
void TrailingOrder()
{
if(InpTrailingOrderLimit==0)
return;
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positionsif(m_position.SelectByIndex(i))
if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
{
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingOrderLimit+ExtTrailingOrderStep))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTrailingOrderLimit),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket());
OPENORDER("Buy");
}
}
else
{
if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingOrderLimit+ExtTrailingOrderStep))) ||
(m_position.StopLoss()==0))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTrailingOrderLimit),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket());
OPENORDER("Sell");
}
}
}
}
void Trailing()
{
if(InpTStop==0)
return;
if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
{
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTStop+ExtTStep)
if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTStop+ExtTStep))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTStepShift),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket(),
" Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
}
else
{
if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTStop+ExtTStep)
if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTStop+ExtTStep))) ||
(m_position.StopLoss()==0))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTStepShift),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket(),
" Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
}
}
}
Alexey Viktorov: C'est une conséquence de la mauvaise approche de l'étude de la langue. Si vous travailliez avec la documentation, plutôt qu'avec le codage à partir de ......... en lisant l'aide sur les ressources, vous l'auriez lu. Et vous n'auriez pas à demander.
Je savais que ma réponse serait suivie d'une conférence... Vous savez, comme vous le faites... Je croyais avoir dit : "Merci", mais non... Tu dois écrire quelque chose... Si vous connaissez la fonction grâce à la documentation, tant mieux pour vous ! Mais si vous ne connaissez pas le code correctement, vous pouvez étudier la documentation MQL à fond, mais cela ne vous servira pas à grand-chose en pratique... !
Bonjour.
Pouvez-vous me dire s'il est possible d'ajouter une colonne de commentaires ou d'explications dans les paramètres de l'EA... ? ??
Merci.
Oui, mais vous avez besoin de la source.
Merci ! Je ne savais pas que MQL avait une fonction pour ça. J'étais sur le point de créer le mien. Mais avant cela, j'ai décidé deposer la question sur le forum.
Bonjour.
Pouvez-vous me dire s'il est possible d'ajouter une colonne de commentaires ou d'explications dans les paramètres de l'EA... ? ??
Merci.
Quand apprendras-tu à lire la documentation?
C'est une conséquence de la mauvaise approche de l'étude de la langue. Si vous travailliez avec la documentation, plutôt qu'avec le codage à partir de ......... en lisant l'aide sur les ressources, vous l'auriez lu. Et vous n'auriez pas à demander.
Je savais que ma réponse serait suivie d'une conférence... Vous savez, comme vous le faites... Je croyais avoir dit : "Merci", mais non... Tu dois écrire quelque chose... Si vous connaissez la fonction grâce à la documentation, tant mieux pour vous ! Mais si vous ne connaissez pas le code correctement, vous pouvez étudier la documentation MQL à fond, mais cela ne vous servira pas à grand-chose en pratique... !
Je suis accidentellement tombé sur ce bug
Créer deux boutons identiques avec des coordonnées légèrement différentes
cela ressemble à ceci
Mais en conséquence, seul le premier bouton réagit à OnChartEvent, le second non.
Je l'ai fait ainsi lors du suivi d'un contrat, car le Take Profitest égal à 500 et le Stop Loss est égal à 150.
Je ne connais pas MQL5, mais je pense que
Je suis accidentellement tombé sur ce bug
Créer deux boutons identiques avec des coordonnées légèrement différentes
cela ressemble à ceci
mais en conséquence, seul le premier bouton réagit à OnChartEvent, le second non.
Pouvez-vous voir le code dans le gestionnaire ?
Et pourquoi il y a -73 dans les paramètres, pas très clair... ?
Je peux voir le code dans le gestionnaire ?
Et pourquoi il y a -73 dans les paramètres, pas très clair... ?
Il n'y a pas d'erreur.
Avec ces coordonnées, le bouton est à l'envers, parce que la longueur du bouton est calculée à +/- du point X