¿Cómo codificar? - página 114

 
matrixebiz:
¿Cómo configuro las horas de comercio en un EA?

Estaba probando esto

int HoraTrade;

if(Hour()17) TradeHour = false;

pero no parece obedecer la regla, sólo negocia cuando sea y tengo && TradeHour en mis declaraciones de compra/venta.

Gracias

¿Has probado a definir TradeHour como un booleano en lugar de un entero?

bool TradeHour;

if ((Hour()17)){ TradeHour = false;}

Además, es posible que necesite los paréntesis adicionales.

 
matrixebiz:
¿Cómo configuro las horas de negociación en un EA?

Estaba probando esto

int HoraTrade;

if(Hour()17) TradeHour = false;

pero no parece obedecer la regla, sólo negocia cuando sea y tengo && TradeHour en mis declaraciones de compra/venta.

Gracias

¿Cómo puede Hour() ser menor que 9 y mayor que 17? ¿Quieres decir O (||)?

Lux

 
luxinterior:
¿Cómo puede Hour() ser menor que 9 Y mayor que 17? ¿Querías decir O (||)? Lux

¡Buen punto luxinterior! Eso es un verdadero problema. Me lo he perdido.

 

Lo siento, quise decir ||

y estaba intentando esto;

//+---------Variables de la hora de comercio------------------

// si (Hora() < HoraInicial) TradeHourS = false

// si (Hora() > HoraFinal) TradeHourE = false;

Así que si StartHour = 5 y EndHour = 17 sólo debe el comercio dentro de esas horas correctas?

Pero el comercio en cualquier momento todavía? ¿Es un problema utilizando el Probador de Estrategias?

 

¿Por qué no utilizar el ejemplo directamente desde el archivo de ayuda?

bool is_siesta=false;

if(Hour()>=12 || Hour()<17)

is_siesta=true;

Lux

 

Devolver una cadena desde una función exportada de una DLL de c/c++

Hola a todos,

He desarrollado un conjunto de funciones para gestionar los ajustes de configuración de un EA.

Dichas funciones son exportadas por una DLL c++ y cada una de las funciones exportadas tiene la conveción de llamada __stdcall solicitada por mi MQL4.

Mi problema surge cuando una función necesita devolver una cadena al EA.

Naturalmente la función no puede

- devolver un puntero a una variabile local (la variable sale del ámbito)

- devolver un puntero a una variable global dll (problemas de acceso concurrente)

- devolver un puntero a una cadena asignada a la pila (necesita funciones para liberar memoria para ser llamada desde el EA: no me gusta este enfoque)

Así que resolví pasar una cadena y el tamaño de la cadena desde el EA. Es:

string buffer;

GetString( buffer, 30 );

[/CODE]

and from the c++ dll, something like this

void __stdcall GetString( LPTSTR buffer, int BufSize )

{

// Read a string from a some source

....

// -1 to take into account the terminating null character

StringCchCopy( buffer, BufSize-1, ReadStringFromASource );

}

[/CODE]

Here starts the weird behaviour of MQL managing strings returned from a DLL.

using the following code:

string buffer;

GetString( buffer, 30 );

the first time buffer contains the right string. A first question arises: buffer is not initialized but after calling GetString it contains the string returned. I have to suppose that MQL allocates space for a string variable when it's declared.

Next time GetString() is called the string returned seems to be truncated to the length-1 of the previous string length and not resetted as expected because of the 'string buffer;' statement.

Tried even:

[CODE]

string buffer = " "; // 'allocate' 30 blank characters

GetString( buffer, StringLen(buffer) );

but after the first time, when the execution returns to this code, the assignment of buffer does not work any more and buffer still contains the previous read string, and it seems it can only contains the number of characters of his content.

At first I have thought that the null character is not handled very well by MQL and modified the c++ code like this ...

[CODE]

CopyMemory( buffer, ReadStringFromASource, min(BufferSize,ReadStringFromASourceLength) );

y no añadir el carácter nulo de terminación.

Pero cuando se llama desde MQL, no se devuelve ninguna cadena en absoluto.

¿Tiene alguien una respuesta?

 
luxinterior:
¿Por qué no utilizar el ejemplo directamente desde el archivo de ayuda?

bool is_siesta=false;

if(Hour()>=12 || Hour()<17)

is_siesta=true;

Lux

Sí, también lo he intentado;

bool TradeHour=false;

if(Hour()>=12 || Hour()<17) TradeHour=true

pero la línea OR no funciona porque si la Hora resulta ser 22 entonces satisface la primera parte "if(Hora()>=12" y sigue operando cuando quiere y añadí && TradeHour a las declaraciones de Compra/Venta. El segundo ejemplo que di debería ser el truco, no lo entiendo

 
luxinterior:
¿Por qué no utilizar el ejemplo directamente desde el archivo de ayuda?

bool is_siesta=false;

if(Hour()>=12 || Hour()<17)

is_siesta=true;

[/code]

Lux

Creo que si tu objetivo es operar entre las 12:00 y las 17:00 simplemente tienes que hacer lo siguiente:

[código]

bool TradingEnabled=false; // Variable global

...

...

TradingEnabled=false; // Restablecer cada ejecución de tic

if(Hour()>=12 && Hour()<17)

TradingEnabled=true;

...

...

if( TradingEnabled )

{

// Lógica de negociación aquí

}

...

...

 
gorgoroth:
Creo que si tu objetivo es operar entre las 12:00 y las 17:00 simplemente tienes que hacer lo siguiente:

bool TradingEnabled=false; // Global variable

...

...

TradingEnabled=false; // Reset every tic run

if(Hour()>=12 && Hour()<17)

TradingEnabled=true;

...

...

if( TradingEnabled )

{

// Trading logic here

}

...

...

¿No estoy haciendo lo mismo al hacer esto?

if (Hour() 17) TradeHour = false;

Es decir, si la hora está entre 12 y 17 TradeHour=true , ¿correcto?

(Añadiendo && TradeHour en mi declaración de compra/venta)

 
luxinterior:
¿Cómo puede ser Hour() menor que 9 y mayor que 17? ¿Quieres decir O (||)? Lux

Ah, y me refería a && porque tienes razón la hora no puede ser menor que 9 Y mayor que 17 lo que hace que la declaración sea falsa pero si la Hora es 10 entonces no es menor que 9 Y no mayor que 17 por lo que la declaración se vuelve verdadera.

Tal vez haciéndolo de esta manera confunde MT4 comprar de todos modos esta manera funciona;

int HoraTrade;

TradeHour = ((Hour()>=StartHour) && (Hour()<EndHour));

Gracias