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:
- 48
- Derecelendirme:
- Yayınlandı:
-
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, 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]](https://c.mql5.com/i/code/indicator.png)
Histogramlı MACD göstergesi, herhangi bir zaman diliminde (mevcut grafiğin zaman diliminden daha yüksek veya daha düşük) uygulanabilir.

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]](https://c.mql5.com/i/code/indicator.png)
RSI göstergesi, herhangi bir zaman dilimine uygulanabilir (mevcut grafiğin zaman diliminden daha yüksek veya daha düşük).