Preguntas básicas ... - página 8

 
 
newdigital:
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!

Archivos adjuntos:
10p3v0.03_1.mq4  12 kb
 

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

}

}

}

}

}

Razón de la queja: