[英]MT5/Metatrader 5 connect to different MT5 terminals using python
[英]Integrating the OHLC value from Python API to MT5 using MQL5
我從iqoption獲得了OHLC值,並試圖找到一種方法將其與MT5一起使用。
以下是我獲得這些值的方法:
import time
from iqoptionapi.stable_api import IQ_Option
I_want_money=IQ_Option("email","password")
goal="EURUSD"
print("get candles")
print(I_want_money.get_candles(goal,60,111,time.time()))
上面的代碼庫在這里: iqoptionapi
行: I_want_money.get_candles(goal,60,111,time.time())
輸出json為: 命令輸出
現在我在輸出中獲取json,所以它像API一樣工作,我想是的。
同時,我嘗試在MT5中創建自定義符號作為iqoption
。 現在我只想將API中的OHLC數據添加到它,以便它繼續從Iqoption獲取數據並在圖表窗口中顯示自定義符號iqoption
的圖表。
但我無法在自定義符號中加載它。 請幫助我。
編輯
這是來自iqoption的實時流數據的代碼:
from iqoptionapi.stable_api import IQ_Option
import logging
import time
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(message)s')
I_want_money=IQ_Option("email","password")
I_want_money.start_candles_stream("EURUSD")
thread=I_want_money.collect_realtime_candles_thread_start("EURUSD",100)
I_want_money.start_candles_stream("USDTRY")
thread2=I_want_money.collect_realtime_candles_thread_start("USDTRY",100)
time.sleep(3)
#Do some thing
ans=I_want_money.thread_collect_realtime.items()
for k, v in ans:
print (k, v)
I_want_money.collect_realtime_candles_thread_stop(thread)
I_want_money.stop_candles_stream("EURUSD")
I_want_money.collect_realtime_candles_thread_stop(thread2)
I_want_money.stop_candles_stream("USDTRY")
好的,你需要
1.從經紀人那里收到飼料(我希望你成功)
2.將其寫入文件
**(兩個 - 蟒蛇)**
3.閱讀並解析它
4.將其添加到歷史中心/ marketWatch
**(兩個 - mt5)**
因此,在I_want_money.get_candles(goal,60,111,time.time())
之后,您將以字符串形式接收數據,此字符串可能是json或json-array。
重要的問題當然是你要放置數據的路徑。 MQL45專家只能訪問兩個文件夾(如果不應用dll):C:\\ Users \\ MY_NAME_IS_DANIEL_KNIAZ \\ AppData \\ Roaming \\ MetaQuotes \\ Terminal \\ MY_TERMINAL_ID_IN_HEX_FORMAT \\ MQL4 \\ Files和C:\\ Users \\ MY_NAME_IS_DANIEL_KNIAZ \\ AppData \\ Roaming \\ MetaQuotes \\ Terminal \\ Common \\ Files在后一種情況下你需要用const int handle = FileOpen( , | * | FILECOMMON)打開一個文件;
為了解析json,你可以使用jason.mqh https://www.mql5.com/en/code/13663庫(還有其他幾個)但據我記得它有一個bug:它無法解析數組對象正確。 為了克服這個問題,我建議將每個刻度線寫在一個單獨的行上。 最后,您將在隨機時間從python應用程序接收數據,並將其寫入Common或direct文件夾。 MT5機器人將讀取並刪除。 為了避免混淆,最好保證文件具有唯一的名稱。 隨機(random.randint(1,1000))或datetime的毫秒可以提供幫助。
到目前為止,你有python代碼:
receivedString = I_want_money.get_candles(goal,60,111,time.time())
filePath = 'C:\Users\MY_NAME_IS_DANIEL_KNIAZ\AppData\Roaming\MetaQuotes\Terminal\MY_TERMINAL_ID_IN_HEX_FORMAT\MQL4\Files\iqoptionfeed'
fileName = os.path.join(filePath,"_"+goal+"_"+str(datetime.now())+".txt")
file = open(fileName, "w")
for string_ in receivedString:
file.write(string_)
file.close()
如果您創建了一個線程,每次從線程收到答案時,您都會編寫這樣的文件。
接下來,您需要MT5中的數據。 最簡單的方法是循環遍歷現有文件,確保您可以讀取它們並閱讀(或者如果不能放棄)並在閱讀后刪除,然后繼續處理收到的數據。 最簡單快捷的方法是使用0MQ,但讓我們不用dll就可以了。 為了讀取文件,您需要設置一個可以盡快工作的計時器,然后放手。 由於你不能使Windows應用程序的睡眠時間少於15.6毫秒,你的計時器應該睡了這么多時間。
string path;
int OnInit()
{
EventSetMillisecondTimer(16);
path="iqoptionfeed\\*";
}
void OnDeinit(const int reason) { EventKillTimer(); }
string _fileName;
long _search_handle;
void OnTimer()
{
_search_handle=FileFindFirst(path,_fileName);
if(_search_handle!=INVALID_HANDLE)
{
do
{
ResetLastError();
FileIsExist(_fileName);
if(GetLastError()!=ERR_FILE_IS_DIRECTORY)
processFile(path+_fileName);
}
while(FileFindNext(_search_handle,_fileName));
FileFindClose(_search_handle);
}
}
這段代碼循環文件夾並處理它設法找到的每個文件。 現在讀取文件(兩個函數)並處理其中的消息:
void processFile(const string fileName)
{
string message;
if(ReadFile(fileName,message))
processMessage(message,fileName);
}
bool ReadFile(const string fileName,string &result,const bool common=false)
{
const int handle = FileOpen(fileName,common?(FILE_COMMON|FILE_READ):FILE_READ);
if(handle==INVALID_HANDLE)
{
printf("%i - failed to find file %s (probably doesnt exist!). error=%d",__LINE__,fileName,GetLastError());
return(false);
}
Read(handle,result);
FileClose(handle);
if(!FileDelete(fileName,common?FILE_COMMON:0))
printf("%i - failed to delete file %s/%d. error=%d",__LINE__,fileName,common,GetLastError());
return(true);
}
void Read(const int handle,string &message)
{
string text="";
while(!FileIsEnding(handle) && !IsStopped())
{
text=StringConcatenate(text,FileReadString(handle),"\n");
}
//printf("%i %s - %s.",__LINE__,__FUNCTION__,text);
message=text;
}
最后但並非最不重要:處理獲得的文件。 如上所述,它為每個新的刻度都有一個json格式的刻度,用\\ r \\ n分隔。
我們的目標是將其添加到符號中。 為了解析json,jason.mqh是一個可用的解決方案,但你當然可以手動解析它。
void processMessage(const string message,const string fileName)
{
string symbolName=getSymbolFromFileName(fileName);
if(!SymbolSelect(symbolName,true))
{
if(!CustomSymbolCreate(symbolName))
return;
}
string lines[];
int size=StringSplit(message,(ushort)'\n',lines);
for(int i=0;i<size;i++)
{
if(StringLen(lines[i])==0)
continue;
CJAVal jLine(jtUNDEF,NULL);
jLine.Deserialize(lines[i]);
MqlTick mql;
//here I assume that you receive a json file like " { "time":2147483647,"bid":1.16896,"ask":1.16906,"some_other_data":"someOtherDataThatYouMayAlsoUse" } "
mql.time=(datetime)jLine["time"].ToInt();
mql.bid=(double)jLine["bid"].ToDbl();
mql.ask=(double)jLine["ask"].ToDbl();
ResetLastError();
if(CustomTicksAdd(symbolName,mql)<0)
printf("%i %s - failed to upload tick: %s %s %.5f %.5f. error=%d",__LINE__,__FILE__,symbolName,TimeToString(mql.time),mql.bid,mql.ask,GetLastError());
}
}
string getSymbolFromFileName(const string fileName)
{
string elements[];
int size=StringSplit(fileName,(ushort)'_',elements);
if(size<2)
return NULL;
return elements[1];
}
不要忘記添加調試信息, GetLastError()
請求是出於某種原因導致錯誤。
這可以在后面的測試儀中工作嗎? 當然不是。 MQL測試器不支持Fist, OnTimer()
。 接下來,您需要一些歷史記錄才能使其運行。 如果您沒有任何歷史記錄 - 沒有人可以幫助您,經紀人可以將其提供給您; 最好的想法可能是立即開始收集和存儲它,當項目准備就緒(可能還有幾個月)時,您將准備好並能夠使用可用的數據集測試和優化策略。 您可以將收集的集合應用到測試人員(MQL5實際上是與MQL4相比的算法交易開發的下一步),可以手動或使用類似tickDataSuite及其Csv2Fxt.ex4文件來生成測試人員可以讀取和處理的HST二進制文件; 無論如何這是另一個問題,沒有人可以告訴你,你的經紀人是否將他們的數據存儲在某個地方以便提供給你。
在二讀你寫的(和編輯過的)之后,我可以看到你想要:
這意味着MT平台不允許以自動方式進行戰略/指標之外的操作 - 您可以通過提供數據包,將其解析為CSV並導入到自定義符號創建者來手動實現。 這里有詳細記錄 。
不幸的是,你選擇了一個平台,其設計代表了自成一體的策略和指標,對於初學者來說,比認真對待它的專業人士更多。
請參閱我提供的鏈接並親自查看。 官方文檔聲明您可以通過mql ref創建自定義符號,但即使他們聲明,在前言中,它允許第三方提供商 - 它沒有在其他任何地方引用,也沒有顯示任何集成可能性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.