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

使用MQL5将OHLC值从Python API集成到MT5,python,mql5,metatrader5,Python,Mql5,Metatrader5,我已从IQ选项中获得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())) 上述代码库

我已从IQ选项中获得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()))
上述代码库位于此处:

行:
我想要钱。得到蜡烛(目标,60111,time.time())
将json输出为:

现在我在输出中得到json,所以它就像API一样工作,我想是的

同时,我尝试在MT5中创建一个自定义符号作为
iqoption
。现在我只想将来自API的OHLC数据添加到其中,这样它将继续从Iqoption获取数据,并在图表窗口中显示自定义符号
Iqoption
的图表

但我无法将其加载到自定义符号中。请帮帮我

已编辑

这是IQ选项中实时流媒体数据的代码:

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")

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

  • 与iqoption同步的符号[通过代理/远程]
  • 该符号可用于回溯测试
  • 该符号可用于屏幕直播/策略/指标运行
这意味着在战略/指标之外的操作,而MT平台不允许以自动方式进行这些操作-您可以通过提供数据包、将其解析为CSV并导入自定义符号创建者来手动实现。有据可查

不幸的是,您选择的平台在设计上代表了自足的策略和指标,更多的是面向初学者,而不是认真对待它的专业人士

请参考我提供的链接,并亲自查看。官方文档声明您可以通过mql创建自定义符号,但即使在前言中声明,它也允许第三方提供者-它没有在其他地方引用,也没有显示任何集成可能性


好的,你需要 1.从代理处接收提要(我希望您成功)
2.将其写入文件
**(两者都是python)**
3.阅读并分析它
4.将其添加到历史中心/市场观察
**(两者-mt5)**

  • 因此,您在
    我想要钱。拿蜡烛(目标,60111,time.time())
    此字符串可能是json或json数组

  • 当然,重要的问题是您将要放置数据的路径。MQL45中的专家只能访问两个文件夹(如果不应用dll): C:\Users\MY\u NAME\u是\u DANIEL\u KNIAZ\AppData\Roaming\MetaQuotes\Terminal\MY\u Terminal\u ID\u格式\MQL4\Files 及 C:\Users\MY\u NAME\u是\u DANIEL\u KNIAZ\AppData\Roaming\MetaQuotes\Terminal\Common\Files 在后一种情况下,您需要使用const int handle=FileOpen(,|*| FILECOMMON)打开一个文件

  • 为了解析json,您可以使用jason.mqh库(其他库很少),但据我所知,它有一个bug:它无法正确解析对象数组。为了克服这个问题,我建议把每个记号写在单独的一行。 最后,您将随机从python应用程序接收数据,并将其写入公共或直接文件夹。MT5机器人将读取并删除它。为了避免混淆,最好保证文件具有唯一的名称。随机(random.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,因此计时器应睡眠此时间

    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];
      }
    
    void processMessage(常量字符串消息,常量字符串文件名)
    {
    字符串symbolName=getSymbolFromFileName(文件名);
    如果(!SymbolSelect(symbolName,true))
    {
    如果(!CustomSymbolCreate(symbolName))
    返回;
    }
    字符串行[];
    int size=StringSplit(消息,(ushort)'\n',行);
    
    对于(int i=0;i请让我知道答案。如果您想使用获取的数据在MT5中对策略进行回溯测试,这似乎是可行的。是否要在图形界面中对其进行测试?如果这是您的场景,我将尝试帮助您。我希望它显示在屏幕上以及回溯测试中。从API中获取的实时数据,然后显示在使用自定义符号或任何其他方法在屏幕上显示。我只希望通过MT5中的自定义符号可以访问。如果可以,那么就我所知,回溯测试和其他事情已经完成。是@JafferWilson,但这意味着不同(更难)方法。一般来说,这是在机器翻译平台上要做的一件大事,你最好去专业平台——比如JForex——因为机器翻译(IMO)是初学者的游乐场(在多年的使用经验之后).尽管我很想帮助你并获得赏金-这不值得付出努力。我在这个领域工作了多年-拥有自己的与JForex API集成的algo交易平台。是的,我认识我的朋友。我参考了这些链接。我发现文档很薄弱,不可理解。因此,我在这里提出了问题。