한 번에 둘 이상의 EA 실행

 
내 EA는 자체적으로 실행될 때 잘 실행되지만 동일한 프로필에서 동시에 다른 Symbol에서 동일한 EA를 실행하려고 하면 두 번째 것이 잘 실행되지 않거나 전혀 실행되지 않거나 오류. 이것은 두 개의 개별 차트에 Symbol()과 다른 매직 넘버를 사용하는 경우에도 발생합니다. 동일한 코드의 다른 버전을 실행하는 경우에도 발생합니다(예: EA 파일 이름과 매직 번호는 다르지만 코드는 동일함). 전역 변수와 충돌이 발생했습니까? 아니면 두 번째 변수가 그냥 멈추는 다른 이유가 있습니까? 감사해요.
 
Sneck55 :
내 EA는 자체적으로 실행될 때 잘 실행되지만 동일한 프로필에서 동시에 다른 Symbol에서 동일한 EA를 실행하려고 하면 두 번째 것이 잘 실행되지 않거나 전혀 실행되지 않거나 오류. 이것은 두 개의 개별 차트에 Symbol() 및 다른 매직 넘버를 사용하는 경우에도 발생합니다. 동일한 코드의 다른 버전을 실행하는 경우에도 발생합니다(예: EA 파일 이름과 매직 번호는 다르지만 코드는 동일함). 전역 변수와 충돌이 발생했습니까? 아니면 두 번째 변수가 그냥 멈추는 다른 이유가 있습니까? 감사해요.

다른 차트에서 동일한 EA를 실행하는 데 문제가 없어야 하므로(저는 문제 없이 수행합니다) 코드를 제공해야 합니다.. ?
 

응. 두 번째 항목이 중단되면 첫 번째 항목과 동일한 리소스를 사용하려고 할 가능성이 큽니다.


스넥55


코드를 더 잘 보여주시면 시간이 많이 걸리지 않는 경우 어느 것이 범인인지 알려드리겠습니다.

 
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가 주문을 마감 하면 다시 돌아가지 않습니다. 루프 및 주문 마감 또는 삭제 - 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 버튼은 게시물을 만드는 데 사용되었습니다.

네, 하지만 첫 번째 줄 "지연 죄송합니다...."는 코드가 아니며 모든 것을 망쳤습니다.
 
#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개의 기호에서도 실패하기 시작합니다.

또한 그것은 잘 시작하지만 더 오래 실행하면(몇 시간 정도 후에) 더 느리고 느리고 덜 정확해집니다. 때로는 제거하는 데 최대 1분이 걸릴 수 있습니다.

커서 옆에 작은 원이 있는 각 창의 각 EA는 몇 년 동안 계속 돌고 있습니다. 나는 방금 조각 모음하고 바이러스를 검사한 좋은 빠른 PC를 가지고 있습니다.

정확히 같은 결과로 내 랩톱에서도 시도했습니다. 모든 M1 기록을 다운로드하려고 시도했지만 차이가 없습니다. 일종의 메모리 누수 문제가 아닐까요?

MT4가 동일한 리소스를 계속해서 사용하려고 합니까? 분명히 나는 문제가 해결될 때까지 내 라이브 계정에서 거래하는 것을 신뢰할 수 없을 것입니다!
 
이것은 흥미 롭다...