Gracias. No sabía que MQL tuviera una función para eso. Estaba a punto de crear el mío propio. Pero antes decidípreguntar en el foro.
Esto es consecuencia de un enfoque erróneo del aprendizaje de idiomas. Si hubieras trabajado con la documentación, y no con el g.code de......... leyendo la ayuda del recurso, habrías leído sobre ello. Y no tendrías que preguntar.
Lo he hecho de manera que cuando estoy siguiendo un contrato, el Take Profites igual a 500 y el Stop Loss es igual a 150.
Se compran hasta cinco contratos adicionales.
¿Puedo prohibir la apertura de nuevas posiciones cuando ya hay dos abiertas? Limitar el volumen de posiciones abiertas.
//--------------------------------------------------------------------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: Esto es consecuencia de un enfoque erróneo del estudio de la lengua. Si trabajaras con documentación, en lugar de con codificación desde ......... leyendo la ayuda en los recursos, lo leerías. Y no tendrías que preguntar.
Sabía que mi respuesta iría seguida de un sermón... Ya sabes, como tú... Pensé que había dicho: "Gracias", pero no... Tienes que escribir algo... Si conoces la función por la documentación, ¡bien por ti! Pero si no se conoce bien el código, se puede estudiar la documentación de MQL a fondo, ¡pero servirá de muy poco en la práctica!
Hola.
Me pueden decir si es posible añadir una columna con comentarios o explicaciones en los parámetros del EA... ???
Gracias.
Sí, pero necesitas la fuente.
Gracias. No sabía que MQL tuviera una función para eso. Estaba a punto de crear el mío propio. Pero antes decidípreguntar en el foro.
Hola.
Me podéis decir si es posible añadir una columna con comentarios o explicaciones en los parámetros del EA... ???
Gracias.
¿Cuándo aprenderás a leer la documentación?
Esto es consecuencia de un enfoque erróneo del estudio de la lengua. Si trabajaras con documentación, en lugar de con codificación desde ......... leyendo la ayuda en los recursos, lo leerías. Y no tendrías que preguntar.
Sabía que mi respuesta iría seguida de un sermón... Ya sabes, como tú... Pensé que había dicho: "Gracias", pero no... Tienes que escribir algo... Si conoces la función por la documentación, ¡bien por ti! Pero si no se conoce bien el código, se puede estudiar la documentación de MQL a fondo, ¡pero servirá de muy poco en la práctica!
Accidentalmente me encontré con este error
Crear dos botones idénticos con coordenadas ligeramente diferentes
se ve así
Pero como resultado, sólo el primer botón reacciona a OnChartEvent, el segundo no.
Lo hice de manera que cuando se hace un seguimiento de un contrato, el Take Profites igual a 500 y el Stop Loss es igual a 150.
No conozco MQL5, pero creo que
Accidentalmente me encontré con este error
Crear dos botones idénticos con coordenadas ligeramente diferentes
se ve así
pero como resultado, sólo el primer botón reacciona a OnChartEvent, el segundo no.
¿Puedes ver el código en el manejador?
¿Y por qué hay -73 en los parámetros, no está muy claro...?
¿Puedo ver el código en el manejador?
¿Y por qué hay -73 en los parámetros, no está muy claro...?
No da ningún error.
Con estas coordenadas el botón está al revés, porque la longitud del botón se calcula +/- desde el punto X