Come codificare? - pagina 114

 
matrixebiz:
Come posso impostare le ore di trading a tempo in un EA?

Stavo provando questo;

int TradeHour;

if(Hour()17) TradeHour = false;

ma non sembra obbedire alla regola, fa solo trading ogni volta che e ho && TradeHour nelle mie dichiarazioni di acquisto/vendita.

Grazie

Hai provato a definire TradeHour come un booleano invece di un intero?

bool TradeHour;

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

Inoltre potresti aver bisogno delle parentesi aggiuntive.

 
matrixebiz:
Come posso impostare le ore di trading a tempo in un EA?

Stavo provando questo;

int TradeHour;

if(Hour()17) TradeHour = false;

ma non sembra obbedire alla regola, fa solo trading ogni volta e ho && TradeHour nelle mie dichiarazioni di acquisto/vendita.

Grazie

Come può Hour() essere minore di 9 E maggiore di 17? Volevi dire Or (||)?

Lux

 
luxinterior:
Come può Ora() essere minore di 9 E maggiore di 17? Volevi dire Or (||)? Lux

Buon punto luxinterior! Questo è un problema definitivo. Mi era sfuggito.

 

Scusa, volevo dire ||

e stavo provando questo a;

//+---------Variabili dell'ora di trading------------------

// se (Hour() < StartHour) TradeHourS = false;

//se (Hour() > EndHour) TradeHourE = false;

Quindi se StartHour=5 e EndHour=17 dovrebbe scambiare solo in quelle ore, giusto?

Ma scambia comunque in qualsiasi momento? E' un problema usando lo Strategy Tester?

 

Perché non usare l'esempio direttamente dal file di aiuto?

bool is_siesta=false;

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

is_siesta=true;

Lux

 

Restituzione di una stringa da una DLL c/c++ con funzioni esportate

Ciao a tutti,

Ho sviluppato una serie di funzioni per gestire le impostazioni di configurazione da un EA.

Queste funzioni sono esportate da una DLL c++ e ogni funzione esportata ha la convezione di chiamata __stdcall richiesta dal mio MQL4.

Il mio problema sorge quando una funzione deve restituire una stringa all'EA.

Naturalmente la funzione non può

- restituire un puntatore a una variabile locale (la variabile va fuori portata)

- restituire un puntatore a una variabile globale della dll (problemi con l'accesso concorrente)

- restituire un puntatore a una stringa allocata nell'heap (servono funzioni per liberare la memoria per essere chiamate dall'EA: questo approccio non mi piace)

Così ho risolto di passare una stringa e la dimensione della stringa dall'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) );

e non aggiungendo il carattere nullo finale.

Ma quando viene chiamato da MQL, non ritorna nessuna stringa.

Qualcuno ha una risposta?

 
luxinterior:
Perché non usare semplicemente l'esempio direttamente dal file di aiuto?

bool is_siesta=false;

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

is_siesta=true;

Lux

Sì, ho provato anche questo;

bool TradeHour=false;

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

ma la linea OR non funziona perché se l'ora è 22 allora soddisfa la prima parte "if(Hour()>=12" e fa ancora trading quando vuole e ho aggiunto && TradeHour alle dichiarazioni di acquisto/vendita. Il secondo esempio che ho dato dovrebbe funzionare, ma non lo capisco.

 
luxinterior:
Perché non usare semplicemente l'esempio direttamente dal file di aiuto?

bool is_siesta=false;

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

is_siesta=true;

[/code]

Lux

Penso che se il vostro obiettivo è fare trading tra le 12:00 e le 17:00 dovete semplicemente fare quanto segue:

[codice]

bool TradingEnabled=false; // variabile globale

...

...

TradingEnabled=false; // Azzeramento ad ogni esecuzione del tic

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

TradingEnabled=true;

...

...

if( TradingEnabled )

{

// Logica di trading qui

}

...

...

 
gorgoroth:
Penso che se il tuo obiettivo è quello di negoziare tra le 12:00 e le 17:00 devi semplicemente fare quanto segue:

bool TradingEnabled=false; // Global variable

...

...

TradingEnabled=false; // Reset every tic run

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

TradingEnabled=true;

...

...

if( TradingEnabled )

{

// Trading logic here

}

...

...

Non sto facendo la stessa cosa facendo così?

if (Hour() 17) TradeHour = false;

Cioè, se l'ora è tra 12 e 17 TradeHour=true, giusto?

(Aggiungendo && TradeHour nella mia dichiarazione di acquisto/vendita)

 
luxinterior:
Come può Hour() essere minore di 9 E maggiore di 17? Volevi dire Or (||)? Lux

Oh, e volevo dire && perché hai ragione, l'ora non può essere minore di 9 E maggiore di 17, il che rende l'affermazione falsa, ma se l'ora è 10 allora non è minore di 9 E non maggiore di 17, quindi l'affermazione diventa vera.

Forse farlo in questo modo confonde MT4, comunque questo modo funziona;

int TradeHour;

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

Grazie