¿Cómo codificar? - página 312

 

...

¿Cómo se declara su LastProfitHigh?

Si está declarada dentro del cuerpo de la función (start() por ejemplo) siempre cambiará de valor si no la declaras como estática. Por lo tanto, si se declara como local (dentro de la función) intente declararla en el ámbito global o como variable estática y de esa manera "heredará" los valores entre dos ticks.

aud4xtrader:
Hola a todos,

Soy nuevo en la codificación y he ido aprendiendo poco a poco el lenguaje y la sintaxis pero me ha surgido una duda sobre cómo MT4 actualiza las variables.

He intentado codificar un EA simple que muestre el mayor beneficio que ha tenido una operación actualmente abierta y que sólo se actualice si se alcanza un nuevo máximo, pero lo que ocurre es que la cantidad se mueve hacia abajo y hacia arriba como lo hace el beneficio, parece que no puedo ver mi error en la lógica del código.

Compruebo que la operación seleccionada sigue abierta

t_CloseTime=OrderCloseTime(); //devuelve 0 si la orden no está cerrada

if(t_CloseTime==0) //La orden está cerrada si no es cero.

{

if(OrderProfit() > LastProfitHigh) LastProfitHigh=OrderProfit();

if(LastProfitHigh >= MinProfit && MinProfitReached==false) MinProfitReached=true;

}//endif

Entonces, si la lógica es correcta por qué esta variable "LastProfitHigh" sube y baja....

Gracias por su ayuda.
 

Nuevo en la codificación

mladen:
¿Cómo está declarada tu LastProfitHigh? Si está declarada dentro del cuerpo de la función (start() por ejemplo) siempre cambiará de valor si no la declaras como estática. Por lo tanto, si está declarada como local (dentro de la función) prueba a declararla en el ámbito global o como variable estática y así "heredará" los valores entre dos ticks.

Hola mladen,

Ahora he movido la variable fuera de la func start() y la he declarado "static double", gracias por la respuesta y cruzo los dedos para que se muestre correctamente.

¿La lógica del código está declarada correctamente?

 

aud4xtrader

La lógica está bien

Si mueves la variable fuera del inicio entonces no necesitas declararla estática (es automáticamente una variable global cuando está fuera de cualquier cuerpo de función - y es "visible" a través de todo el código) Si quieres que la variable se mantenga local a alguna función y aún así mantener el estado anterior de la misma (el estado en un tick anterior, por ejemplo) entonces la declaras como estática

Aquí hay dos ejemplos que terminan con el mismo resultado

double previousProfit=0;

int start()

{

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

[/PHP]

or the same thing but with static variable

[PHP]

int start()

{

static double previousProfit=0;

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

aud4xtrader:
Hola mladen,

Ahora he movido la variable fuera de la func start() y la he declarado "static double", gracias por la respuesta y crucemos los dedos para que se muestre correctamente.

¿La lógica del código está bien planteada?
 

¿Cómo se codifica?

Funciona muy bien, gracias de nuevo por la excelente ayuda.

mladen:
aud4xtrader

La lógica está bien

Si mueves la variable fuera del inicio entonces no necesitas declararla estática (es automáticamente una variable global cuando está fuera de cualquier cuerpo de función - y es "visible" a través de todo el código) Si quieres que la variable se mantenga local a alguna función y que siga manteniendo el estado anterior de la misma (el estado en un tick anterior, por ejemplo) entonces la declaras como estática

Aquí hay dos ejemplos que terminan en el mismo resultado

double previousProfit=0;

int start()

{

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

[/PHP]

or the same thing but with static variable

[PHP]

int start()

{

static double previousProfit=0;

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

 

Perfecto. Gracias.

mladen:
Pruebe estas 2 funciones
: La primera es para averiguar si hay una orden con el mismo precio abierto ya

La segunda es para comprobar si hay una orden que está a menos de nnn puntos del precio deseado

Ambas devuelven true si el precio es igual o si la distancia del precio de algunas órdenes abiertas actualmente está dentro de la distancia especificada

bool existsAtSamePrice(int magicNumber, double price)

{

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

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol()!=Symbol()) continue;

if (OrderMagicNumber()!=magicNumber) continue;

if (CompareDouble(OrderOpenPrice(),price)) return(true);

}

return(false);

}

//

//

//

//

//

bool existsAtApproximatePrice(int magicNumber, double price, double distance)

{

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

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol()!=Symbol()) continue;

if (OrderMagicNumber()!=magicNumber) continue;

if (MathAbs(OrderOpenPrice()-price)< distance) return(true);

}

return(false);

}

//

//

//

//

//

bool CompareDouble(double val1, double val2)

{

return(NormalizeDouble(val1,Digits)==NormalizeDouble(val2,Digits));

}

 

¿Cómo codificar?

Hola Pip,

Gracias por los fragmentos de código, es genial la forma en que la gente puede compartir ideas y estilos de codificación, a medida que mi conocimiento crece puedo sacar lecciones de gente como tú y mladen.

Pip:
Perfecto. Gracias.
 

Hola,

Tengo una pregunta.

Si quiero eliminar todos los objetos que contienen en el nombre la palabra "ejemplo" con el comando ObjectDelete ¿cómo debo escribir el código?

Por ejemplo

Nombre del objeto

"Ejemplo13241"

"Ejemplo453623"

Quiero borrar todos los objetos que contengan la palabra "Ejemplo".

Muchas gracias

 

...

Utilice algo como esto (esto eliminará todos los objetos que tienen nombres que comienzan con "Ejemplo") :

string lookFor = "Example";

int lookForLength = StringLen(lookFor);

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

{

string objectName = ObjectName(i);

if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);

}

dasio:
Hola,

Tengo una petición.

Si quiero borrar todos los objetos que contienen en el nombre la palabra "ejemplo" con el comando ObjectDelete ¿cómo debo escribir el código?

Para Ejemplo

Nombre del objeto

"Ejemplo13241"

"Ejemplo453623"

Quiero borrar todos los objetos que contengan la palabra "Ejemplo".

Muchas gracias
 
mladen:
Usa algo como esto (esto borrará todos los objetos que tienen nombres que comienzan con "Ejemplo") :
string lookFor = "Example";

int lookForLength = StringLen(lookFor);

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

{

string objectName = ObjectName(i);

if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);

}

Gracias, es perfecto.

Tengo otra pregunta ^^.

He creado un segmento de línea de tendencia en el gráfico con la longitud declarada. Puedo establecer el color y está bien. Me gustaría saber si es posible establecer más de un color en la misma línea de tendencia.

Por ejemplo para la primera parte 1/3 un color, para la parte 2/3 otro color y para la parte 3/3 otro.

¿Es posible?

Gracias^^

 

..

En resumen, si te refieres a objetos, la respuesta es no. Tendrías que crear 3 objetos para eso

Si te refieres a búferes para eso, entonces necesitarías 5 búferes de dibujo para una línea de 3 colores sin repintar, y como sólo hay 8 búferes de dibujo, eso te limita bastante

dasio:
Gracias es perfecto.

Tengo otra pregunta ^^.

Creo un segmento de línea de tendencia en el gráfico con longitud declarada. Puedo establecer el color y está bien. Me gustaría saber si es posible establecer más de un color en la misma línea de tendencia.

Por ejemplo para la primera parte 1/3 un color, para la parte 2/3 otro color y para la parte 3/3 otro.

¿Es posible?

Gracias^^