Exécution de plus d'une EE à la fois

 
Mon EA fonctionne bien lorsqu'il est exécuté seul, mais si j'essaie d'exécuter le même EA sur un symbole différent au même moment et sur le même profil, le second ne fonctionne pas très bien ou pas du tout ou il y a beaucoup d'erreurs. Cela se produit même si j'utilise Symbol() et des numéros magiques différents pour les deux graphiques séparés. Cela se produit même si j'exécute différentes versions du même code (c'est-à-dire que les noms de fichiers EA et les numéros magiques sont différents mais le code est identique par ailleurs). Est-ce que j'ai un conflit avec les variables globales ou y a-t-il une autre raison pour laquelle le deuxième graphique se bloque ? Merci.
 
Sneck55:
Mon EA fonctionne bien lorsqu'il est exécuté seul, mais si j'essaie d'exécuter le même EA sur un symbole différent au même moment et sur le même profil, le second ne fonctionne pas très bien ou pas du tout ou il y a beaucoup d'erreurs. Cela se produit même si j'utilise Symbol() et des numéros magiques différents pour les deux graphiques séparés. Cela se produit même si j'exécute différentes versions du même code (c'est-à-dire que les noms de fichiers EA et les numéros magiques sont différents mais le code est identique par ailleurs). Est-ce que j'ai un conflit avec les variables globales ou y a-t-il une autre raison pour laquelle le deuxième graphique se bloque ? Merci.

Comme il ne devrait pas y avoir de problème pour exécuter le même EA sur différents graphiques (je le fais sans aucun problème), vous devriez fournir le code... ?
 

Oui, si le deuxième se bloque, il est probable qu'il essaie d'utiliser la même ressource que le premier.


Sneck55


Il vaut mieux nous montrer le code et nous vous indiquerons lequel est le coupable, si cela ne prend pas trop de temps.

 
utilisez le bouton SRC!
 
gooly: utilisez le bouton SRC!
Quelle partie de SRC n'était pas claire ? Pourquoi ne l'avez-vous pas fait ? Modifiez votre message !

  1. Jouer la vidéo
    Veuillez éditer votre message.
    Pour les grandes quantités de code, joignez-le.

  2.          if(BuyTicket != 0)                                        
                {                                                      
                if(SmallMA<MediumMA)
                {
                for(Counter = 0; Counter <=OrdersTotal()-1; Counter++)
                {
                   :
                    Counter--;
                }
    Si l'alimentation électrique est coupée, le système d'exploitation se bloque, le terminal ou le graphique est accidentellement fermé, la prochaine fois, le BuyTicket sera perdu. Vous aurez un ordre ouvert mais n'essayerez jamais de le fermer. Vous n'avez pas besoin de vous souvenir du numéro de ticket lorsque vous utilisez une boucle OrderSelect.
  3. Vous DEVEZ compter à rebours lorsque vous fermez/supprimez. Revenir en arrière ne fonctionnera pas si un autre EA ferme un ordre. Boucles et fermeture ou suppression d'ordres - MQL4 forum
  4. Simplifiez vos booléens
    // if(SmallMA>MediumMA&&MediumMA>LargeMA) MABuyFanning = true;
    // else MABuyFanning = false;
       MABuyFanning = (SmallMA>MediumMA&&MediumMA>LargeMA);
  5. if(NewBar == true)
    Vous n'écrirez jamais if( (2+2) == 4) == true) n'est-ce pas ? if(2+2 == 4) est suffisant. N'écrivez donc pas if(bool == true), utilisez simplement if(bool) ou if(!bool).
 
Le bouton SRC a été utilisé pour faire le post
 
Sneck55:
Le bouton SRC a été utilisé pour faire le post

oui, mais la première ligne "Sorry for the delay...." n'est pas du code et cela a tout gâché
 
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern bool CheckOncePerBar = true;
extern double FixedLotSize = 1;
extern double SystemStopLoss = 150;
extern double TakeProfit = 0;
extern int Slippage = 5;
extern int MagicNumber = 3574;

//Global Variables
int BuyTicket;
int SellTicket;
double InternalStopLoss;
double CalcDigits;
double CalcPoint;
bool MABuyFanning;
bool MASellFanning;
int SelectedOrder;
bool Closed;
int ErrorCode;
string ErrLog;
double BuyStopLoss;
double SellStopLoss;
bool NewBar;
double ThisBarOpen;
double SmallMA;
double MediumMA;
double LargeMA;
int Counter;



//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
CalcDigits = MarketInfo(Symbol(),MODE_DIGITS);//MODE_DIGITS is count of digits after decimal point
if(CalcDigits == 0) CalcPoint = 1;//Dow      
if(CalcDigits == 1) CalcPoint = 0.1;   
if(CalcDigits == 2) CalcPoint = 0.01;//Gold & Nymex
if(CalcDigits == 3) CalcPoint = 0.01;//Yen
if(CalcDigits == 4) CalcPoint = 0.0001;//Not used
if(CalcDigits == 5) CalcPoint = 0.0001;//Non-Yen forex
InternalStopLoss = SystemStopLoss*CalcPoint;
   
   return(INIT_SUCCEEDED);
  }
//-----------------------------------------------

void OnTick()
{

   if(CheckOncePerBar == true)
      {
      if(ThisBarOpen != Open[0])
         {
         ThisBarOpen = Open[0];
         NewBar = true;
         }
      else NewBar = false;
      }
    else NewBar = true;

if(NewBar == true)
{


//Reset Moving Averages
SmallMA = iMA(NULL,0,8,0,1,0,0);
MediumMA = iMA(NULL,0,10,0,1,0,0);
LargeMA = iMA(NULL,0,50,0,1,0,0);


   if(SmallMA>MediumMA&&MediumMA>LargeMA) MABuyFanning = true;
   else MABuyFanning = false;
      
   if(SmallMA<MediumMA&&MediumMA<LargeMA) MASellFanning = true; 
   else MASellFanning = false;   



if(BuyTicket == 0 && MABuyFanning == true)
 {
      RefreshRates();
      BuyStopLoss = Bid - InternalStopLoss;
   //   while(IsTradeContextBusy()) Sleep(10);
      BuyTicket = OrderSend(Symbol(),OP_BUY,FixedLotSize,Ask,Slippage,BuyStopLoss,0,"Buy Order",MagicNumber,0,Green);
          if(BuyTicket == -1)
            {
            ErrorCode = GetLastError();
            Alert("Symbol: ",Symbol(),"Error in buy routine: ",ErrorCode);
            ErrLog = StringConcatenate("Bid: ",MarketInfo(Symbol(),MODE_BID)," Ask: ",MarketInfo(Symbol(),MODE_ASK)," Lots: ",FixedLotSize," Stop Loss: ",BuyStopLoss);
            Print(ErrLog);
            //Buy ticket revert to 0 so it can try again in case of slow connection/timeout etc.
            BuyTicket = 0;
            } 
 }   


if(SellTicket == 0 && MASellFanning == true)
 {
      RefreshRates();
      SellStopLoss = Ask + InternalStopLoss;
    //  while(IsTradeContextBusy()) Sleep(10);
      SellTicket = OrderSend(Symbol(),OP_SELL,FixedLotSize,Bid,Slippage,SellStopLoss,0,"Sell Order",MagicNumber,0,Red);
          if(SellTicket == -1)
            {
            ErrorCode = GetLastError();
            Alert("Symbol: ",Symbol(),"Error in sell routine: ",ErrorCode);
            ErrLog = StringConcatenate("Bid: ",MarketInfo(Symbol(),MODE_BID)," Ask: ",MarketInfo(Symbol(),MODE_ASK)," Lots: ",FixedLotSize," Stop Loss: ",SellStopLoss);
            Print(ErrLog);
            SellTicket = 0;
            } 
  }  

//Exits

         if(BuyTicket != 0)
            {
            if(SmallMA<MediumMA)
            {
            for(Counter = 0; Counter <=OrdersTotal()-1; Counter++)
               {
               SelectedOrder = OrderSelect(Counter,SELECT_BY_POS);
               if(OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && OrderType() == OP_BUY)
                  {
                 // while(IsTradeContextBusy()) Sleep(10);
                  Closed = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage,Red);
                  if(Closed == true) BuyTicket = 0;
                  else Alert("Symbol: ",Symbol()," Ticket: ",BuyTicket," unable to close buy order(s): buy ma convergence close routine");                  
                  }
            Counter--;               
                }
            }
            }

         if(SellTicket != 0)
            {
            if(SmallMA>MediumMA)
            {
            for(Counter = 0; Counter <=OrdersTotal()-1; Counter++)
               {
               SelectedOrder = OrderSelect(Counter,SELECT_BY_POS);
               if(OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && OrderType() == OP_SELL)
                  {
               //   while(IsTradeContextBusy()) Sleep(10);
                  Closed = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),Slippage,Red);
                  if(Closed == true) SellTicket = 0;
                  else Alert("Symbol: ",Symbol()," Ticket: ",SellTicket," unable to close sell order(s): sell ma convergence close routine");                  
                  }
            Counter--;               
                }
            }
            }
}            
return;   
}
 
Sneck55: Le bouton SRC a été utilisé pour faire le post
qjol: oui, mais la première ligne "Sorry for the delay...." n'est pas un code et a tout gâché.
Pourquoi n'avez-vous pas modifié votre message original?
 
Le code est extrêmement simple et pourtant, plus je l'exécute sur de nombreuses fenêtres, plus ses performances sont mauvaises. Je l'ai exécuté sur 4 symboles différents mais il commence à échouer sur un symbole après quelques minutes. Il démarre également bien mais plus je l'exécute (après quelques heures environ) plus il devient lent et moins précis. Parfois, il peut prendre jusqu'à une minute pour supprimer chaque EA de chaque fenêtre avec le petit cercle près du curseur qui tourne en rond pendant des heures. J'ai un bon PC rapide que je viens de défragmenter et de scanner pour les virus - je l'ai essayé sur mon ordinateur portable aussi avec exactement les mêmes résultats. J'ai essayé de télécharger tout l'historique de M1 mais cela ne fait aucune différence. Est-ce qu'il s'agit d'un problème de fuite de mémoire ? MT4 essaie-t-il d'utiliser les mêmes ressources encore et encore ? Il est clair que je ne pourrai pas lui faire confiance pour trader sur mon compte réel tant que ce problème ne sera pas résolu !
 
C'est intéressant...