Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Mira este hilo: https://www.mql5.com/en/forum/178677
Mira este hilo: https://www.mql5.com/en/forum/178677
realmente gracias , para la instrucción de apertura de archivos y el enlace de descarga
10 puntos3
¡POR FAVOR, PROGRAMADORES!
Necesitamos en 10points3 EA, que cuando se abra la tercera operación, se cierre la primera, lo estoy intentando pero sigue cerrando todas las posiciones.
en realidad tenemos:
if (PreviousOpenOrders>OpenOrders)
{
for(cnt=OrdersTotal();cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
mode=Tipo de orden();
if (OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
{
if (mode==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),OrderClosePri ce(),slippage,Blue); }
if (mode==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),OrderClosePri ce(),slippage,Red); }
return(0);
}
Estaba pensando en hacer esto
1. cambiar el número mágico de la primera operación cuando se abra la segunda, por ejemplo magicnumber+1
2. cuando se abra la tercera operación, cerrar la primera, con el número mágico+1 asignado.
¿Estoy en lo cierto?
¿o de que otra forma puedo identificar la primera operación abierta para cerrarla después?
Si me pueden guiar o hacer los cambios, mejor porque no soy programador, solo estoy aprendiendo.
¡¡¡Este cambio sería el inicio del Santo Grial!!!
10 puntos3
Perdón, el EA.
Y está en este hilo:
https://www.mql5.com/en/forum/174975
¡Gracias!
ayuda de programación - operador de retorno
hola
soy principiante en la programación de mt4 y ahora trato de encontrar una solución para confirmar las variables de una función nula en el programa principal "start()".
a continuación se puede ver un ejemplo y la pregunta es, ¿cómo puedo confirmar el valor de la variable "CountOpenSell", "CountOpenBuy", "ProfitSell " y "ProfitBuy" a la start() - mainprogram.........
he añadido mi sugerencia (en NEGRITA) pero no sé si es correcta y cómo es el código correcto para el programa principal "start()"?
perdón por mi mal inglés y por toda la ayuda
muchas gracias
saludos
forex2006
void CompraVentaBeneficio()
{ ProfitBuy=0;
ProfitSell=0;
CountOpenSell=0;
CountOpenBuy=0;
for (i=OrdersTotal()-1;i>=0;i--)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderType()==OP_SELL) {ProfitSell = ProfitSell + OrderProfit();CountOpenSell++;}
si (OrderType()==OP_BUY) {ProfitBuy = ProfitBuy + OrderProfit();CountOpenBuy++;}
}
else Print( "Error al seleccionar la orden ", GetLastError());
}
return(CountOpenSell);
return(CountOpenBuy);
return(ProfitSell);
return(ProfitBuy);
}
ayuda de programación forex2006 - operador de retorno
Hola forex2006,
Si realmente quieres aprender mql, te sugiero que pruebes los tutoriales de codersguru, ahí es donde yo empecé. En cuanto a tu pregunta, una función void no puede devolver un valor, si quieres sacar valores de las funciones void, tienes que usar variables globales. La mejor manera de sacar los valores es usar una función que devuelva un valor usado con parámetros para indicar qué valores quieres. Es un ejemplo sencillo a continuación. Intenta evitar el uso de variables globales en las funciones, ya que esto podría dificultarte más adelante.
Espero que te sirva de ayuda
int inicio()
{
double ProfitBuy = CallBuySellProfit(OP_BUY,false);
double ProfitSell = CallBuySellProfit(OP_SELL,false);
int CountOpenBuy = CallBuySellProfit(OP_BUY,true);
int CountOpenSell = CallBuySellProfit(OP_SELL,true);
Comment( "ProfitBuy: "+DoubleToStr(ProfitBuy,2) +"\n "+
"ProfitSell: "+DoubleToStr(ProfitSell,2) +"\n "+
"CountOpenBuy: "+DoubleToStr(CountOpenBuy,2)+"\n "+
"CountOpenSell: "+DoubleToStr(CountOpenSell,2)+"\n "+
"");
devolver;
}
double LlamarCompraVentaBeneficio(intTipoDeOrden, bool bCuenta)
{
double dProfit = 0;
int iCount = 0;
for (int i=TotalPedidos()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()==iOrderType)
{
dProfit = dProfit + OrderProfit();
iCount++;
}
}
si no
{
Print( "Error al seleccionar la orden ", GetLastError());
}
}//fin para
if(bCount)return(iCount);
si no, return(dProfit);
}//fin CallBuySellProfit
Detener las operaciones del EA en la misma barra
Hola, ¿hay alguna forma de poner código para que el EA compruebe si ya se han realizado operaciones en esa barra y luego no coloque más operaciones hasta una nueva barra?
Gracias
matrixebiz, ¿has considerado la posibilidad de que una operación se abra y se cierre en la misma vela antes de que la vela se haya cerrado? probablemente deberías revisar la lista del historial también.
Siempre he portado esta pequeña función que escribí a todos mis EAs, tal vez la encuentres útil también.
bool DecideToOpenTrade()
{
int total = OrdersTotal();
if (total > 0)
{
for(int cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber() == EA_MAGIC_NUM)
{
return (false);
}
}
}
}
// in case trades has already opened and closed within the candle
int histotal = OrdersHistoryTotal();
if (histotal > 0)
{
for(cnt=0;cnt<histotal;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber() == EA_MAGIC_NUM)
{
if (Time[0] <= OrderOpenTime()) // don't open a new position if we're still on the same candle
{
return (false);
}
}
}
}
}
return (true);
}
int start()
{
// some time check codes first.. blah blah
// ...
// ...
// ...
// check signals
if (Should_Buy())
{
if (DecideToOpenTrade())
{
//... trade opening codes here
}
}
if (Should_Sell())
{
if (DecideToOpenTrade())
{
//... trade opening codes here
}
}
}
nota: esta función asume que has puesto un valor único a EA_MAGIC_NUM. De esta manera la comprobación no mirará las operaciones abiertas por otros EAs.
Should_Buy() y Should_Sell() son funciones que creo en todos mis EAs para determinar si se ha producido una señal de compra o de venta.
Espero que esto ayude. Si necesita más aclaraciones, póngase en contacto conmigo.
saludos,
Zen
post actualizado a continuación...
Esto parece funcionar para mí Gracias
void DesideToOpen()
//----------------------------------------------------------------+
//----------------------------------------------------------------+
{
int total = OrdersTotal();
if (total > 0)
{
for(int cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{
if(OrderComment() == EA_Name + MagicNumber) DecideToOpenTrade = false;
}
}
}
// in case trades has already opened and closed within the candle
int histotal = OrdersHistoryTotal();
if (histotal > 0)
{
for(cnt=0;cnt<histotal;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderComment() == EA_Name + MagicNumber)
{
if (Time[0] <= OrderOpenTime()) DecideToOpenTrade = false; // don't open a new position if we're still on the same candle
}
}
}
}
}