Fan sayfamıza katılın
Öyleyse bir link gönderin -
başkalarının da faydalanmasını sağlayın
- Görüntülemeler:
- 76
- Derecelendirme:
- Yayınlandı:
-
Bu koda dayalı bir robota veya göstergeye mi ihtiyacınız var? Freelance üzerinden sipariş edin Freelance'e git
Kütüphane, *.gz dosyalarından GZIP arşivlerinin veya bu formatla sıkıştırılmış sitelerden gelen yanıtların şifresini çözmenize olanak tanır. İçinde 0,5 GB'a kadar metin bulunan dosyalar üzerinde test edilmiştir.
Kütüphane, arşivin sıkıştırılmış bir dosya mı yoksa siteden gelen sıkıştırılmış veriler mi olduğunu 4. bayttaki bayrakla otomatik olarak kontrol edebilir, ikinci durumda veriler dosya adını içermez.
Dekompresyon için girdi verileri char tipinde bir dizide gösterilmelidir.
Açma işlemi için CryptDecode(CRYPT_ARCH_ZIP, tmp, key, tx) terminal fonksiyonu kullanılır;
GZIP sınıfı yöntemler içerir:
isGZIP(char& gz[])
- GZIP formatında sıkıştırılıp sıkıştırılmadığını görmek için alınan verinin ilk üç karakterini kontrol eder.
Bu kontrolden sonra, unGZIP yönteminin aşırı yüklerinden biri çağrılabilir:
bool unGZIP(char& gz[], char& tx[], string& fname, bool printTime=false){}
Hız ve bellek tüketimi açısından tercih edilen kullanım durumu. Açma işlemi sırasında tx karakter dizisi doldurulur. Daha sonra bu dizideki veriler CSV veya JSON ayrıştırıcı tarafından işlenebilir. Bu şekilde, diziyi bir dizeye yapıştırmadan ve ardından dizelere veya diğer karakterlere bölmeden sonucu elde ederiz.
Hala bir dize almanız gerekiyorsa, aşırı yüklerden birini kullanabilirsiniz:
bool unGZIP(char& gz[], string& out, bool printTime=false, uint codepage=CP_ACP){}
paketten çıkarma başarılıysa true döndürür, paketten çıkarılan dize out dizesinin içindedir
veya
string unGZIP(char& gz[], bool printTime=false, uint codepage=CP_ACP){}
dönüş dizesi. Paketten çıkarma başarısız olursa, dize boş olacaktır.
Verilerin tek bir dizgede birleştirilmesi kullanılırken dikkatli olunmalıdır.
Eğer 0.5GB veri içeren bir arşivi açtıysanız, string için 0.5GB daha gerekir, daha sonra bunu bir string dizisine bölebilirsiniz, bu da 0.5GB daha gerektirir. Ayrıca tüm bu işlemlerin zaman maliyeti.
Bir web sitesinden sıkıştırılmış verileri okumak ve ardından bir dosyadan okumak için örnek kullanım durumu: (bu betik indirilmek üzere eklenmiştir)
#property copyright "Copyright 2023, Forester" #property link "https://www.mql5.com" #property version "1.00" #include <GZIP.mqh> GZIP gzip; void OnStart(){ Print("GZipped webpage read sample:"); string url="https://............"; char out[]; if(http_req(url, out,"GET","Accept-Encoding: gzip, deflate\r\n", 1,0)){ if(gzip.isGZIP(out)){ Print("GZIP detected"); string txt; if(!gzip.unGZIP(out, txt, 1, CP_UTF8)){return;}//CP_ACP Print(txt); }else{ Print("No GZIP");Print(CharArrayToString(out, 0, WHOLE_ARRAY, CP_UTF8)); } } Print("File read sample:"); bool is_common=1; string fn="3.csv.gz"; bool is_zip=1; int h; if(is_zip){ h = FileOpen(fn,FILE_READ|FILE_BIN|FILE_READ|(is_common?FILE_COMMON:0)); }else{ h = FileOpen(fn,FILE_READ|FILE_CSV|FILE_ANSI|(is_common?FILE_COMMON:0)); } if( h!=INVALID_HANDLE){ Print ("Start gzip"); char gz[],tx[]; FileReadArray(h, gz); FileClose(h); if(gzip.isGZIP(gz)){ Print("GZIP detected"); string fname; if(!gzip.unGZIP(gz, tx,fname,1)){return;} //string txt; if(!unGZIP(gz, txt, 1, CP_ACP)){return;}//CP_UTF8 //string txt=unGZIP(gz, 1, CP_ACP);if(txt==""){return;} if(fname!=NULL){Print("File name: ",fname,", file size: ",ArraySize(tx));} string t= CharArrayToString(tx,0,100);Print("Filr content: ",t);t= CharArrayToString(tx,ArraySize(tx)-100,100);Print("... ",t); //ulong mcs = GetMicrosecondCount(); //string csvRow[];int columns=0, next=0; char sep=',', newLine='\n'; //while(getCSVRow(tx, csvRow, columns, next, sep, newLine) && !IsStopped()){//bir sonraki satırı al // for(int c=0; c<sütunlar; c++){ //Print(); // } //Print(next); //} //Print("CSV ayrıştırma süresi: ",(GetMicrosecondCount()-mcs)," mcs"); //ArrayPrint(csvRow); }else{} } } int getCSVRow(char& csv[], string& outAr[], int& cols, int& next, char& sep, char& newLine){//bir sonraki satırı al for(int i=next; i<ArraySize(csv); i++){ if(csv[i] == newLine){ cols=StringSplit(CharArrayToString(csv,next,i-next),sep,outAr);// 1 satırı ayrı ayrı işleyin - parseCSV'den %5-10 daha hızlıdır ve e 1 büyük dizi için belleğe sahiptir. next=i+1; return true; } } return false; } bool http_req(string url, char& out[],string method="GET",string headers_request=NULL, bool printTime=false,bool debug=false){ ulong mcs = (printTime?GetMicrosecondCount():0); bool retVal=false; ResetLastError(); char data[];string headers=NULL; int r=WebRequest(method, url, headers_request, 5000, data, out, headers); if(r==-1){Print("Error in WebRequest. Err code =",GetLastError());MessageBox("It is necessary to add the address '"+url+"' to the list of allowed URLs in the 'Advisors' tab","Error",MB_ICONINFORMATION);} else{if(r==200){ retVal= true; }else{PrintFormat("Download error '%s', responce code %d",url,r);Print("Error in WebRequest. Err code =",GetLastError());}}if(debug){PrintFormat("Responce headers: %s\r\nResponce:",headers);Print(CharArrayToString(out));}// if(printTime){Print("WebRequest time: ",(GetMicrosecondCount()-mcs)," mcs");} return retVal; }
Bu örnek, dosyalar klasöründen bir dosya okur ve onu bir diziye açar.
Açılan dosyadaki ilk ve son 100 karakter yazdırılır.
Dizi daha sonra bir CSV veya JSON ayrıştırıcısına gönderilebilir. JSON için kodobase'de JASON kütüphanesi vardır. Bir char dizisi olarak alınan verileri ayrıştırabilir.
Kaynak dosya 463 MB olan 120 MB'lık sıkıştırılmış bir CSV dosyasını açarken çıktı örneği:
2025.05.12 15:08:40.510 GZipped webpage read sample:
2025.05.12 15:08:41.319 WebRequest time: 809637 mcs
2025.05.12 15:08:41.319 GZIP detected
2025.05.12 15:08:41.319 UnGZIP time: 3 mcs
2025.05.12 15:08:41.319 {"retCode":0,"retMsg":"OK","result":{"category":"linear","list":[... Юя
2025.05.12 15:08:41.319 File read sample:
2025.05.12 15:08:41.320 Start gzip
2025.05.12 15:08:41.384 GZIP detected
2025.05.12 15:08:42.582 UnGZIP time: 1198136 mcs
2025.05.12 15:08:42.593 File name: BTCUSD2025-05-09.csv, file size: 486006135
2025.05.12 15:08:42.593 Filr content: timestamp,symbol,side,size,price,tickDirection,trdMatchID,grossValue,homeNotional,foreignNotional,RP
2025.05.12 15:08:42.593 ... 36.00,ZeroPlusTick,e92fbea7-1471-591e-95f7-4dc0edde771c,971.4774228646926,1,9.714774228646926e-06,0
Paketin açılması yaklaşık 1,2 saniye sürdü.
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal kod: https://www.mql5.com/ru/code/59309

ADX (Average Directional Index) Smoothed göstergesi, gürültüyü azaltmak ve daha net trend sinyalleri sağlamak için çift üstel yumuşatma filtreleri uygulayarak standart ADX'i geliştirir. Üç çizgi çizer: yumuşatılmış +DI (mavi), -DI (kırmızı) ve ana ADX çizgisi (yeşil). Bu rafine versiyon, yatırımcıların trend gücünü ve potansiyel yön değişikliklerini daha az yanlış sinyalle belirlemelerine yardımcı olur. Gösterge, yerleşik trendleri teyit etmede ve gerçek fiyat dönüşleri gerçekleşmeden önce zayıflayan momentum konusunda uyarıda bulunmada üstündür, bu da onu hem trend takip stratejileri hem de optimum giriş/çıkış noktalarının belirlenmesi için değerli kılar.

Mevcut spread değerini, emirleri durdurmak için minimum mesafeyi (durdurma seviyesi) ve ticaret işlemlerini dondurmak için mesafeyi (dondurma seviyesi) gösterir.

Çift Trix Yükseltmesi 1.

Martingale yöntemini kullanarak sermaye yönetimi ile iki MACD üzerinde Uzman Danışman.