Universal MA Cross EA - página 106

 
BlackCoq:
El caso es que uso un código muy similar para el sistema de martingala que funciona perfectamente: Ya que funciona para la martingala, ¿no debería funcionar ahora también?

Pruebe a utilizar algo como esto :

double GetLastPL()

{

double TempLastOrderProfit = 0;

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

{

CloseTime = OrderCloseTime();

TempLastOrderProfit = OrderProfit() + OrderSwap()+ OrderCommission();

}

}

return(TempLastOrderProfit);

}

Te devolverá el importe exacto de la ganancia (o pérdida) de la última orden

 
mladen:
Pruebe a utilizar algo como esto : Le devolverá el importe exacto de la ganancia (o pérdida) de la última orden

Gracias por tu ayuda, Mladen. He retocado un poco el código hasta que he conseguido que compile sin errores, pero el EA sigue parando y revirtiendo después de una pérdida. Este es el código exacto que estoy usando ahora:

{

double TempLastOrderProfit = 0;

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

{

CloseTime = OrderCloseTime();

}

}

if(StopAndReverse==true && subTotalTrade()>0 && OrderProfit()>0)

{

if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true))

{

subCloseOrder();

if(subTotalTrade()>0) subCloseOrder();

if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("¡Deténgase e invierta!");

}

}

}

double GetLastPL() Me da el siguiente error: '(' - definición de función inesperada.

 
BlackCoq:
Gracias por tu ayuda, Mladen. He retocado un poco el código hasta que he conseguido que se compile sin errores, pero el EA sigue parando e invirtiendo después de una pérdida. Este es el código exacto que estoy usando ahora: double GetLastPL() Me da el siguiente error: '(' - definición de función inesperada.

BlackCoq

Debe hacer todas las comparaciones lógicas dentro del bucle porque funciones como OrderProfit() están devolviendo el beneficio de la orden actualmente seleccionada de una lista de órdenes cerradas. Si no está dentro del bucle principal (for(int i=OrdersHistoryTotal()-1;i>=0;i--)) entonces sólo se comprobará la última orden seleccionada y no significa que sea la última orden (metaquotes indica explícitamente en su documentación que las órdenes de la lista de órdenes cerradas (o aún abiertas) no tienen que estar en ningún orden concreto - es responsabilidad de los codificadores comprobar el orden)

 
mladen:
BlackCoq Debes hacer todas las comparaciones lógicas dentro del bucle porque funciones como OrderProfit() están devolviendo el beneficio de la orden actualmente seleccionada de una lista de órdenes cerradas. Si no está dentro del bucle principal (for(int i=OrdersHistoryTotal()-1;i>=0;i--)) entonces sólo se comprobará la última orden seleccionada y no significa que sea la última orden (metaquotes indica explícitamente en su documentación que las órdenes de la lista de órdenes cerradas (o aún abiertas) no tienen que estar en ningún orden concreto - es responsabilidad de los codificadores comprobar el orden)

Después de muchas horas fallando con esta tarea aparentemente fácil he decidido estudiar mucho más programación antes de continuar. De todos modos, ¡gracias por tu ayuda!

Cuando probé esto el EA no abría ninguna posición:

{ double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); } } { if(StopAndReverse==true && subTotalTrade()>0 && OrderProfit()>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }[/PHP]

And with this, it would "stop and reverse" even if last trade was a loss:

[PHP] { double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); TempLastOrderProfit = OrderProfit() + OrderSwap()+ OrderCommission(); } } return(TempLastOrderProfit); { if(StopAndReverse==true && subTotalTrade()>0 && TempLastOrderProfit>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }

De nuevo, gracias.

 
BlackCoq:
Después de muchas horas fallando con esta tarea aparentemente fácil he decidido estudiar mucho más programación antes de continuar. De todas formas, ¡gracias por vuestra ayuda!

Cuando probé esto el EA no abría ninguna posición:

{ double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); } } { if(StopAndReverse==true && subTotalTrade()>0 && OrderProfit()>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }[/PHP]

And with this, it would "stop and reverse" even if last trade was a loss:

[PHP] { double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); TempLastOrderProfit = OrderProfit() + OrderSwap()+ OrderCommission(); } } return(TempLastOrderProfit); { if(StopAndReverse==true && subTotalTrade()>0 && TempLastOrderProfit>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }
De nuevo, gracias.

BlackCoq

Si utilizas la función que he puesto tal cual, te devolverá el beneficio exacto de la última orden cerrada (no hace falta cambiar nada en ella)

 
mladen:
BlackCoq Si utilizas la función que he puesto tal cual, te devolverá el beneficio exacto de la última orden cerrada (no hace falta cambiar nada en ella)

Cuando intento copiar la función, obtengo numerosos errores sin importar cómo intente modificarla.

Este código:

{

double GetLastPL()

{

double TempLastOrderProfit = 0;

datetime CloseTime = 0;

for(int i=Total de Pedidos()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

{

CloseTime = OrderCloseTime();

TempLastOrderProfit = OrderProfit() + OrderSwap()+ OrderCommission();

}

}

return(TempLastOrderProfit);

{

if(StopAndReverse==true && subTotalTrade()>0 && TempLastOrderProfit>0)

{

if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true))

{

subCloseOrder();

if(subTotalTrade()>0) subCloseOrder();

if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("¡Deténgase e invierta!");

}

}

}

}

Me da los errores:

Compilando 'universalMAcrossECNmartingaleSAR.mq4'...

'(' - definición de función inesperada (538, 20)

TempLastOrderProfit' - variable no definida (548, 15)

TempLastOrderProfit' - variable no definida (551, 15)

TempLastOrderProfit" - variable no definida (553, 52)

 
BlackCoq:
Cuando intento copiar la función, obtengo numerosos errores sin importar cómo intente modificarla.

Este código:

{ double GetLastPL() { double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); TempLastOrderProfit = OrderProfit() + OrderSwap()+ OrderCommission(); } } return(TempLastOrderProfit); { if(StopAndReverse==true && subTotalTrade()>0 && TempLastOrderProfit>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }[/PHP]

Gives me the errors:

[PHP]

Compiling 'universalMAcrossECNmartingaleSAR.mq4'... '(' - function definition unexpected (538, 20)'TempLastOrderProfit' - variable not defined (548, 15)'TempLastOrderProfit' - variable not defined (551, 15)'TempLastOrderProfit' - variable not defined (553, 52)

BlackCoq

Esa función debe ser pegada fuera de cualquier otra función. Aquí hay un ea muy simple que muestra cómo funciona y cómo debe usarse

Archivos adjuntos:
 
mladen:
BlackCoq Esa función debe ser pegada fuera de cualquier otra función. Aquí hay un ea muy simple que muestra cómo funciona y cómo se debe utilizar

Estoy seguro de que me estoy perdiendo algo aquí, pero incluso si trato de copiar la función fuera de cualquier otra función en el EA, sigo recibiendo los siguientes errores

'(' - definición de la función inesperada (después del doble GetLastPL())

TempLastOrderProfit' - variable no definida (554, 15)

TempLastOrderProfit' - variable no definida (557, 15)

 
BlackCoq:
Estoy seguro de que me estoy perdiendo algo aquí, pero incluso si trato de copiar la función fuera de cualquier otra función en el EA, sigo recibiendo los siguientes errores:

'(' - definición de la función inesperada (después del doble GetLastPL())

TempLastOrderProfit' - variable no definida (554, 15)

'TempLastOrderProfit' - variable no definida (557, 15)

Lo siento, pero sin tu código no tengo ni idea de lo que estás haciendo

Como puedes ver en ese EA de prueba funciona sin ningún problema

 
mladen:
Lo siento, pero sin tu código no tengo ni idea de lo que estás haciendo Como puedes ver en ese EA de prueba funciona sin ningún problema

Yo también obtengo varios errores cuando intento compilar el EA que has adjuntado. ¿Estamos utilizando diferentes versiones de MT4?

Te adjunto el EA al que intento añadir la función antes de "stop and reverse".

Archivos adjuntos:
Razón de la queja: