Alım-satım robotlarını ücretsiz olarak nasıl indirebileceğinizi izleyin
Bizi Twitter ü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
Uzman Danışmanlar

Download all ticks of a symbol's history - MetaTrader 5 için Uzman Danışman

Görüntülemeler:
48
Derecelendirme:
(5)
Yayınlandı:
MQL5 Freelance Bu koda dayalı bir robota veya göstergeye mi ihtiyacınız var? Freelance üzerinden sipariş edin Freelance'e git

Bu uzman danışman kodu, kullanıcının komisyoncusunun piyasa izlemesini tarayacak ve mevcut tüm keneleri veya bir tarihe kadar olan keneleri indireceği sembolleri çıkaracaktır.

Geriye dönük testiniz için tüm sembol geçmişini indirmenize veya bu tiklerden özel bir grafik oluşturmanıza yardımcı olabilir.

Terminaller veri klasöründeki keneleri önbelleğe alacaktır, bu nedenle yeterli sabit disk alanınız olduğundan emin olun.

Sembollerin indirilmesini kolaylaştırmak için önce bir indirme yöneticisine ihtiyacımız var.

CDownloadManager yapısı, saklamamız gereken tüm bilgileri içerir.

struct CDownloadManager
  {
   bool              m_started,m_finished;
   string            m_symbols[],m_current;
   int               m_index;

  • İndirme işleminin durumu (başladı/bitti)
  • taranacak sembollerin listesi
  • geçerli sembol
  • ve taranmakta olan sembolün indeksi

Ayrıca sabit sürücüyü okumamız ve yazmamız gerekecek ve sembollerle çalıştığımız için ikili dosyalardan dizeleri yazmak ve okumak için 2 hızlı fonksiyon oluşturuyoruz.

Dizeyi dosyaya kaydetme fonksiyonu :

void writeStringToFile(int f,string thestring)
  {
//sembol dizesini kaydet
   char sysave[];
   int charstotal=StringToCharArray(thestring,sysave,0,StringLen(thestring),CP_ACP);
   FileWriteInteger(f,charstotal,INT_VALUE);
   for(int i=0;i<charstotal;i++)
     {
      FileWriteInteger(f,sysave[i],CHAR_VALUE);
     }
  }

Alır :

  • dosya tanıtıcısı f, yazma ve ikili bayraklar için açılmış bir dosyanın FILE_WRITE|FILE_BIN
  • dosyaya yazılacak dize

Dizede kaç karakter olduğuna dair bir tamsayı uzunluğu yazar ve ardından her karakteri dizede saklar.

Dosyadan dize yükle işlevi:

string readStringFromFile(int f)
  {
   string result="";
//sembol dizesini yükle
   char syload[];
   int charstotal=(int)FileReadInteger(f,INT_VALUE);
   if(charstotal>0)
     {
      ArrayResize(syload,charstotal,0);
      for(int i=0;i<charstotal;i++)
        {
         syload[i]=(char)FileReadInteger(f,CHAR_VALUE);
        }
      result=CharArrayToString(syload,0,charstotal,CP_ACP);
     }
   return(result);
  }

Bu alır:

  • ikili olarak okumak için açılmış bir dosyanın dosya tanıtıcısı f , bayraklar FILE_READ|FILE_BIN

Dosyanın o noktasında kaç karakter bekleneceğine dair bir tamsayı uzunluğu okur. Her karakteri bir char dizisine okumaya devam eder ve ardından bu char dizisinden, yüklemenin sonucu olarak bir dize olarak döndürülen bir dize oluşturur.

CDownloadManager yapısına geri dönelim. Yöneticiyi başlatmak ve piyasa saatinden doldurmak için bir yola ihtiyacımız var:

   //+------------------------------------------------------------------+
   //| piyasa saatinden sembolleri yakala|
   //+------------------------------------------------------------------+
   void              grab_symbols()
     {
      //! sadece mw'den!
      int s=SymbolsTotal(true);
      ArrayResize(m_symbols,s,0);
      for(int i=0;i<ArraySize(m_symbols);i++)
        {
         m_symbols[i]=SymbolName(i,true);
        }
     }

Oldukça basit :

  • piyasa izlemede kaç sembol olduğunu sor (aktif)
  • m_symbols dizimizi bunları alacak şekilde yeniden boyutlandırın
  • toplam semboller içinde döngü oluşturun ve sembolün adını isteyin

Ayrıca sembol verilerinin indirilmesini yönetmekten de sorumluyuz, bu nedenle esasen yönetici olan bir işleve ihtiyacımız olacak:

   //+------------------------------------------------------------------+
   //| Sembol indirme işlemini yönetin|
   //+------------------------------------------------------------------+
   void              manage(string folder,string filename)
     {
      //esasen bu bir sonraki sembolü başlatır veya ona gider
      //eğer ayarlanmışsa
      if(ArraySize(m_symbols)>0)
        {
         //eğer başlatılmamışsa
         if(!m_started)
           {
            m_started=true;
            //ilk sembole git
            m_current=m_symbols[0];
            m_index=1;
            save(folder,filename);
            if(_Symbol!=m_current)
              {
               ChartSetSymbolPeriod(ChartID(),m_current,_Period);
              }
            else
              {
               ENUM_TIMEFRAMES new_period=PERIOD_M1;
               for(int p=0;p<ArraySize(TFS);p++)
                 {
                  if(_Period!=TFS[p])
                    {
                     new_period=TFS[p];
                     break;
                    }
                 }
               ChartSetSymbolPeriod(ChartID(),m_current,new_period);
              }
            return;
           }
         //eğer başladıysa
         else
           {
            m_index++;
            if(m_index<=ArraySize(m_symbols))
              {
               m_current=m_symbols[m_index-1];
               save(folder,filename);
               if(_Symbol!=m_current)
                 {
                  ChartSetSymbolPeriod(ChartID(),m_current,_Period);
                 }
               return;
              }
            else
              {
               m_finished=true;
               FileDelete(folder+"\\"+filename);
               Print("Finished");
               ExpertRemove();
               return;
              }
           }
        }
      else
        {
         Print("Please grab symbols first");
        }
      //eğer set burada bitiyorsa
     }

Sistem nasıl çalışır :

  • Grafik açılır, 1 grafiğe ihtiyacımız var ve bir zamanlayıcı ayarlanır.
  • Bu zamanlayıcı çalışır, zamanlayıcıyı iptal ederiz
  • Bunun yeni bir indirme mi yoksa devam eden bir indirme mi olduğunu kontrol ediyoruz
  • Yeni bir indirme ise, tüm sembolleri alarak ayarlarız
  • Devam eden bir indirme ise, mevcut sembol için verileri indiririz

Bu, kodun zamanlayıcı üzerinde indirme işlemini gerçekleştiren kısmıdır:

//+------------------------------------------------------------------+
//|Zamanlayıcı|
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- senkronize edilmişse
   if(SymbolIsSynchronized(_Symbol)&&TerminalInfoInteger(TERMINAL_CONNECTED)==1)
     {
      EventKillTimer();
      //--- sistemi buraya yükleyin
      if(MANAGER.load(MANAGER_FOLDER,MANAGER_STATUS_FILE))
        {
         //--- sistem yüklendi, bu yüzden burada bir sembol tarıyoruz
         Comment("System loaded and we are processing "+MANAGER.m_current);
         //--- tik yüklemesi

         //--- önce brokerda mevcut olan en eski tick'i bulun
         int attempts=0;
         int ping=-1;
         datetime cursor=flatten(TimeTradeServer());
         long cursorMSC=((long)cursor)*1000;
         long jump=2592000000;//60*60*24*30*1000;

         MqlTick receiver[];
         long oldest=LONG_MAX;
         Comment("PleaseWait");
         while(attempts<5)
           {
            ping=CopyTicks(_Symbol,receiver,COPY_TICKS_ALL,cursorMSC,1);
            if(ping==1)
              {
               if(receiver[0].time_msc==oldest)
                 {
                  attempts++;
                 }
               else
                 {
                  attempts=0;
                 }
               if(receiver[0].time_msc<oldest)
                 {
                  oldest=receiver[0].time_msc;
                 }
               cursorMSC-=jump;
               if(limitDate&&receiver[0].time<=oldestLimit)
                 {
                  break;
                 }
              }
            else
              {
               attempts++;
              }

            Sleep(44);
            Comment("Oldest Tick : "+TimeToString((datetime)(oldest/1000),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"\nCursor("+TimeToString((datetime)(cursorMSC/1000),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+")\nAttempts("+IntegerToString(attempts)+")\nPlease wait for response...");
           }
         //--- bu noktada en eski tikimiz var
         //--- en eskiden en yeniye doğru tik istemeye başlayın
         if(oldest!=LONG_MAX)
           {
            ArrayFree(receiver);
            datetime newest_tick=0;
            //--- symbol_time içinde saklanan bu sembol için son tik zamanını alır
            datetime most_recent_candle=(datetime)SymbolInfoInteger(_Symbol,SYMBOL_TIME);
            while(newest_tick<most_recent_candle)
              {
               //--- belirtilen tik sınırı ile en eski zamandan başlayarak yeni bir parti talep edin
               int pulled=CopyTicks(_Symbol,receiver,COPY_TICKS_ALL,oldest,tick_packets);
               if(pulled>0)
                 {
                  //--- yeni bir parti çekersek indirilen zamanlarımızı güncelleriz
                  newest_tick=receiver[pulled-1].time;
                  oldest=receiver[pulled-1].time_msc;
                  ArrayFree(receiver);
                 }
               //--- sunucu isteklerini zaman aşımına uğratın, isterseniz değiştirin
               Sleep(44);
               Comment("Pulled up to "+TimeToString(newest_tick,TIME_DATE|TIME_MINUTES|TIME_SECONDS)+" so far");
              }
           }
         else
           {
            Alert("Please close the terminal \n head over to the ticks folder \n and delete the empty folders");
            ExpertRemove();
           }
         //--- yöneticiyi güncelleyin ve devam edin
         MANAGER.manage(MANAGER_FOLDER,MANAGER_STATUS_FILE);
        }
      else
        {
         //--- i̇ndi̇rmeye başlamak i̇çi̇n market watch sembolleri̇ni̇ alin
         Comment("Grabbing MW and starting");
         MANAGER.grab_symbols();
         MANAGER.manage(MANAGER_FOLDER,MANAGER_STATUS_FILE);
        }
     }
  }


MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal kod: https://www.mql5.com/en/code/56324

MACD renkli histogram MACD renkli histogram

MACD Renkli Histogram, klasik MACD (Moving Average Convergence Divergence) göstergesinin piyasa momentumunun daha net ve sezgisel bir görsel analizini sağlamak üzere tasarlanmış gelişmiş bir versiyonudur. Bu gösterge, geleneksel MACD işlevlerini MACD Çizgisi ile Sinyal Çizgisi arasındaki ilişkiye bağlı olarak renk değiştiren dinamik bir histogramla birleştirerek yatırımcıların piyasadaki trendleri, dönüş noktalarını ve kararsızlık anlarını hızlı bir şekilde belirlemelerine olanak tanır.

MACD Histogram, multi-timeframe, multi-color [v03] MACD Histogram, multi-timeframe, multi-color [v03]

Histogramlı MACD göstergesi, herhangi bir zaman diliminde (mevcut grafiğin zaman diliminden daha yüksek veya daha düşük) uygulanabilir.

Functions to simplify work with orders Functions to simplify work with orders

Tek istediğimiz algoritmalar ve yöntemler hakkında düşünmek, sözdizimi ve emirlerin nasıl verileceği hakkında değil. Burada MQL5'te pozisyonları yönetmek için basit fonksiyonlara sahipsiniz.

RSI multi-timeframe [v03] RSI multi-timeframe [v03]

RSI göstergesi, herhangi bir zaman dilimine uygulanabilir (mevcut grafiğin zaman diliminden daha yüksek veya daha düşük).