Comment coder ? - page 114

 
matrixebiz:
Comment configurer les heures de trading dans un EA ?

J'ai essayé ceci ;

int TradeHour ;

if(Hour()17) TradeHour = false ;

mais cela ne semble pas obéir à la règle, il se contente de négocier à tout moment et j'ai && TradeHour dans mes déclarations d'achat et de vente.

Merci

Avez-vous essayé de définir TradeHour comme un booléen au lieu d'un entier ?

bool TradeHour;

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

De plus, vous aurez peut-être besoin des parenthèses supplémentaires.

 
matrixebiz:
Comment puis-je configurer les heures de trading dans un EA ?

J'ai essayé ceci ;

int TradeHour ;

if(Hour()17) TradeHour = false ;

mais cela ne semble pas obéir à la règle, il se contente de négocier à tout moment et j'ai && TradeHour dans mes déclarations d'achat et de vente.

Merci

Comment Hour() peut-il être inférieur à 9 ET supérieur à 17 ? Vouliez-vous dire Or (||) ?

Lux

 
luxinterior:
Comment Hour() peut être inférieur à 9 ET supérieur à 17 ?? Voulez-vous dire Ou (||) ? Lux

Bon point luxinterior ! C'est un vrai problème. Cela m'a échappé.

 

Désolé, je voulais dire |||

et j'essayais ceci pour ;

//+---------Variables des heures de négociation------------------

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

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

Donc, si StartHour=5 et EndHour=17, il ne devrait négocier que pendant ces heures, n'est-ce pas ?

Mais il négocie quand même n'importe quand... Est-ce un problème d'utilisation du testeur de stratégie?

 

Pourquoi ne pas simplement utiliser l'exemple directement issu du fichier d'aide ?

bool is_siesta=false;

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

is_siesta=true;

Lux

 

Retourner une chaîne de caractères à partir des fonctions exportées d'une DLL c/c++.

Bonjour à tous,

J'ai développé un ensemble de fonctions pour gérer les paramètres de configuration d'un EA.

Ces fonctions sont exportées par une DLL c++ et chacune des fonctions exportées a la convetion d'appel __stdcall demandée par mon MQL4.

Mon problème survient lorsqu'une fonction doit retourner une chaîne de caractères à l'EA.

Naturellement, la fonction ne peut pas :

- renvoyer un pointeur vers une variable locale (la variable sort de la portée)

- retourner un pointeur vers une variable globale de la dll (problèmes d'accès concurrents)

- renvoyer un pointeur vers une chaîne de caractères allouée au tas (il faut des fonctions pour libérer la mémoire et les appeler depuis l'EA : je n'aime pas cette approche).

J'ai donc décidé de passer une chaîne de caractères et sa taille à partir de l'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) );

et de ne pas ajouter le caractère nul de fin de chaîne.

Mais lorsqu'on l'appelle depuis MQL, aucune chaîne n'est renvoyée.

Quelqu'un a-t-il une réponse ?

 
luxinterior:
Pourquoi ne pas utiliser l'exemple directement dans le fichier d'aide ?

bool is_siesta=false;

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

is_siesta=true;

Lux

Oui, j'ai essayé ça aussi ;

bool TradeHour=false ;

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

mais la ligne OR ne fonctionne pas parce que si Hour est 22 alors la première partie "if(Hour()>=12" est satisfaite et TradeHour quand il le veut. J'ai ajouté && TradeHour aux instructions Buy/Sell. Le deuxième exemple que j'ai donné devrait faire l'affaire, mais je ne le comprends pas.

 
luxinterior:
Pourquoi ne pas utiliser l'exemple directement issu du fichier d'aide ?

bool is_siesta=false;

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

is_siesta=true;

[/code]

Lux

Je pense que si votre objectif est de trader entre 12:00 et 17:00, vous devez simplement faire ce qui suit :

[code]

bool TradingEnabled=false ; // Variable globale

...

...

TradingEnabled=false ; // Remise à zéro à chaque tic run

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

TradingEnabled=true ;

...

...

if( TradingEnabled )

{

// La logique de négociation est ici

}

...

...

 
gorgoroth:
Je pense que si votre objectif est de négocier entre 12:00 et 17:00, vous devez simplement faire ce qui suit :

bool TradingEnabled=false; // Global variable

...

...

TradingEnabled=false; // Reset every tic run

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

TradingEnabled=true;

...

...

if( TradingEnabled )

{

// Trading logic here

}

...

...

Ne fais-je pas la même chose en faisant ceci ?

si (Hour() 17) TradeHour = false ;

Autrement dit, si l'heure est comprise entre 12 et 17, TradeHour=true, n'est-ce pas ?

(J'ajoute && TradeHour dans ma déclaration d'achat et de vente).

 
luxinterior:
Comment Hour() peut-elle être inférieure à 9 ET supérieure à 17 ? Vouliez-vous dire Or (||) ? Lux

Oh, et je voulais dire && parce que vous avez raison, l'heure ne peut pas être inférieure à 9 et supérieure à 17, ce qui rend la déclaration fausse, mais si l'heure est 10, elle n'est pas inférieure à 9 et pas supérieure à 17, donc la déclaration devient vraie.

Peut-être que cette façon de faire perturbe l'achat de MT4, mais cette façon de faire fonctionne ;

int TradeHour ;

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

Merci