簡體   English   中英

使用MQL5將來自Python API的OHLC值集成到MT5中

[英]Integrating the OHLC value from Python API to MT5 using MQL5

我從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為: 命令輸出

現在我在輸出中獲取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")

好的,你需要
1.從經紀人那里收到飼料(我希望你成功)
2.將其寫入文件
**(兩個 - 蟒蛇)**
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)打開一個文件;

為了解析json,你可以使用jason.mqh https://www.mql5.com/en/code/13663庫(還有其他幾個)但據我記得它有一個bug:它無法解析數組對象正確。 為了克服這個問題,我建議將每個刻度線寫在一個單獨的行上。 最后,您將在隨機時間從python應用程序接收數據,並將其寫入Common或direct文件夾。 MT5機器人將讀取並刪除。 為了避免混淆,最好保證文件具有唯一的名稱。 隨機(random.randint(1,1000))或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.6毫秒,你的計時器應該睡了這么多時間。

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()請求是出於某種原因導致錯誤。

這可以在后面的測試儀中工作嗎? 當然不是。 MQL測試器不支持Fist, OnTimer() 接下來,您需要一些歷史記錄才能使其運行。 如果您沒有任何歷史記錄 - 沒有人可以幫助您,經紀人可以將其提供給您; 最好的想法可能是立即開始收集和存儲它,當項目准備就緒(可能還有幾個月)時,您將准備好並能夠使用可用的數據集測試和優化策略。 您可以將收集的集合應用到測試人員(MQL5實際上是與MQL4相比的算法交易開發的下一步),可以手動或使用類似tickDataSuite及其Csv2Fxt.ex4文件來生成測試人員可以讀取和處理的HST二進制文件; 無論如何這是另一個問題,沒有人可以告訴你,你的經紀人是否將他們的數據存儲在某個地方以便提供給你。

在二讀你寫的(和編輯過的)之后,我可以看到你想要:

  • 與iqoption同步的符號[通過您的代理/遠程]
  • 符號可用於回溯測試
  • 該符號可用於屏幕上的實時/策略/指標運行

這意味着MT平台不允許以自動方式進行戰略/指標之外的操作 - 您可以通過提供數據包,將其解析為CSV並導入到自定義符號創建者來手動實現。 這里有詳細記錄

不幸的是,你選擇了一個平台,其設計代表了自成一體的策略和指標,對於初學者來說,比認真對待它的專業人士更多。

請參閱我提供的鏈接並親自查看。 官方文檔聲明您可以通過mql ref創建自定義符號,但即使他們聲明,在前言中,它允許第三方提供商 - 它沒有在其他任何地方引用,也沒有顯示任何集成可能性。


自定義指標

自定義符號屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM