Ejecutar más de un EA a la vez

 
Mi EA funciona bien cuando se ejecuta por sí solo, pero si intento ejecutar el mismo EA en un símbolo diferente al mismo tiempo en el mismo perfil, entonces el segundo no funciona muy bien o en absoluto o hay muchos errores. Esto sucede incluso si utilizo Symbol() y diferentes números mágicos para los dos gráficos separados. Incluso sucede si ejecuto diferentes versiones del mismo código (es decir, los nombres de los archivos EA y los números mágicos son diferentes pero el código es idéntico por lo demás). ¿Tengo algún tipo de conflicto con las variables globales o hay alguna otra razón por la que el segundo se cuelga? Gracias.
 
Sneck55:
Mi EA funciona bien cuando se ejecuta por sí solo, pero si intento ejecutar el mismo EA en un símbolo diferente al mismo tiempo en el mismo perfil, entonces el segundo no funciona muy bien o en absoluto o hay muchos errores. Esto sucede incluso si utilizo Symbol() y diferentes números mágicos para los dos gráficos separados. Incluso ocurre si ejecuto diferentes versiones del mismo código (es decir, los nombres de los archivos EA y los números mágicos son diferentes pero el código es idéntico por lo demás). ¿Tengo algún tipo de conflicto con las variables globales o hay alguna otra razón por la que el segundo se cuelga? Gracias.

Como no debería ser un problema ejecutar el mismo EA en diferentes gráficos (yo lo hago sin problemas) deberías proporcionar el código... ?
 

Sí. Si el segundo se cuelga, lo más probable es que esté intentando utilizar el mismo recurso que el primero.


Sneck55


Mejor muéstranos el código y te indicaremos cuál es el culpable, si no te lleva mucho tiempo.

 
¡¡Usa el botón SRC!!
 
gooly: ¡¡usa el botón SRC!!
¿Qué parte de SRC no estaba clara? ¿Por qué no lo hiciste? Edita tu post!

  1. Reproducir video
    Por favor, edita tu post.
    Para grandes cantidades de código, adjúntelo.

  2.          if(BuyTicket != 0)                                        
                {                                                      
                if(SmallMA<MediumMA)
                {
                for(Counter = 0; Counter <=OrdersTotal()-1; Counter++)
                {
                   :
                    Counter--;
                }
    Si la energía falla, el sistema operativo se bloquea, el terminal o el gráfico se cierra accidentalmente, la próxima vez BuyTicket se perderá. Tendrá una orden abierta pero nunca intentará cerrarla. No necesita recordar el número de ticket cuando utiliza un bucle OrderSelect.
  3. Usted DEBE contar hacia atrás al cerrar/borrar. Retroceder uno no funcionará si otro EA cierra una orden. Bucles y cierre o borrado de órdenes - Foro MQL4
  4. Simplifique sus booleanos
    // if(SmallMA>MediumMA&&MediumMA>LargeMA) MABuyFanning = true;
    // else MABuyFanning = false;
       MABuyFanning = (SmallMA>MediumMA&&MediumMA>LargeMA);
  5. if(NewBar == true)
    Nunca escribiría if( (2+2) == 4) == true) ¿verdad? if(2+2 == 4) es suficiente. Así que no escriba if(bool == true ), sólo use if(bool) o if(!bool).
 
El botón SRC se utilizó para hacer el post
 
Sneck55:
El botón SRC se utilizó para hacer el post

sip, pero la primera línea "Sorry for the delay...." no es código y lo arruinó todo
 
#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: El botón SRC se usó para hacer el post
qjol: sip, pero la primera línea "Sorry for the delay...." no es código y lo arruinó todo
¿Por qué no editaste tu post original?
 
El código es extremadamente simple y, sin embargo, cuanto más ventanas lo ejecuto en el peor rendimiento. Lo he ejecutado en 4 símbolos diferentes, pero incluso empieza a fallar en un símbolo después de unos minutos. También empieza bien, pero cuanto más tiempo lo ejecuto (después de un par de horas más o menos) se vuelve más y más lento y menos preciso. A veces puede tardar hasta un minuto en eliminar cada EA de cada ventana con el pequeño círculo junto al cursor dando vueltas y vueltas durante años. Tengo un buen PC rápido que acabo de desfragmentar y escanear en busca de virus - también lo he probado en mi portátil con exactamente los mismos resultados. He intentado descargar todo el historial de M1 pero no hay diferencia. ¿Podría ser algún tipo de problema de pérdida de memoria? ¿Está MT4 tratando de utilizar los mismos recursos una y otra vez? Está claro que no podré confiar en ella para operar en mi cuenta real hasta que se resuelva el problema.
 
Esto es interesante...