python mql4_使用MQL5将Python API中的OHLC值集成到MT5

好的,你需要

1收到经纪人的反馈(我希望你成功了)

2将其写入文件

**(两者-python)**

三。阅读并分析

4将其添加到历史中心/市场观察

**(两者-mt5)**因此,您将在

I_want_money.get_candles(goal,60,111,time.time())

这个字符串可能是json或json数组。

重要的问题当然是你将要放置数据的路径。MQL45专家只能访问两个文件夹(如果不应用dll):

C: \Users\MY_NAME_是_DANIEL_KNIAZ\AppData\Roaming\MetaQuotes\Terminal\MY_Terminal_ID_,格式为_HEX_\MQL4\Files

C: \Users\MY_NAME_是_DANIEL_KNIAZ\AppData\Roaming\MetaQuotes\Terminal\Common\Files

在后一种情况下,您需要使用const int handle=FileOpen(,|*| FILECOMMON);

为了解析json,可以使用杰森.mqhhttps://www.mql5.com/en/code/13663库(其他库很少),但据我所知它有一个缺陷:它不能正确地解析对象数组。为了克服这个问题,我建议把每一个记号写在一行。

最后,您将随机从python应用程序接收数据,并将其写入Common或direct文件夹中。MT5机器人将读取并删除。为了避免混淆,最好确保文件具有唯一的名称。要么是随机的(随机.randint(11000)或从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.6ms,你的计时器应该休眠这个时间。在

^{pr2}$

这段代码循环文件夹并处理它找到的每个文件。

现在读取文件(两个函数)并处理其中的消息: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,杰森.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

{

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()的请求由于某种原因会出错。在

这能在背部测试仪上工作吗?当然不是。首先,OnTimer()在MQL tester中不受支持。接下来,您需要一些历史记录才能使其运行。如果你没有任何历史记录-没有人能帮你摆脱经纪人可以给你的信息;最好的办法是现在就开始收集和存储,当项目准备好(也许再过几个月),你就可以准备好了,并且能够用可用的数据集测试和优化策略。您可以将收集到的集合应用到tester中(与MQL4相比,MQL5实际上是algo交易开发的下一步),可以手动使用,也可以使用tickDataSuite及其Csv2之类的工具外汇交易所4生成HST二进制文件的文件,测试人员可以读取和处理这些文件;不管怎样,这是另一个问题,没有人可以告诉您代理是否存储了提供给你的数据。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值