Eseguire più di un EA alla volta

 
Il mio EA funziona bene quando è in esecuzione da solo, ma se cerco di eseguire lo stesso EA su un altro Symbol allo stesso tempo sullo stesso profilo, il secondo non funziona molto bene o per niente o ci sono molti errori. Questo succede anche se uso Symbol() e numeri magici diversi per i due grafici separati. Succede anche se eseguo versioni diverse dello stesso codice (cioè i nomi dei file EA e i numeri magici sono diversi ma il codice è identico). Ho forse una sorta di conflitto con le variabili globali o c'è qualche altra ragione per cui il secondo si blocca? Grazie.
 
Sneck55:
Il mio EA funziona bene quando è in esecuzione da solo, ma se cerco di eseguire lo stesso EA su un altro Symbol allo stesso tempo sullo stesso profilo, il secondo non funziona molto bene o per niente o ci sono molti errori. Questo succede anche se uso Symbol() e numeri magici diversi per i due grafici separati. Succede anche se eseguo versioni diverse dello stesso codice (cioè i nomi dei file EA e i numeri magici sono diversi ma il codice è identico). Ho forse una sorta di conflitto con le variabili globali o c'è qualche altra ragione per cui il secondo si blocca? Grazie.

Dato che non dovrebbe essere un problema eseguire lo stesso EA su diversi grafici (io lo faccio senza problemi) dovresti fornire il codice... ?
 

Sì. Se il secondo si blocca, molto probabilmente sta cercando di usare la stessa risorsa come il primo.


Sneck55


È meglio che ci mostri il codice e ti indicheremo qual è il colpevole, se non richiede tempo.

 
utilizzare il pulsante SRC!
 
gooly: usa il pulsante SRC!
Quale parte di SRC non era chiara? Perché non l'hai fatto? Modifica il tuo post!

  1. Riproduci video
    Per favore modifica il tuo post.
    Per grandi quantità di codice, allegalo.

  2.          if(BuyTicket != 0)                                        
                {                                                      
                if(SmallMA<MediumMA)
                {
                for(Counter = 0; Counter <=OrdersTotal()-1; Counter++)
                {
                   :
                    Counter--;
                }
    Se manca la corrente, il sistema operativo si blocca, il terminale o il grafico viene accidentalmente chiuso, la prossima volta il BuyTicket sarà perso. Avrai un ordine aperto ma non proverai mai a chiuderlo. Non hai bisogno di ricordare il numero del ticket quando usi un ciclo OrderSelect.
  3. Si DEVE fare il conto alla rovescia quando si chiude/cancella. Tornare indietro di uno non funzionerà se un altro EA chiude un ordine. Loop e chiusura o cancellazione di ordini - MQL4 forum
  4. Semplificate le vostre booleane
    // if(SmallMA>MediumMA&&MediumMA>LargeMA) MABuyFanning = true;
    // else MABuyFanning = false;
       MABuyFanning = (SmallMA>MediumMA&&MediumMA>LargeMA);
  5. if(NewBar == true)
    Non scrivereste mai if( (2+2) == 4) == true) vero? if(2+2 == 4) è sufficiente. Quindi non scrivere if(bool == true), usa solo if(bool) o if(!bool).
 
Il pulsante SRC è stato usato per fare il post
 
Sneck55:
Il pulsante SRC è stato usato per fare il post

sì, ma la prima riga "Scusa per il ritardo...." non è codice e ha rovinato tutto
 
#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: Il pulsante SRC è stato usato per fare il post
qjol: sì, ma la prima riga "Scusa per il ritardo...." non è codice e ha rovinato tutto
Perché non hai modificato il tuo post originale?
 
Il codice è estremamente semplice, eppure più finestre su cui lo eseguo e peggio si comporta. L'ho eseguito su 4 diversi simboli, ma inizia a fallire anche su 1 simbolo dopo pochi minuti. Inoltre inizia bene, ma più a lungo lo eseguo (dopo un paio d'ore o giù di lì) più lento, più lento e meno accurato diventa. A volte può richiedere fino a un minuto per rimuovere ogni EA da ogni finestra con il piccolo cerchio vicino al cursore che gira in tondo per secoli. Ho un buon PC veloce che ho appena deframmentato e scansionato per i virus - ho provato anche sul mio portatile con esattamente gli stessi risultati. Ho provato a scaricare tutta la cronologia di M1 ma non fa alcuna differenza. Potrebbe essere una sorta di problema di perdita di memoria? MT4 sta cercando di utilizzare le stesse risorse più e più volte? Chiaramente non potrò fidarmi a fare trading sul mio conto live finché il problema non sarà risolto!
 
Questo è interessante...