複数のEAを同時に実行する

 
私のEAはそれ自体で動いているときはうまくいくのですが、同じプロファイルで同時に別のシンボルで同じEAを動かそうとすると、2つ目のEAはうまく動かないか、まったく動かないか、エラーがたくさん出ます。これは、Symbol() を使用して、2つの別々のチャートに異なるマジックナンバーを使用した場合でも発生します。同じコードの異なるバージョンを実行しても起こります(すなわち、EAファイル名とマジックナンバーは異なるが、それ以外のコードは同一である)。グローバル変数と何らかの衝突があるのでしょうか、それとも2つ目のチャートがハングする何か他の理由があるのでしょうか?ありがとうございます。
 
Sneck55:
私のEAはそれ自体で動いているときはうまくいくのですが、同じプロファイルで同時に別のシンボルで同じEAを動かそうとすると、2つ目のEAはうまく動かないか、まったく動かないか、エラーがたくさん出ます。これは、Symbol()を使用して、2つの別々のチャートに異なるマジックナンバーを使用した場合でも発生します。同じコードの異なるバージョンを実行しても起こります(すなわち、EAファイル名とマジックナンバーは異なるが、それ以外のコードは同一である)。グローバル変数と何らかの衝突があるのでしょうか、それとも2つ目のチャートがハングする何か他の理由があるのでしょうか?ありがとうございます。

同じEAを異なるチャートで実行することは問題ではないはずですので(私は何の問題もなく実行しています)、コードを提供する必要があります... ?
 

もし2つ目がハングアップするなら、おそらく1つ目と同じリソースを使おうとしているのでしょう。


Sneck55


もし時間がかからなければ、コードをお見せいただければ、どれが原因なのかお教えします。

 
SRCボタンを使って ください。
 
gooly:SRCボタンを使って ください!
SRCのどこが不明だったんだ?なぜ、そうしなかったのですか?編集してください

  1. 動画を再生する
    投稿を編集して ください。
    大量のコードの場合、添付して ください。

  2.          if(BuyTicket != 0)                                        
                {                                                      
                if(SmallMA<MediumMA)
                {
                for(Counter = 0; Counter <=OrdersTotal()-1; Counter++)
                {
                   :
                    Counter--;
                }
    停電、OSクラッシュ、ターミナルやチャートが誤って閉じられた場合、次回のBuyTicketは失われます。 未決済の注文はありますが、決済しようと することはありません。OrderSelect ループを使えば、チケット番号を覚える必要はありません。
  3. クローズ/デリートするときは、必ずカウントダウンしてください。他のEAが注文をクローズ した場合、1つ戻ることはうまくいきません。ループと注文のクローズまたは削除 - MQL4 forum
  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つの異なるシンボルでそれを実行していますが、数分後に1つのシンボルでさえ失敗し始めます。 また、最初はうまくいきますが、私が長く実行するほど(数時間後など)、それはますます遅くなり、正確ではなくなります。 時には、カーソルのそばにある小さな円がずっと回っているだけで、それぞれのウィンドウからEAを削除するのに最大1分かかることもあります。私は、デフラグとウィルススキャンをした高速のPCを持っています - 私は私のラップトップでもそれを試してみましたが、まったく同じ結果でした。M1の履歴をすべてダウンロードしてみましたが、何の変化もありません。MT4は同じリソースを何度も使おうとしているのでしょうか?明らかに、この問題が解決されるまで、私のライブ口座での取引を信頼することはできないでしょう。
 
これは面白い...。