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

 

İlk olarak, tüm değişkenleri bazı anlamlı varsayılanlarla başlattığınızdan emin olun. Örneğin, Başlatılmadan önce BuyTicket'i kullanıyorsunuz, bu nedenle ilk çalıştırmada herhangi bir değer olabilir.

MQL4 referans dosyasından alıntı (MQL4 Reference / Language Basics / Variables / Initialization of Variables):

If a variable is not initialized explicitly, the value stored in this variable can be any. Implicit initialization is not used.

Bu nedenle, aşağıdaki kısımda değişkenlere varsayılanları ekleyin:

 //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; 
 

Ve evet, MQL4'te hatalar ve tuhaflıklar var, ancak hataların çoğu sadece referans kılavuzundaki temel bilgileri okuyarak önlenebilir.

Ayrıca, MQL4 programlarındaki yaygın hatalar hakkında bir makale var. Forumun üst kısmına bakın, bağlantıyı bulacaksınız.

 
drazen64 :

İlk olarak, tüm değişkenleri bazı anlamlı varsayılanlarla başlattığınızdan emin olun. Örneğin, Başlatılmadan önce BuyTicket'i kullanıyorsunuz, bu nedenle ilk çalıştırmada herhangi bir değer olabilir.

MQL4 referans dosyasından alıntı (MQL4 Reference / Language Basics / Variables / Initialization of Variables):

Bu nedenle, aşağıdaki kısımda değişkenlere varsayılanları ekleyin:



Bu doğrudur, ancak kullanıma bağlıdır. Bazen sadece değerin nereden alınacağını bildiğiniz için bunu ilan etmek istersiniz ve bazen belirli varsayılan değerlerle başlatılmazsa düzgün çalışmayabileceğinden onu bir şeyle başlatmanız gerekir.
 
deysmacro :

Bu doğrudur, ancak kullanıma bağlıdır. Bazen sadece değerin nereden alınacağını bildiğiniz için bunu ilan etmek istersiniz ve bazen belirli varsayılan değerlerle başlatılmazsa düzgün çalışmayabileceğinden onu bir şeyle başlatmanız gerekir.


Değişkenleri tanım yerinde başlatması gerekmez, ancak değişkenleri kullanmadan önce kesinlikle bir değere başlatması gerekir.

Bunları başlatmadan önce kullanırsa, değer tahmin edilemez. Onun hataları da öyle. Herhangi bir derin kod analizinden önce bu problemle ilgilenmelidir.

Başlatılmamış değişkenleri kullanmaya çalışırsanız, modern derleyiciler hata verir. MQL4 ne yazık ki yapmaz, bu nedenle kodlayıcı her şeyin doğru şekilde başlatıldığından emin olmalıdır.

 
Var'ı uygun başlatmalar olmadan kullandığına dair 1 şeye işaret edebilirsiniz.
 
deysmacro :
Var'ı uygun başlatmalar olmadan kullandığına dair 1 şeye işaret edebilirsiniz.


https://www.mql5.com/en/forum/151167/page2#954612 sayfasının ilk satırındaki ikinci cümleyi okuyun

Eleştirmeden önce cevabı okuyabilirsiniz .

BTW, burada nasıl yardımcı oluyorsun? "Akıllı" açıklamalar pek yardımcı olmuyor.

 
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--;               
                }
 

Benimkini göndermeden önce okudum. Demek istediğim, ona var ile ilgili ve var'ın düzgün şekilde başlatılmadığını göster.


hehe. GumRai onu yener. XD

 

Sizi doğru anladıysam, program başladığında BuyTicket ve diğer bazı değişkenler bilinmeyen değerler içerdiğinden tam olarak ne olabileceğini belirtmediğim için başlatılmamış değişkenler kullanmasının endişelenecek bir şey olmadığını söylüyorsunuz?

Öyle olsun. Başlatılmamış değişkenleri kullanmasına izin verin. Ne yanlış gidebilir ki?

 
Tüm değişkenleri önerildiği gibi başlattım ve booleanlardan "==true" öğesini kaldırdım. Ayrıca tüm banka alanını kod satırlarından kaldırdım. Hata ayıklayıcıyı kullanarak iki farklı sembolde - biri dizüstü bilgisayarda ve diğeri PC'de yaklaşık 2 saat boyunca test ettim ve ikisi de sorunsuz çalıştı, satış, satın alma ve doğru zamanlarda hiçbir hata yapmadan kapattı. Ancak daha sonra EA'yı hem PC'deki hem de dizüstü bilgisayardaki diğer 3 sembole ekledim, böylece 4'ü her iki terminalde de çalışıyordu ve o andan itibaren hepsi giriş ve çıkışları kaçırmaya başladı. Testin sonunda bir terminalde açık pozisyonları kapatmadan önce EA'ları çıkardım ve diğer terminalde açık pozisyonları kapattıktan sonra EA'ları çıkardım. Hâlâ açık pozisyonları olan terminalin EA'ları kaldırması çok uzun zaman aldı, ancak açık pozisyonu olmayan terminal 4 EA'yı da hemen kaldırdı. Revize edilmiş kod aşağıda ayrıca yayınlanmıştır.
Neden: