天天看點

python mql4_使用MQL5将OHLC值從Python API內建到MT5

我已經從iqoption獲得了OHLC值,并試圖找到将其與MT5結合使用的方法。

這是我得到值的方式:

importtimefromiqoptionapi.stable_apiimportIQ_Option

I_want_money=IQ_Option("email","password")goal="EURUSD"print("get candles")print(I_want_money.get_candles(goal,60,111,time.time()))

該行:I_want_money.get_candles(goal,60,111,time.time())輸出json為:指令的輸出

現在,我想在輸出中擷取json,是以它的工作原理類似于API。

同時,我嘗試在MT5中建立一個自定義符号iqoption。現在,我隻想從API向其中添加OHLC的資料,以便它将繼續從Iqoption提取資料并在圖表視窗上顯示自定義符号的圖表iqoption。

但是我無法将其加載到自定義符号中。請幫幫我。

已編輯

這是來自iqoption的實時流資料的代碼:

fromiqoptionapi.stable_apiimportIQ_Optionimportloggingimporttime

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 thingans=I_want_money.thread_collect_realtime.items()fork,vinans: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.将其寫入檔案

**(均為python)**

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_DANIM_KANI Terminal \ Common \ Files,在後一種情況下,您需要使用const int handle = FileOpen(,| * | FILECOMMON);打開檔案。

為了解析json,您可以使用jason.mqhhttps://www.mql5.com/en/code/13663庫(其他庫很少),但據我所知它有一個bug:它無法解析數組對象正确。為了克服這個問題,我建議将每個刻度線寫在單獨的行上。最後,您将在随機時間從python應用程式接收資料,并将其寫入Common或direct檔案夾。MT5機械手将讀取并删除。為了避免混淆,最好保證檔案具有唯一的名稱。從日期時間開始随機(random.randint(1,1000))或毫秒都可以提供幫助。

到目前為止,您已經有了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")forstring_inreceivedString:file.write(string_)file.close()

如果您建立了一個線程,則每次從該線程收到答案時,您都會編寫這樣的檔案。

接下來,您需要MT5中的資料。最簡單的方法是周遊現有檔案,確定可以讀取并讀取(如果無法删除則放棄),讀取後删除,然後繼續處理接收到的資料。最簡單快捷的方法當然是使用0MQ,但讓我們在沒有dll的情況下進行操作。為了讀取檔案,您需要設定一個計時器,使其盡可能快地工作,然後松開它。由于您不能讓Windows應用程式休眠少于15.6毫秒,是以您的計時器應休眠此時間。

string path;intOnInit(){EventSetMillisecondTimer(16);path="iqoptionfeed\\*";}voidOnDeinit(const int reason){EventKillTimer();}string _fileName;long _search_handle;voidOnTimer(){_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);}boolReadFile(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);}voidRead(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

不要忘記添加調試資訊,并且GetLastError()由于某些原因而請求錯誤。

可以在反向測試器中工作嗎?當然不是。拳頭,OnTimer() is not supported in MQL tester. Next, you need some history record in order to make it running. If you do not have any history - Nobody can help you unlees a broker can give it to you; the best idea could be to start collecting and storing it right now, and when the project is ready (maybe another couple months), you will have it ready and be able to test and optimize the strategy with the available dataset. You can apply the collected set into tester (MQL5 is really the next step in algo trading development compared to MQL4), either manually or with something like tickDataSuite and its Csv2Fxt.ex4 file that makes HST binary files that the tester can read and process; anyway that is another question and nobody can tell you if your broker stores their data somewhere to provide it to you.