Alım-satım robotlarını ücretsiz olarak nasıl indirebileceğinizi izleyin
Bizi Facebook üzerinde bulun!
Fan sayfamıza katılın
Komut dosyasını ilginç mi buldunuz?
Öyleyse bir link gönderin -
başkalarının da faydalanmasını sağlayın
Komut dosyasını beğendiniz mi? MetaTrader 5 terminalinde deneyin
Görüntülemeler:
76
Derecelendirme:
(3)
Yayınlandı:
\MQL5\Scripts\ \MQL5\Include\
MQL5 Freelance 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 Indicator (MQL5) ADX Indicator (MQL5)

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.

spread_on_chart spread_on_chart

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

Dual Trix UpGrade_1 Dual Trix UpGrade_1

Çift Trix Yükseltmesi 1.

MartGreg MartGreg

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