Comment coder ? - page 250

 
mladen:

Bonjour Mladen, merci pour votre aide, j'ai appliqué vos modifications mais cela ne fonctionne pas vraiment, peut-être serait-il plus simple si l'EA ignorait simplement toutes les positions ouvertes existantes, c'est-à-dire les laissait ouvertes, puis ouvrait et fermait sa propre nouvelle position unique.

Actuellement, il ouvre et ferme sa propre position, mais il ferme également toutes les positions ouvertes supplémentaires.

 

augmenter

À partir d'un code partiel, voici ce que je pourrais suggérer. Si un paramètre booléen NoClosesisest créé, et si ce paramètre est mis à true, il ne devrait pas fermer les ordres s'il est appliqué comme le snippet (si CB et CS sont différents de 1, le code ne fermera pas les ordres).

Salutations

Mladen

increase:
Bonjour Mladen, merci pour votre aide, j'ai appliqué vos modifications mais cela ne fonctionne pas vraiment, peut-être serait-il plus simple si l'EA ignorait simplement toutes les positions ouvertes existantes, c'est-à-dire qu'il les laissait ouvertes, puis ouvrait et fermait sa propre nouvelle position unique Pour le moment, il ouvre et ferme sa propre position, mais il ferme également toutes les positions ouvertes supplémentaires existantes
 
mladen:
augmenter

À partir d'un code partiel, voici ce que je pourrais suggérer. Si un paramètre booléen NoClosesisest créé, et si ce paramètre est mis à true, il ne devrait pas fermer les ordres s'il est appliqué comme le snippet (si CB et CS sont différents de 1, le code ne fermera pas les ordres).

Salutations

Mladen

C'est vrai, mais à moins que j'aie mal compris, cela signifie que la transaction ouverte par l'EA ne sera jamais clôturée et qu'elle alternera entre achat et vente ?

 

Oui, c'est exact.

D'après ce que j'ai compris, c'était votre idée : laisser l'EA ouvrir des ordres et ensuite gérer les ordres (les fermer) manuellement. Avec ce paramètre, vous pouvez même le remettre sur false et l'EA recommencera à fermer les ordres - il est donc "contrôlable de l'extérieur", en quelque sorte.

increase:
C'est vrai, mais à moins que j'aie mal compris, cela signifie que la transaction ouverte par l'EA ne sera jamais clôturée et qu'elle passera simplement de l'achat à la vente ?
 
mladen:
Oui, c'est correct. Si j'ai bien compris, c'était votre idée : laisser l'EA ouvrir des ordres et ensuite gérer les ordres (les fermer) manuellement. Avec ce paramètre, vous pouvez même le remettre sur false et l'EA recommencera à fermer les ordres - il est donc "contrôlable de l'extérieur", en quelque sorte.

Ah désolé, j'étais ambigu, je veux que l'EA ouvre et ferme son ordre et ignore les ordres existants, donc par exemple

1. J'ai 5 ordres de vente ouverts

2. J'applique l'EA qui ouvre 1 ordre d'achat

3. J'ai maintenant 5 ventes et 1 achat

4. L'EA déclenche maintenant une vente et ferme son achat.

5. J'ai maintenant 6 ordres de vente (5 existants, 1 ordre de vente de l'EA).

6. L'EA déclenche maintenant un achat et ferme donc sa vente.

7. J'ai maintenant 5 ventes et 1 achat, etc.

Je vais fermer les ventes existantes, l'EA ignore toutes les autres transactions à part les siennes comme ci-dessus.

 

augmenter

Il le fait déjà si vous définissez le paramètre "Magic" à une valeur différente de 0 (c'est une partie du code qui vérifie s'il doit fermer un ordre d'achat juste avant l'ordre de fermeture).

if(OrderType()==OP_BUY&&OrderSymbol()==Symbol()&&( (OrderMagicNumber()==Magic)||Magic==0))

Donc si le paramètre"Magic" n'est pas égal à 0 et à condition que la valeur de Magic soit unique, il ne fermera que les ordres ouverts par lui-même

increase:
Ah désolé, j'étais ambigu, je veux que l'EA ouvre et ferme son ordre et ignore les ordres existants, donc par exemple

1. J'ai 5 ordres de vente ouverts

2. J'applique l'EA, il ouvre 1 ordre d'achat

3. J'ai maintenant 5 ventes et 1 achat

4. L'EA déclenche maintenant une vente et ferme son achat.

5. J'ai maintenant 6 ordres de vente (5 existants, 1 ordre de vente de l'EA).

6. L'EA déclenche maintenant un achat et ferme donc sa vente.

7. J'ai maintenant 5 ventes et 1 achat etc.

Je vais fermer les ventes existantes, l'EA ignore toutes les autres transactions à part les siennes comme ci-dessus.
 

Trade OncePerBar pour une TimeFrame spécifique

Bonjour, chers fEllA's !

J'ai un EA (yeeaa, qui n'en a pas) qui fonctionne bien sur le testeur, prend plusieurs trades par barre 4H, comme indiqué. Maintenant, en testant sur Demo (Alpari UK) avec 11 paires, l'EA ne prend qu'un seul trade, alors qu'il devrait en prendre plus (3 max, comme indiqué). Seulement chaque barre 4H, si les conditions sont remplies.

J'ai codé la fonction 'Semaphor' avec GlobalVariable, et ce morceau de code, pour empêcher l'ouverture de plusieurs ordres dans une TimeFrame prédéfinie (4H dans ce cas) :

//Acheter

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))

{

if (SignalsOnly)

{

// L'alerte ------ ne doit être déclenchée qu'une fois par signal OU une fois toutes les 15 ou 30 minutes.

si (CheckAlertTime == iTime (NULL, 5, 0)) return(0) ;

sinon CheckAlertTime = iTime (NULL, 5, 0) ;

if (Alerts) Alert (Symbol() + " " + DoubleToStr (Ask, Digits) + " BUY Signal") ;

if (PlaySounds) PlaySound (WhichSound) ;

}

if (!IsTrade && !SignalsOnly)

{

si (CheckAlertTime == iTime (NULL, OncePerBarTF, 0)) return (0) ;

sinon CheckAlertTime = iTime (NULL, OncePerBarTF, 0) ;

//Contrôle de la marge libre

if (AccountFreeMargin() < (1000 * Lots))

{

Print ("Nous n'avons pas d'argent. Marge libre = ", AccountFreeMargin()) ;

return(0) ;

}

if (UseTakeProfit && CloseLotsPercent == 100) TakeProfitLevel = Ask + TakeProfit * Point ; sinon TakeProfitLevel = 0.0 ;

{

if (MoneyManagement) Lots = NormalizeDouble ((AccountFreeMargin() * Risk / 100 / ((Ask - BuySL) / Point / TickValue)), 2) ;

sinon Lots = Lots ;

}

si (TradeIsBusy() && IsTradingAllowed() < 0)

return (-1) ;

RefreshRates() ;

Ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "7Qi BUY " + MagicNo, MagicNo, 0, DodgerBlue) ;

si (Ticket > 0)

{

if (OrderSelect (Ticket, SELECT_BY_TICKET, MODE_TRADES))

{

Print ("7Qi BUY ouvert : ", OrderOpenPrice()) ;

if (Alerts) Alert (Symbol() + " " + DoubleToStr (Ask, Digits) + " BUY opened") ;

if (PlaySounds) PlaySound (WhichSound) ;

}

sinon

{

Print ("Erreur lors de l'ouverture de BUY : ", Err) ;

}

}

// TradedThisBar = Bars ;

if (EachTickMode) TickCheck = True ;

if (!EachTickMode) BarCount = Bars ;

TradeIsNotBusy() ;

retourne (0) ;

}

}

//-------------------------------------------------

Est-il possible que ce code :

si (CheckAlertTime == iTime (NULL, OncePerBarTF, 0)) return (0) ;

sinon CheckAlertTime = iTime (NULL, OncePerBarTF, 0) ;

empêche l'EA de trader au milieu de l'heure ? Est-ce qu'il vérifie seulement au début de la barre ?

Si j'utilise la fonction "TradedThisBar = Bars", je devrais laisser EA sur 1 TimeFrame seulement, correct ?

La fonction 'Semaphor' est également codée dans les TrailingStops et les PartialCloseLots.

Merci à tous pour votre aide,

Amusez-vous bien,

Simon

Slovénie

 

Iiiiiik - J'ai trouvé le problème

Bonjour !

J'ai trouvé le problème - c'est très probablement la combinaison de :

if (TradeIsBusy() /*&& IsTradingAllowed()*/ < 0)

retour (-1) ;

//-----------------------------------------------------------------------------------------

int IsTradingAllowed (int MaxWaitingSec = 30)

{

if (!IsTradeAllowed())

{

int StartWaitingTime = GetTickCount() ;

Print ("Le contexte commercial est occupé ! Attendez qu'il soit libre...") ;

if (Alerts) Alert (Symbol() + " EA trading not allowed ! Attente...") ;

while (true)

{

if (IsStopped())

{

Print ("L'EA a été arrêtée !") ;

return(-1) ;

}

si (GetTickCount() - StartWaitingTime > MaxWaitingSec * 1000 )

{

Print( "Limite d'attente dépassée (" + MaxWaitingSec + " sec) !" ) ;

retour(-2) ;

}

si (IsTradeAllowed())

{

Print ("Le contexte commercial est maintenant libre !") ;

return(0) ;

}

Sleep (100) ;

}

}

else

{

Print ("Le contexte commercial est libre !") ;

retour(1) ;

}

}

*/

//-----------------------------------------------

int TradeIsBusy (int MaxWaitingSec = 30)

{

if (IsTesting()) return(1) ;

int Err = 0, StartWaitingTime = GetTickCount() ;

while (true)

{

si (IsStopped())

{

Print ("L'EA a été arrêtée !") ;

return(-1) ;

}

si (GetTickCount() - StartWaitingTime > MaxWaitingSec * 1000)

{

Print ("Temps d'attente (" + MaxWaitingSec + " sec) dépassé !") ;

if (Alerts) Alert (Symbol() + " EA waiting time exceeded !") ;

retour(-2) ;

}

si (GlobalVariableCheck ("TradeIsBusy"))

break ;

sinon

{

Err = GetLastError() ;

si (Err != 0)

{

Print ("TradeIsBusy - GlobalVariableCheck - Error # ", Err) ;

Sleep (100) ;

continuer ;

}

}

if (GlobalVariableSet ("TradeIsBusy", 1.0) > 0) return(1) ;

sinon

{

Err = GetLastError() ;

si (Err != 0)

{

Print ("TradeIsBusy - GlobalVariableSet - Error # ", Err) ;

Sleep(100) ;

continuer ;

}

}

}

while (true)

{

if (IsStopped())

{

Print ("L'EA a été arrêtée !") ;

return(-1) ;

}

si (GetTickCount() - StartWaitingTime > MaxWaitingSec * 1000)

{

Print ("Temps d'attente (" + MaxWaitingSec + " sec) dépassé !") ;

si (Alertes) Alert (Symbol() + " temps d'attente dépassé !") ;

retour (-2) ;

}

if (GlobalVariableSetOnCondition ("TradeIsBusy", 1.0, 0.0 )) return (1) ;

sinon

{

Err = GetLastError() ;

si (Err != 0)

{

Print ("TradeIsBusy - GlobalVariableSetOnCondition - Error # ", Err) ;

continuer ;

}

}

if (Alerts) Alert (Symbol() + " - waiting another EA to finish trading...") ;

Sleep (1000) ;

}

}

//--------------------------------

void TradeIsNotBusy()

{

int Err ;

si (IsTesting())

{

return(0) ;

}

while (true)

{

if (IsStopped())

{

Print (Symbol() + " L'EA a été interrompue !" ) ;

retour(-1) ;

}

si (GlobalVariableSet ("TradeIsBusy", 0.0) > 0) return(1) ;

sinon

{

Err = GetLastError() ;

si (Err != 0)

Print ("TradeIsNotBusy - GlobalVariableSet - Error # ", Err) ;

}

Sleep (100) ;

}

}

//-----------------------------------------------------------------------------------------------

Je vais essayer sans la fonction IsTradeAllowed.

Merci quand même,

Amusez-vous bien,

Simon

 

code d'erreur 130

----- supprimé ----- ce n'est plus nécessaire......

 

Tutoriel mq4 téléchargeable

Salut les gars,

Je n'arrive pas à trouver un tutoriel ou un livre de référence (pas en ligne ! !) sur le code mq4.

Pouvez-vous m'aider ?

Meilleures salutations

SOLVÉ, j'ai dû décompresser le fichier avec un utilitaire.

Raison: