Güncellenmiş MQL4 ve eski kod (problem çözmede deneyim alışverişi)

 

Güncelleme ışığında faydalı bir konu olabileceğini düşünüyorum.

Geçen gün aptalca bir şekilde terminali güncellemeye ve üzerinde gerçek hayatta çalışan Uzman Danışmanlarımı test etmeye karar verdim, peki, onu gerçek hayatta hemen güncellemedim.

Hatalar var. Geliştiricilerin suçlu olduğunu söylemek istemiyorum, benim de suçum var. Yine de hemoroid olduğum birkaç noktaya dikkat çekmek istiyorum:

1. Değişken isimlerinde geçersiz karakterler - burada her şey basit, derleyici $ sembolünü geçersiz olarak işaret etti. Hızlı ve kolay bir şekilde düzeltti. Derleme aşamasında artık hata yoktu.

Ayrıca Expert Advisor'ın çalışmasında derleyicinin küfür etmediği söveleri yakalamak zorunda kaldım.

2. Test başladığında, stdlib.ex4 kitaplığının bulunamadığına dair lanetler aldım. Bu şekilde karar verildi - belirtilen klasörde stdlib kaynağını buldum ve yeniden derledim.

3. Ayrıca, şimdi anladığım kadarıyla NULL ve 0 (sıfır) farklı şeyler olduğu gerçeğiyle ilgili söveleri ortadan kaldırdım. Önceden, iOpen( NULL ,PERIOD_W1,1) gibi işlevler iOpen( 0 ,PERIOD_W1,1) biçiminde düzgün çalışıyordu, yani. hem 0 hem de NULL belirtmek mümkündü. Şimdi hayır, ancak derleyici bundan şikayet etmiyor - sadece Expert Advisor çalışırken bir hata alıyorsunuz.

4. Nedenini bilmiyorum ama daha önce açılış fiyatını, stop seviyesini veya kârı ayarlarken NormalizeDouble (pr1, Digits ) kullandım, şimdi örneğin 3 ondalık sayının olduğu USDJPY çifti üzerinde test yaparken fark ettim. bu işlevin virgülden sonra 4 ondalık basamaklı bir sayı döndürdüğü ve buna göre bir sipariş açarken hatalar aldığı yerler. Rakamları Rakamlar() ile değiştirdi ve işe yaradı.

Şimdiye kadar karşılaştığım tek şey bu, şimdi diğer olası sorunları belirlemek için uzmanlarımın performansını kontrol ediyorum.

Bu arada, eski kodları yeniden derlemezseniz, ex4 hatasız çalışır.

Yapım şimdi 579, gerçek hayatta başka bir 509 dönüyor, uçuş normal, ancak güncellemek korkutucu.

Geçiş sırasında herhangi biri sorunla karşılaşırsa - buraya yazın, başkaları için faydalı olacaktır.

 
583'ü kontrol edin, lütfen.
 

Nokta değişkeni ile benzer bir sorun. Noktaya Değiştir()

eller henüz 583 yapıya ulaşmadı. Ve brokerim henüz sahip değil.

 

Rakamlar ve Nokta hakkında bir kez daha.

Onlarla ilgili sorunun, aynı Expert Advisor'ı farklı bit derinliklerine sahip semboller üzerinde test ettiğinizde ortaya çıktığını öğrendim. Test cihazı bu değişkenleri değiştirmiyor gibi görünüyor. Diyelim ki önce bir dolar üzerinde test yaptım ve sonra test cihazında sembolü dolar olarak değiştirdim ve sorunlar başladı. Peki ya da tam tersi.

dahil belki bu sadece bir testçinin sorunudur ve gerçek hayatta bu olmayacak. Ama her ihtimale karşı, her yerde Rakamları Rakamlar() ve Noktadan Noktaya() değiştiririm

GÜNCELLEME değiştirme hala yardımcı olmuyor. Yalnızca terminali yeniden başlatmak yardımcı olur.

 
Teşekkürler, pazartesi kontrol edip düzelteceğim.
 

Oh, ve tamamen çarpık olan benim kodum olduğunu düşündüm ...

Ayrıca Expert Advisor test cihazında çalışmaz, ilk test 4 haneli ise yen çiftleri artık test edilmez, pozisyon açmaz. Testin bunları geçmesi için terminali yeniden başlatmanız veya EA'yı yeniden derlemeniz gerekir.

584 oluşturun.

Hayır, kodumun mükemmelliğin zirvesi olduğunu iddia etmiyorum, yapı 509'daki aynı kod, test edilen sembolü değiştirirken, terminali yeniden başlatmadan ve yeniden derlemeden test cihazında çalıştı.


Not: Sorun şu ana kadar aşağıdaki gibi yapıları çağırarak çözüldü:

   digits = MarketInfo ( Symbol (), MODE_DIGITS );
   point = MarketInfo ( Symbol (), MODE_POINT );

aynı anlama gelen bu değişkenlere sadece değerler atamak yerine:

digits = Digits ;
point = Point ;
 

Bunu grafikteki Yorum için bir dizgeye çevirdiğimde, Rakamları (4 verir) 5 rakamıyla değiştiririm. "Hata ayıklamayı" açarsam, bir şeyi düzenlerim, sonra "duraklat"ta grafik kaybolur ve hata ayıklamanın sonunda, uzman içeren, ancak göstergeleri olmayan yeni bir grafik (tümü yeşil) görünür! Böyle mi olacak yoksa geçici mi?

Yalnızca Demo'dakinin güncellenmiş olması iyi bir şey. Real'de olan henüz güncellenmedi. Ne yapacağımı bilmiyorum, küçük bir eksi içinde açık pozisyonlar var!

 

Yeşil ok, başlangıçtaki ilk satırı gösterir:

int basamaklar = MarketInfo( Symbol(), MODE_DIGITS); Ve en altta: MQL4\Experts\"EA name" başlangıç ve satır numarası Hatalar belirtilmemiş, ancak derlenmemiş Bu ne anlama geliyor? Bir şey olmayacak dediler! Açıkla lütfen!

 

wininet.dll'deki InternetOpenUrlA() işlevi çalışmayı durdurdu

Web sayfası metni yerine 0 (sıfır) döndürür.

Tam kodu gönderiyorum.

#import "wininet.dll"

int InternetOpenA( string sAgent, int lAccessType, string sProxyName, string sProxyBypass, int lFlags );

int InternetOpenUrlA( int hInternetSession, string sUrl, string sHeaders, int lHeadersLength, int lFlags, int lContext );

int InternetReadFile( int hFile, int& lpvBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[] );

int InternetCloseHandle( int hInet );

int InternetQueryDataAvailable( int hFile, int& lpdwNumberOfBytesAvailable[], int dwFlags, int dwContext );

int HttpQueryInfoA(int hRequest, int dwInfoLevel, int& lpvBuffer[], int& lpdwBufferLength[], int& lpdwReserved[] );

#import


#define INTERNET_OPEN_TYPE_PRECONFIG 0x00000000 // use registry configuration

#define INTERNET_FLAG_RELOAD 0x80000000

#define INTERNET_FLAG_NO_CACHE_WRITE 0x04000000

#define INTERNET_FLAG_PRAGMA_NOCACHE 0x00000100



//+------------------------------------------------------------------+

//| script program start function |

//+------------------------------------------------------------------+

int start()

{

if(!IsDllsAllowed())

{

Alert("Необходимо в настройках разрешить использование DLL");

return(0);

}

int hInternetSession = InternetOpenA("Microsoft Internet Explorer",

0, "", "", 0);

if(hInternetSession <= 0)

{

Alert("Ошибка при вызове InternetOpenA()");

return(0);

}

int hURL = InternetOpenUrlA(hInternetSession,"https://www.mql4.com", "", 0, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0);

if(hURL <= 0)

{

Alert("Ошибка при вызове InternetOpenUrlA()");

InternetCloseHandle(hInternetSession);

return(0);

}

int cBuffer[256];

int dwBytesRead[1];

string TXT = "";

while(!IsStopped())

{

bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead);

if(dwBytesRead[0] == 0)

break;

string text = "";

for(int i = 0; i < 256; i++)

{

text = text + CharToStr(cBuffer[i] & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 8 & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 16 & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 24 & 0x000000FF);

}

TXT = TXT + text;

Sleep(1);

}

if(TXT != "")

{

int h = FileOpen("SavedFromInternet.htm", FILE_CSV|FILE_WRITE);

if(h > 0)

{

FileWrite(h,TXT);

FileClose(h);

Alert("Готово! См. файл .../experts/files/SavedFromInternet.htm");

}

else

{

Alert("Ошибка при вызове FileOpen()");

}

}

else

{

Alert("Нет считанных данных");

}

InternetCloseHandle(hInternetSession);

return(0);

}

 
Uniqdoe dizelerine geçiş nedeniyle, artık InternetOpenUrlW kullanılmalıdır
 
Renat :
Uniqdoe dizelerine geçiş nedeniyle, artık InternetOpenUrlW kullanılmalıdır

Gerçekten işe yaradı! Teşekkür ederim!