Одновременный запуск более одного эксперта

 
Мой советник работает нормально, когда он работает сам по себе, но если я пытаюсь запустить тот же советник на другом символе в то же время на том же профиле, то второй советник работает не очень хорошо или вообще не работает, или возникает много ошибок. Это происходит, даже если я использую Symbol() и разные магические числа для двух отдельных графиков. Это происходит даже если я запускаю разные версии одного и того же кода (т.е. имена файлов советника и магические числа разные, но в остальном код идентичен). Возможно, у меня какой-то конфликт с глобальными переменными или есть какая-то другая причина, по которой второй график просто зависает? Спасибо.
 
Sneck55:
Мой советник работает нормально, когда он работает сам по себе, но если я пытаюсь запустить тот же советник на другом символе в то же время на том же профиле, то второй советник работает не очень хорошо или вообще не работает, или возникает много ошибок. Это происходит, даже если я использую Symbol() и разные магические числа для двух отдельных графиков. Это происходит даже если я запускаю разные версии одного и того же кода (т.е. имена файлов советника и магические числа разные, но в остальном код идентичен). Возможно, у меня какой-то конфликт с глобальными переменными или есть какая-то другая причина, по которой второй график просто зависает? Спасибо.

Поскольку запуск одного и того же советника на разных графиках не должен быть проблемой (я делаю это без проблем), вы должны предоставить код... ?
 

Да. Если зависает второй, то, скорее всего, он пытается использовать тот же ресурс, что и первый.


Sneck55


Лучше покажите нам код, и мы укажем вам, какой из них является виновником, если это не займет много времени.

 
используйте SRC-кнопку!!!
 
gooly: используйте SRC-кнопку!!!
Какая часть SRC была непонятна? Почему вы не сделали этого? Отредактируйте свое сообщение!

  1. Воспроизвести видео
    Пожалуйста, отредактируйте ваше сообщение.
    Для больших объемов кода прикрепляйте его.

  2.          if(BuyTicket != 0)                                        
                {                                                      
                if(SmallMA<MediumMA)
                {
                for(Counter = 0; Counter <=OrdersTotal()-1; Counter++)
                {
                   :
                    Counter--;
                }
    Если отключится электричество, произойдет сбой ОС, случайно закроется терминал или график, то в следующий раз BuyTicket будет потерян. У вас будет открытый ордер, но вы никогда не попытаетесь его закрыть. Вам не нужно запоминать номер билета, если вы используете цикл OrderSelect.
  3. Вы ДОЛЖНЫ вести обратный отсчет при закрытии/удалении. Возврат на один назад не сработает, если другой советник закроет ордер. Циклы и закрытие или удаление ордеров - Форум MQL4
  4. Упростите булевы выражения
    // if(SmallMA>MediumMA&&MediumMA>LargeMA) MABuyFanning = true;
    // else MABuyFanning = false;
       MABuyFanning = (SmallMA>MediumMA&&MediumMA>LargeMA);
  5. if(NewBar == true)
    Вы никогда не напишете if( (2+2) == 4) == true), не так ли? if(2+2 == 4) достаточно. Поэтому не пишите if(bool == true), используйте if(bool) или if(!bool).
 
Кнопка SRC была использована для создания сообщения
 
Sneck55:
Кнопка SRC была использована для создания сообщения

да, но первая строка "Sorry for the delay...." не является кодом и все испортила.
 
#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: Для создания сообщения использовалась кнопка SRC
qjol: ага, но первая строка "Извините за задержку...." - это не код, и это все испортило
Почему вы не отредактировали свой первоначальный пост?
 
Код очень прост, но чем больше окон я запускаю, тем хуже он работает. Я запускал его на 4 разных символах, но даже на одном символе он начинает сбоить через несколько минут. Также он начинает работать нормально, но чем дольше я его запускаю (через пару часов или около того), тем медленнее, медленнее и менее точным он становится. Иногда на удаление каждого эксперта из каждого окна может уйти до минуты, при этом маленький кружок у курсора просто ходит туда-сюда целую вечность. У меня хороший быстрый компьютер, который я только что очистил от мусора и проверил на вирусы - я пробовал это и на своем ноутбуке с точно такими же результатами. Я пробовал загрузить всю историю M1, но это ничего не изменило. Может быть, это какая-то проблема утечки памяти? Может быть, MT4 пытается использовать одни и те же ресурсы снова и снова? Очевидно, что я не смогу доверить ему торговлю на моем реальном счете, пока эта проблема не будет решена!
 
Это интересно...
Причина обращения: