Executando mais de uma EA de cada vez

 
Minha EA funciona bem quando está funcionando por conta própria, mas se eu tentar executar a mesma EA em um Símbolo diferente ao mesmo tempo no mesmo perfil, então a segunda não funciona muito bem ou não funciona de todo ou há muitos erros. Isto acontece mesmo se eu usar Symbol() e números mágicos diferentes para os dois gráficos separados. Isto acontece até mesmo se eu executar versões diferentes do mesmo código (isto é, os nomes dos arquivos EA e os números mágicos são diferentes, mas o código é idêntico caso contrário). Será que tenho algum tipo de conflito com as variáveis globais ou há alguma outra razão pela qual o segundo simplesmente fica pendurado? Obrigado.
 
Sneck55:
Minha EA funciona bem quando está funcionando por conta própria, mas se eu tentar executar a mesma EA em um Símbolo diferente ao mesmo tempo no mesmo perfil, então a segunda não funciona muito bem ou não funciona de todo ou há muitos erros. Isto acontece mesmo se eu usar Symbol() e números mágicos diferentes para os dois gráficos separados. Isto acontece até mesmo se eu executar versões diferentes do mesmo código (isto é, os nomes dos arquivos EA e os números mágicos são diferentes, mas o código é idêntico caso contrário). Será que tenho algum tipo de conflito com as variáveis globais ou há alguma outra razão pela qual o segundo simplesmente fica pendurado? Obrigado.

Como não deve ser um problema executar a mesma EA em gráficos diferentes (eu faço isso sem problemas) você deve fornecer o código... ?
 

Sim. Se o segundo estiver pendurado, muito provavelmente está tentando usar o mesmo recurso como o primeiro.


Sneck55


É melhor nos mostrar o código e nós lhe indicaremos qual é o culpado, se não for demorado.

 
use o botão SRC!!
 
gooly: use o botão SRC!!
Que parte da SRC não estava clara? Por que você não o fez? Edite seu post!

  1. Reproduzir vídeo
    Por favor, edite seu post.
    Para grandes quantidades de código, anexá-lo.

  2.          if(BuyTicket != 0)                                        
                {                                                      
                if(SmallMA<MediumMA)
                {
                for(Counter = 0; Counter <=OrdersTotal()-1; Counter++)
                {
                   :
                    Counter--;
                }
    Se a energia falhar, o sistema operacional falhar, o terminal ou a tabela for fechada acidentalmente, a próxima vez que o BuyTicket for perdido. Você terá um pedido aberto, mas nunca tente fechá-lo. Você não precisa se lembrar do número do bilhete quando usar um loop OrderSelect.
  3. Você DEVE fazer uma contagem regressiva ao fechar/apagar. Voltar um não funcionará se outro EA fechar um pedido. Loops e Encerramento ou Eliminação de Pedidos - Fórum MQL4
  4. Simplifique suas booleans
    // if(SmallMA>MediumMA&&MediumMA>LargeMA) MABuyFanning = true;
    // else MABuyFanning = false;
       MABuyFanning = (SmallMA>MediumMA&&MediumMA>LargeMA);
  5. if(NewBar == true)
    Você nunca escreveria se( (2+2) == 4) == verdadeiro) você escreveria se( (2+2 == 4) é suficiente. Então não escreva if(bool == verdadeiro), apenas use if(bool) ou if(!bool).
 
O botão SRC foi usado para fazer o poste
 
Sneck55:
O botão SRC foi usado para fazer o poste

yep, mas a primeira linha "Sorry for the delay...." não é código e arruinou tudo
 
#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: O botão SRC foi usado para fazer o poste
qjol: yep, mas a primeira linha "Sorry for the delay...." não é código e arruinou tudo
Por que você não editou seu post original?
 
O código é extremamente simples e, no entanto, quanto mais janelas eu o executo, pior é o seu desempenho. Tenho-o executado em 4 Símbolos diferentes, mas ele começa a falhar em 1 símbolo após alguns minutos. Também começa bem, mas quanto mais tempo eu o executo (após um par de horas ou mais), mais lento e menos preciso ele se torna. Às vezes, pode levar até um minuto para remover cada EA de cada janela com o pequeno círculo ao lado do cursor, girando e girando por idades. Eu tenho um bom PC rápido que acabei de desfragmentar e verificar se há vírus - eu também já o fiz em meu laptop com exatamente os mesmos resultados. Tentei baixar todo o histórico da M1, mas isso não faz diferença. Poderia ser algum tipo de problema de vazamento de memória talvez? O MT4 está tentando usar os mesmos recursos uma e outra vez? Claramente não poderei confiar nele para negociar em minha conta ativa até que o problema esteja resolvido!
 
Isto é interessante...
Razão: