Obrigado! Eu não sabia que a MQL tinha uma função para isso. Eu estava prestes a criar o meu próprio. Mas antes disso, decidiperguntar no fórum.
Isto é uma conseqüência da abordagem errada da aprendizagem de línguas. Se você tivesse trabalhado com a documentação, não com o código g.code de......... lendo a ajuda do recurso, você teria lido sobre isso. E você não teria que perguntar.
Fiz isso para que quando estou atrás de um contrato, o Take Profitseja igual a 500 e o Stop Loss seja igual a 150.
Até cinco contratos adicionais são comprados.
Posso proibir a abertura de novas posições quando duas já estão abertas? Limitar o volume de posições em aberto.
//--------------------------------------------------------------------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: Isto é uma conseqüência da abordagem errada do estudo da língua. Se você trabalhasse com documentação, e não com codificação do ......... lendo a ajuda sobre recursos, você leria sobre isso. E você não teria que perguntar.
Eu sabia que minha resposta seria seguida de uma palestra. Como você faz... Eu pensei ter dito: "Obrigado", mas não... Você tem que escrever algo... Se você conhece a função a partir da documentação, bom para você! Mas se você não conhece o código corretamente, você pode estudar a documentação MQL em toda parte, mas ela será de muito pouco uso na prática...!
Olá.
Você pode me dizer se é possível adicionar uma coluna com comentários ou explicações nos parâmetros da EA... ???
Obrigado.
Sim, mas você precisa da fonte.
Obrigado! Eu não sabia que a MQL tinha uma função para isso. Eu estava prestes a criar o meu próprio. Mas antes disso, decidiperguntar no fórum.
Olá.
Você pode me dizer se é possível adicionar uma coluna com comentários ou explicações nos parâmetros da EA... ???
Obrigado.
Quando você vai aprender a ler a documentação?
Isto é uma conseqüência da abordagem errada do estudo da língua. Se você trabalhasse com documentação, e não com codificação do ......... lendo a ajuda sobre recursos, você leria sobre isso. E você não teria que perguntar.
Eu sabia que minha resposta seria seguida de uma palestra. Como você faz... Eu pensei ter dito: "Obrigado", mas não... Você tem que escrever algo... Se você conhece a função a partir da documentação, bom para você! Mas se você não conhece o código corretamente, você pode estudar a documentação MQL em toda parte, mas ela será de muito pouco uso na prática...!
Eu acidentalmente me deparei com este bug
Criar dois botões idênticos com coordenadas ligeiramente diferentes
parece ser assim
Mas como resultado, apenas o primeiro botão reage ao OnChartEvent, o segundo não.
Eu fiz isso ao seguir um contrato, porque Take Profité igual a 500 e Stop Loss é igual a 150.
Eu não conheço a MQL5, mas eu acho
Eu acidentalmente me deparei com este bug
Criar dois botões idênticos com coordenadas ligeiramente diferentes
parece ser assim
mas como resultado, apenas o primeiro botão reage ao OnChartEvent, o segundo não.
Você pode ver o código no manipulador?
E por que há -73 nos parâmetros, não está muito claro...?
Posso ver o código no manipulador?
E por que há -73 nos parâmetros, não muito claros...?
Não dá nenhum erro.
Com estas coordenadas o botão está de cabeça para baixo, porque o comprimento do botão é calculado +/- a partir do ponto X