使用MQL5将OHLC值从Python API集成到MT5

时间:2018-06-27 10:58:51

标签: python mql5 metatrader5

我已经从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为Output of the command

现在我在输出中获取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")

2 个答案:

答案 0 :(得分:3)

好,你需要
1.收到经纪人的供稿(希望您成功了)
2.将其写入文件
     **(两者-python)**
3.阅读并解析
4.将其添加到历史记录中心/ marketWatch
   **(都是-mt5)**

  1. 因此,您在接收到字符串之后的数据 I_want_money.get_candles(goal,60,111,time.time()) 此字符串可以是json或json-array。

  2. 重要的问题当然是您要放置数据的路径。 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);

  3. 打开文件

为了解析json,您可以使用jason.mqh https://www.mql5.com/en/code/13663库(其他库很少),但据我所知它有一个错误:它无法正确解析对象数组。为了克服这个问题,我建议将每个刻度线写在单独的行上。 最后,您将在随机时间从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")  
 for string_ in receivedString:  
     file.write(string_)  
 file.close()  

如果您创建了一个线程,则每次从该线程收到答案时,您都会编写这样的文件。

接下来,您需要MT5中的数据。 最简单的方法是遍历现有文件,确保可以读取并读取(如果无法删除则放弃),读取后删除,然后继续处理接收到的数据。 最简单快捷的方法当然是使用0MQ,但让我们在没有dll的情况下进行操作。 为了读取文件,您需要设置一个计时器,使其尽可能快地工作,然后松开它。由于您无法让Windows应用休眠的时间少于15.6ms,因此您的计时器应休眠此时间。

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()是错误的。

这可以在反向测试器中工作吗?当然不是。第一,OnTimer()在MQL测试仪中不受支持。接下来,您需要一些历史记录以使其运行。如果您没有任何历史记录-没人能帮助您,经纪人可以把它交给您;最好的主意是立即开始收集和存储它,当项目准备就绪时(可能再过几个月),您将准备就绪,并能够使用可用的数据集测试和优化策略。您可以手动或使用tickDataSuite及其Csv2Fxt.ex4文件之类的东西将收集到的集合应用于测试器(与MQL4相比,MQL5实际上是算法交易开发的下一步),可以使测试器可以读取和处理HST二进制文件。无论如何,这是另一个问题,没有人能告诉您您的经纪人是否将其数据存储在某个地方以提供给您。

答案 1 :(得分:1)

在二读完您写(和编辑)的内容后,我可以看到您想要的:

  • 通过代理/远程与iqoption [同步]的符号
  • 该符号可用于回测
  • 该符号可用于屏幕实时/策略/指标运行

这意味着MT平台不允许以策略方式/指标进行自动操作-您可以通过提供数据包,将其解析为CSV并导入到自定义符号创建器来手动实现。有据可查的here

不幸的是,您选择了一个平台,该平台由自主设计代表着独立的策略和指标,对于初学者而言,比认真对待它的专业人员更重要。

请参阅我提供的链接,亲自看看。官方文档指出您可以通过mql ref创建自定义符号,但是即使它们在序言中指出,它也允许第三方提供者-在其他任何地方都未引用它,也没有显示任何集成可能性。


custom indicators

custom symbol properties