Aynı anda birden fazla EA çalıştırma - sayfa 3

 
#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=0;
int SellTicket=0;
double InternalStopLoss=0;
double CalcDigits=0;
double CalcPoint=0;
bool MABuyFanning=false;
bool MASellFanning=false;
int SelectedOrder=0;
bool Closed=false;
int ErrorCode=0;
string ErrLog="a";
double BuyStopLoss=0;
double SellStopLoss=0;
bool NewBar=false;
double ThisBarOpen=0;
double SmallMA=0;
double MediumMA=0;
double LargeMA=0;
int Counter=0;



//+------------------------------------------------------------------+
//| 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)
      {
      if(ThisBarOpen!=Open[0])
         {
         ThisBarOpen=Open[0];
         NewBar=true;
         }
      else NewBar=false;
      }
    else NewBar=true;

if(NewBar)
{


//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)
 {
      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)
 {
      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) 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) SellTicket=0;
                  else Alert("Symbol: ",Symbol()," Ticket: ",SellTicket," unable to close sell order(s): sell ma convergence close routine");                  
                  }
            Counter--;               
                }
            }
            }
}            
return;   
}
 

Hala Sayacınız var--

GumRai'nin yorumuna bakın https://www.mql5.com/en/forum/151167/page2#954622

 
Ardışık iki çubuğun tam olarak aynı açılış fiyatına sahip olabileceğini düşünüyor musunuz?
   if (CheckOncePerBar){
       if (ThisBarOpen!= Open [ 0 ]){
         ThisBarOpen= Open [ 0 ];
         NewBar= true ;
         }
       else NewBar= false ;
      }
     else NewBar= true ;

if (NewBar)
{
   : // doit
Her zaman zamanı kullan
 static datetime ThisBarTime = 0 ;
if (ThisBarTime != Time [ 0 ] || !CheckOncePerBar)
{
   ThisBarTime = Time [ 0 ];
   : // doit
Bu, deinit/init döngülerini işlemez. harici statik değişken - MQL4 forumu
 

Yazılarınız için teşekkürler.

Zaman yerine Açık kullandım çünkü bir çubuğun Açılması bir kez gerçekleştiğinde sonsuza kadar sabitlenir ve asla değişmez. Ardışık iki çubuk aramıyor - aynı çubuk ve onayın henüz gerçekleştiği mevcut çubuğun açıklığının ThisBarOpen'de depolanan Açık değeriyle aynı olup olmadığını soruyor. Ek olarak, Open'ın Time'dan daha basit olacağını düşünürdüm çünkü bu basit bir veri aramadır, oysa Time'ın başka bir şeye başvurması ve muhtemelen bir tür hesaplama yapması gerekebilir.

Yeniden Sayaç--; Bunu değiştirmedim çünkü başka bir EA bir siparişi kapatamaz çünkü kod hem MagicNumber hem de Symbol()'ün ilk önce aynı olduğunu kontrol eder.

BuyTicket'in içeriğini silen bir elektrik kesintisi hakkında kesinlikle fikrim var ama bu benim testlerim sırasında olmadı ve kodum hala çok yavaş çalışıyor. Bu nedenle, bunun neden olabileceğini de göremiyorum.

Şu anda asıl sorum, açık pozisyonları olan terminaldeki pencerelerden EA'ları çıkarmak neden bu kadar uzun sürdü ve açık pozisyonu olmayan terminalden çıkarmak için hiç zaman olmadı. Tesadüf belki - ama dört pencerenin tümü?

 
Geçen sefer aynı sorunu yaşadım ve aslında bu, ea'yı nasıl kodladığınızdır. Belki de, ea'nızın yeniden sıfırdan yazılmasının zamanı gelmiştir. örneğin v2.
 

Bunun sorununuzla gerçekten alakalı olduğunu bilmiyorum ama ticaretinizi EA başına 1 satın alma, 1 satış ile sınırlandırıyorsunuz, peki neden tüm bunları yapıyorsunuz?

   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 )
     {Closed= OrderClose ( OrderTicket (), OrderLots (), MarketInfo ( Symbol (), MODE_ASK ),Slippage,Red);
       if (Closed) SellTicket= 0 ;
       else Alert ( "Symbol: " , Symbol (), " Ticket: " ,SellTicket, " unable to close sell order(s): sell ma convergence close routine" );                  
     }
    Counter--;               
}}}} 

Bilet numaranız zaten burada:

 SellTicket = OrderSend ( Symbol (), OP_SELL ,FixedLotSize, Bid ,Slippage,SellStopLoss, 0 , "Sell Order" ,MagicNumber, 0 ,Red);

Bunu statik bir int yaparsanız, sipariş havuzunda gezinmeden siparişinizi bu bilet numarasına göre açıkça kapatabilirsiniz.

Closed= OrderClose ( SellTicket , OrderLots (), MarketInfo ( Symbol (), MODE_ASK ),Slippage,Red);
 
Sneck55 :

Yazılarınız için teşekkürler.


Yeniden Sayaç--; Bunu değiştirmedim çünkü başka bir EA bir siparişi kapatamaz çünkü kod önce MagicNumber ve Symbol() öğelerinin aynı olup olmadığını kontrol eder.


Şu anda asıl sorum, açık pozisyonları olan terminaldeki pencerelerden EA'ları çıkarmak neden bu kadar uzun sürdü ve açık pozisyonu olmayan terminalden çıkarmak için hiç zaman olmadı. Tesadüf belki - ama dört pencerenin tümü?


Döngülerin nasıl çalıştığını anlıyor musunuz?

 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) BuyTicket= 0 ;
                   else Alert ( "Symbol: " , Symbol (), " Ticket: " ,BuyTicket, " unable to close buy order(s): buy ma convergence close routine" );                  
                  }
             Counter-- ;               
                }
            }
            }

3 siparişin açık olduğunu söyle

İlk çalıştırmada, counter==0, dolayısıyla 0 indeksli sıra seçilecektir.

Döngünün sonunda sayacı 1 azaltırsınız, yani sayaç== -1.

Döngü yeniden yürütülmeden önce, for işlevinin bir parçası olarak sayaç 1 artırılır. Yani sayaç ==0

Yani bir sonraki döngü sayacından ==0 tekrar çalıştırın! Ve benzeri vb.

0 sıra indeksini kontrol etmeye devam eden sonsuz bir döngüde sıkışıp kaldınız

Durmasının tek yolu, açık emir olmamasıdır, çünkü o zaman OrdersTotal - 1 -1 olur ve 0 <= -1 olmaz

 
Gerçekten çok teşekkür ederim GumRaj - sorunumu çözdünüz!! Şimdi iyi çalışıyor. Bu, MQL4'te ilk kez kod yazdığım için benim için bir öğrenme süreci. for döngüsünün nasıl çalıştığı konusunda kafam karıştı.
 
Sneck55 : GumRaj - sorunumu çözdünüz!! Şimdi iyi çalışıyor.
Ve nasıl çözdün? Geri sayım yapmıyorsanız, hala bir sorununuz var (# 3) - birden fazla siparişiniz veya birden fazla EA'nız olana kadar gizli .
 
Havuzda olanla eşleşmesi için bir emri kapatırsa, bir emri kapatmazsa azaltması gerekir. Bir emri kapatmadan azalırsa sonsuz bir döngüye girer.