MetaTrader5
MetaTrader 5 के लिए सभी टिक डाउनलोड करें: एक आसान गाइड
क्या आप MetaTrader 5 पर सभी उपलब्ध टिक को डाउनलोड करना चाहते हैं? यह एक्सपर्ट एडवाइजर कोड आपके लिए एक बेहतरीन समाधान है। यह आपके ब्रोकर के मार्केट वॉच को स्कैन करता है और उन प्रतीकों के लिए सभी टिक डाउनलोड करता है, जिनकी आपको आवश्यकता है।
यह आपकी बैकटेस्टिंग के लिए सभी प्रतीकों का इतिहास डाउनलोड करने में मदद कर सकता है, या फिर आप उन टिक से एक कस्टम चार्ट बना सकते हैं। ध्यान रखें कि आपके टर्मिनल पर डेटा फ़ोल्डर में टिक कैश होते हैं, इसलिए सुनिश्चित करें कि आपके पास पर्याप्त हार्ड ड्राइव स्पेस हो।
प्रतीकों के डाउनलोड को सुविधाजनक बनाने के लिए, हमें सबसे पहले एक डाउनलोड मैनेजर की आवश्यकता होगी। CDownloadManager संरचना में वह सारी जानकारी शामिल है जो हमें बनाए रखने की आवश्यकता है।
struct CDownloadManager
{
bool m_started,m_finished;
string m_symbols[],m_current;
int m_index;
}
डाउनलोड की स्थिति (शुरू/समाप्त)
स्कैन करने के लिए प्रतीकों की सूची
वर्तमान प्रतीक
स्कैन किए जा रहे प्रतीक का अनुक्रमांक
हमें हार्ड ड्राइव पर पढ़ने और लिखने की आवश्यकता होगी, और चूंकि हम प्रतीकों के साथ काम कर रहे हैं, इसलिए हम बाइनरी फ़ाइलों से स्ट्रिंग्स के पढ़ने और लिखने के लिए 2 त्वरित फ़ंक्शन बनाएंगे।
फाइल में स्ट्रिंग सहेजने का फ़ंक्शन:
void writeStringToFile(int f,string thestring)
{
// प्रतीक स्ट्रिंग को सहेजें
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);
}
}
यह फ़ंक्शन निम्नलिखित लेता है:
फाइल हैंडल f, जो लिखने और बाइनरी फ्लैग FILE_WRITE|FILE_BIN के लिए खोला गया है।
फाइल में लिखने के लिए स्ट्रिंग।
फाइल से स्ट्रिंग पढ़ने का फ़ंक्शन:
string readStringFromFile(int f)
{
string result="";
// प्रतीक स्ट्रिंग को लोड करें
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);
}
यह फ़ंक्शन निम्नलिखित लेता है:
फाइल हैंडल f, जो पढ़ने के लिए बाइनरी के रूप में खोला गया है, फ्लैग FILE_READ|FILE_BIN।
अब हम CDownloadManager संरचना को प्रारंभ करने और मार्केट वॉच से भरने के लिए एक तरीका बनाएंगे:
//+------------------------------------------------------------------+
//| मार्केट वॉच से प्रतीकों को प्राप्त करें |
//+------------------------------------------------------------------+
void grab_symbols()
{
//! केवल मार्केट वॉच से!
int s=SymbolsTotal(true);
ArrayResize(m_symbols,s,0);
for(int i=0;i<ArraySize(m_symbols);i++)
{
m_symbols[i]=SymbolName(i,true);
}
}
यह बहुत सीधा है:
मार्केट वॉच में कितने सक्रिय प्रतीक हैं, इसकी पूछताछ करें।
हमारे m_symbols ऐरे को उनकी संख्या के अनुसार आकार दें।
संकेतकों की कुल संख्या में लूप करें और प्रतीक का नाम मांगें।
अब हम प्रतीक डेटा के डाउनलोड को प्रबंधित करने के लिए एक फ़ंक्शन बनाएंगे जो मूल रूप से प्रबंधक होगा:
//+------------------------------------------------------------------+
//| प्रतीकों के डाउनलोड प्रक्रिया का प्रबंधन करें |
//+------------------------------------------------------------------+
void manage(string folder,string filename)
{
// यह मूल रूप से अगले प्रतीक पर नेविगेट करता है
// यदि सेट है
if(ArraySize(m_symbols)>0)
{
// यदि शुरू नहीं हुआ
if(!m_started)
{
m_started=true;
// पहले प्रतीक पर जाएं
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;
}
// यदि शुरू हो गया है
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("समाप्त");
ExpertRemove();
return;
}
}
else
{
Print("कृपया पहले प्रतीक प्राप्त करें");
}
// यदि सेट समाप्त होता है
}
कैसे काम करता है सिस्टम:
चार्ट खुलता है, हमें 1 चार्ट की आवश्यकता होती है, और एक टाइमर सेट होता है।
वह टाइमर निष्पादित होता है, हम टाइमर को रद्द करते हैं।
हम यह जांचते हैं कि क्या यह एक नया डाउनलोड है या एक निरंतर डाउनलोड।
यदि यह एक नया डाउनलोड है, तो हम सभी प्रतीकों को प्राप्त करके इसे सेट करते हैं।
यदि यह एक निरंतर डाउनलोड है, तो हम वर्तमान प्रतीक के लिए डेटा डाउनलोड करते हैं।
यह कोड का वह हिस्सा है जो टाइमर पर डाउनलोड का संचालन करता है:
//+------------------------------------------------------------------+
//| टाइमर |
//+------------------------------------------------------------------+
void OnTimer()
{
//--- यदि समन्वयित
if(SymbolIsSynchronized(_Symbol)&&TerminalInfoInteger(TERMINAL_CONNECTED)==1)
{
EventKillTimer();
//--- यहां सिस्टम लोड करें
if(MANAGER.load(MANAGER_FOLDER,MANAGER_STATUS_FILE))
{
//--- सिस्टम लोड हो गया है, इसलिए हम यहां एक प्रतीक को स्कैन कर रहे हैं
Comment("सिस्टम लोड हो गया है और हम प्रोसेसिंग कर रहे हैं "+MANAGER.m_current);
//--- टिक लोड
//--- पहले ब्रोकर में उपलब्ध सबसे पुराना टिक खोजें
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("कृपया प्रतीक्षा करें");
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("सबसे पुराना टिक: "+TimeToString((datetime)(oldest/1000),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"\nकर्सर("+TimeToString((datetime)(cursorMSC/1000),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+")\nप्रयास("+IntegerToString(attempts)+")\nकृपया प्रतिक्रिया की प्रतीक्षा करें...");
}
//--- इस बिंदु पर हमारे पास सबसे पुराना टिक है
//--- सबसे पुराने से सबसे नए तक टिक के लिए अनुरोध करना शुरू करें
if(oldest!=LONG_MAX)
{
ArrayFree(receiver);
datetime newest_tick=0;
//--- इस प्रतीक के लिए अंतिम टिक समय प्राप्त करें, जो symbol_time में संग्रहीत है
datetime most_recent_candle=(datetime)SymbolInfoInteger(_Symbol,SYMBOL_TIME);
while(newest_tick<most_recent_candle)
{
//--- सबसे पुराने समय से टिक की सीमा निर्धारित करते हुए नया बैच अनुरोध करें
int pulled=CopyTicks(_Symbol,receiver,COPY_TICKS_ALL,oldest,tick_packets);
if(pulled>0)
{
//--- यदि हम एक नया बैच खींचते हैं तो हमारे डाउनलोड किए गए समय को अपडेट करें
newest_tick=receiver[pulled-1].time;
oldest=receiver[pulled-1].time_msc;
ArrayFree(receiver);
}
//--- सर्वर अनुरोधों का टाइमआउट, यदि आप चाहें तो इसे बदलें
Sleep(44);
Comment("अब तक खींचा गया है "+TimeToString(newest_tick,TIME_DATE|TIME_MINUTES|TIME_SECONDS)+" तक");
}
}
else
{
Alert("कृपया टर्मिनल बंद करें \n टिक फ़ोल्डर पर जाएं \n और खाली फ़ोल्डर हटा दें");
ExpertRemove();
}
//--- प्रबंधक को अपडेट करें और आगे बढ़ें
MANAGER.manage(MANAGER_FOLDER,MANAGER_STATUS_FILE);
}
else
{
//--- मार्केट वॉच प्रतीकों को डाउनलोड शुरू करने के लिए प्राप्त करें
Comment("मार्केट वॉच प्राप्त करना और शुरू करना");
MANAGER.grab_symbols();
MANAGER.manage(MANAGER_FOLDER,MANAGER_STATUS_FILE);
}
}
}
इस कोड के माध्यम से आप MetaTrader 5 पर सभी टिक को सफलतापूर्वक डाउनलोड कर सकते हैं। यदि आपके कोई प्रश्न हैं या आप और जानकारी चाहते हैं, तो बेझिझक पूछें!
2025.02.22