Aide au codage - page 39

 

J'ai écrit cette ligne de code.

int TriggerChart = PERIOD_H4 ;

int FastMACDPeriod = 12 ;

int SlowMACDPeriod = 26 ;

int SignalPeriod = 9 ;

MacdCurrent = iMACD(Symbol(), TriggerChart, FastMACDPeriod,SlowMACDPeriod,SignalPeriod, PRICE_CLOSE, MODE_MAIN, 1) ;

Avec ces variables insérées, je me demande si l'EA est capable d'identifier que TriggerChart est 'int timeframe', et que les autres sont utilisées pour les périodes int ? Se pourrait-il que lorsqu'elles sont toutes ensemble, l'EA regarde TriggerChart et FastMACDPeriod par exemple et pense qu'elles sont toutes deux liées à int timeframe et s'embrouille ? A quel moment l'EA reconnaît-il quelle variable s'applique à quelle partie d'iMACD ?

 

...

En bref : non, il ne peut pas s'embrouiller (les ordinateurs sont bons à cela, ils ne pensent pas mais ils exécutent les mêmes choses encore et encore sans les interpréter).

Lorsque vous appelez une fonction, elle accepte les paramètres dans un certain ordre (par exemple : le premier paramètre est le symbole, le second est la période,,,, et ainsi de suite) La façon dont vous déclarez (les types) les variables lorsque vous appelez une fonction est tout à fait pertinente : elles sont strictement utilisées en fonction de leur place dans la liste d'appel des paramètres.

crsnape@btinternet.com:
J'ai écrit cette ligne de code.

int TriggerChart = PERIOD_H4 ;

int FastMACDPeriod = 12 ;

int SlowMACDPeriod = 26 ;

int SignalPeriod = 9 ;

MacdCurrent = iMACD(Symbol(), TriggerChart, FastMACDPeriod,SlowMACDPeriod,SignalPeriod, PRICE_CLOSE, MODE_MAIN, 1) ;

Avec ces variables insérées, je me demande si l'EA est capable d'identifier que TriggerChart est 'int timeframe', et les autres utilisées pour les périodes int ? Se pourrait-il que lorsqu'elles sont toutes ensemble, l'EA regarde TriggerChart et FastMACDPeriod par exemple et pense qu'elles sont toutes deux liées à int timeframe et s'embrouille ? A quel moment l'EA reconnaît-il quelle variable s'applique à quelle partie d'iMACD ?
 

Merci mladen. Cela semble logique.

Avec ce code, j'ai déclaré BarsGV comme 0 dans la fonction int init(). Mais, comme vous le dites justement, si j'obtiens une erreur, elle renvoie toujours false. Je pensais juste qu'au lieu de le déclarer 0 dans int init(), je pourrais le remettre à 1. Qu'en pensez-vous ? J'ai une 200SMA et si les barres sont inférieures à 200, il y a une erreur ici de toute façon.

Donc à la place de ceci

int init()

{

//---

GlobalVariableSet (BarsGV, 0) ;

//---

return(0) ;

}

CECI EST SOUS INT START()

si ((GlobalVariableGet (BarsGV) == 0) || (GlobalVariableGet (BarsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV, false) ;

GlobalVariableSet(BarsGV, Bars) ;

}

//--- Vérification de la possibilité d'une position longue (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Passez à ceci :

int init()

{

//---

GlobalVariableSet (BarsGV, 1) ;

//---

return(0) ;

}

CECI EST SOUS INT START()

si (GlobalVariableGet (BarsGV) == 0) ;

{

Print("Erreur avec la variable globale BarsGV", GetLastError()) ;

return(0) ;

}

si (GlobalVariableGet (BarsGV) < Bars)

{

GlobalVariableSet(HasOrderedGV, false) ;

GlobalVariableSet(BarsGV, Bars) ;

}

//--- Vérifier la possibilité d'une position longue (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Qu'en pensez-vous ?

 

...

Changez-le en ceci :

int BarsGV;

bool HasOrderedGV;

int init()

{

//---

BarsGV=0;

HasOrderedGV=false;

//---

return(0);

}

THIS IS UNDER INT START()

if (BarsGV < Bars)

{

HasOrderedGV=false;

BarsGV=Bars;

}

//--- Check for long position (BUY) possibility

if (HasOrderedGV == false)

{[/PHP]

That way you are going to avoid other EA interference and you will keep the variables to only one instance of Ea (they can not mix at all). Much better to do it that way (even from the speed of execution point of view). But you still risk of opening a new order on a same bar this way. The best way is to use a function to count orders opened at the current bar and then allow or disallow ner order opening

Here is a function that can do that (it will check currently opened as well as already closed orders if they have been opened on a current bar) :

bool uniqueOnBar(int MagicNumber)

{

datetime startTime = Time[0];

datetime endTime = startTime+60*Period();

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 (OrderOpenTime()endTime) continue;

return(false);

}

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

{

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

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

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime()endTime) continue;

return(false);

}

return(true);

}

Checking would be very simple :

[PHP]if (uniqueOnBar(MagicNumber)) .... you can open an a new order

De cette façon, vous ne dépendez d'aucune variable mais seulement des ordres et c'est la seule façon 100% fiable.

crsnape@btinternet.com:
Merci mladen. Cela semble logique.

Avec ce code, j'ai déclaré BarsGV comme 0 dans la fonction int init(). Mais, comme vous le dites justement, si j'obtiens une erreur, elle renvoie toujours false. Je pensais juste qu'au lieu de déclarer 0 dans la fonction int init(), je pourrais le remettre à 1. Qu'en pensez-vous ? J'ai une 200SMA et si les barres sont inférieures à 200, il y a une erreur ici de toute façon.

Donc à la place de ceci

int init()

{

//---

GlobalVariableSet (BarsGV, 0) ;

//---

return(0) ;

}

CECI EST SOUS INT START()

si ((GlobalVariableGet (BarsGV) == 0) || (GlobalVariableGet (BarsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV, false) ;

GlobalVariableSet(BarsGV, Bars) ;

}

//--- Vérification de la possibilité d'une position longue (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Passez à ceci :

int init()

{

//---

GlobalVariableSet (BarsGV, 1) ;

//---

return(0) ;

}

CECI EST SOUS INT START()

si (GlobalVariableGet (BarsGV) == 0) ;

{

Print("Erreur avec la variable globale BarsGV", GetLastError()) ;

return(0) ;

}

si (GlobalVariableGet (BarsGV) < Bars)

{

GlobalVariableSet(HasOrderedGV, false) ;

GlobalVariableSet(BarsGV, Bars) ;

}

//--- Vérifier la possibilité d'une position longue (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Qu'en pensez-vous ?
 

Superstar. Merci.

 

Salut mladen,

Cette partie :

datetime EndTime = StartTime + 60 * Period() ;

Period() est dans ce cas l'intervalle de temps du graphique. Donc disons H4 (240) * 60 car EndTime est enregistré en secondes, donc conversion de 240minutes en secondes pour correspondre aux minutes de Period (240) ?

Est-ce que je lis bien ?

Cela pourrait-il aussi être écrit :

datetime EndTime = (StartTime / 60) + Period(); ?

 

...

Oui, vous lisez bien

Quant à l'autre formulaire : vous ne pouvez pas l'utiliser car l'OrderOpenTime() est dans un format de date standard, ce qui signifie que dans EndTime vous devez avoir le nombre de secondes écoulées depuis le 1er janvier 1970 et la façon dont vous l'avez écrit contiendrait des minutes - metatrader supposerait que ce sont des secondes et donnerait des résultats erronés.

crsnape@btinternet.com:
Salut mladen,

Cette partie :

datetime EndTime = StartTime + 60 * Period() ;

Period() est dans ce cas l'intervalle de temps du graphique. Donc disons H4 (240) * 60 car EndTime est enregistré en secondes, donc conversion de 240minutes en secondes pour correspondre aux minutes de Period (240) ?

Est-ce que je lis bien ?

Cela pourrait-il aussi être écrit :

datetime EndTime = (StartTime / 60) + Period(); ?
 

Bonjour mladen, est-ce que la boucle for ici sélectionne le dernier ordre ouvert ou en attente?

bool UniqueOnBar (int MagicNumber)

{

datetime StartTime = Time[0] ;

datetime EndTime = StartTime + 60 * Period (TriggerChart) ;

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 ;

si (OrderOpenTime() endTime) continue ;

return(false) ;

}

Donc, là où le point d'exclamation est interprété comme 'non', je pense que ce n'est pas correct dans mon cas car je veux.. :

- Sélectionner le dernier ordre ouvert ou en attente, donc supprimer ! pour laisser OrderSelect ?

- OrderSymbol() soit le même que Symbol()

- OrderMagicNumber() doit être égal à MagicNumber, donc...il reste ceci :

intTriggerChart= PERIOD_H4 ;

int MagicNumber = 42 ;

bool UniqueOnBar (int MagicNumber)

{

datetime StartTime = Time[0] ;

datetime EndTime = StartTime + 60 * Period(TriggerChart) ;

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

{

si (OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continuer ;

si (OrderSymbol() == Symbol()) continue ;

si (OrderMagicNumber() == MagicNumber) continue ;

si (OrderOpenTime() endTime) continue ;

return(false) ;

}

 

Je réalise maintenant que c'est lorsque l'expression retourne vrai qu'aucun ordre ouvert n'est pris en compte sur la barre actuelle.

 

...

Oui, c'est le cas. Donc, si elle renvoie tru, vous pouvez ouvrir un nouvel ordre.

De plus, si vous voulez tester un cadre temporel différent du cadre temporel actuel si un ordre a été ouvert sur la barre actuelle du cadre temporel cible, alors la fonction peut être changée en quelque chose comme ceci :

bool UniqueOnBar (int MagicNumber, int timeFrame=0)

{

if (timeFrame==0) timeFrame=Period();

datetime StartTime = iTime(NULL,timeFrame,0);

datetime EndTime = StartTime + 60*timeFrame;

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 (OrderOpenTime() EndTime) continue;

return(false);

}

return(true);

}

[/PHP]

And then the call to it would be for your example 2 posts ago

[PHP]if (UniqueOnBar(MagicNumber,TriggerChart) ... open an order

PS : vous avez supprimé la vérification des ordres fermés de l'exemple. Si vous souhaitez également vérifier les ordres fermés, utilisez la deuxième partie de la forme originale de la fonction.

crsnape@btinternet.com:
Je me rends compte maintenant que c'est lorsque l'expression renvoie vrai qu'aucun ordre ouvert n'est pris sur la barre actuelle.
Raison: