天天看点

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.