Mql5自定义品种 中国金融产品: A股票、期货、债券、数字货币的应用(5) ----个股分钟线处理过程 新评论 Mars Yuan 2020.01.25 15:22 7、读取A股个股分钟数据及数据结构介绍 //------------------------读取个股数据----download stock data------------------------------------------------------ void ReadStock(const string &token, const string &stockName,const datetime &tBegin,const datetime &tEnd) { char message_data[], result[]; string RequestMethod ="POST"; string END_POINT_URL ="http://api.waditu.com"; string headers = "content-type:application/json"+"\r\n"; headers += ",charset=UTF-8" + "\r\n"; int timeout = 10000; string result_headers = NULL; string message_text ; string stringresult = ""; string Ts,Te; Ts=TimeToString(tBegin,3); Te=TimeToString(tEnd,3); StringReplace(Ts,".",""); StringReplace(Te,".",""); StringConcatenate(message_text, "{", "\"api_name\"", ":", "\"stk_mins\"", ",", "\"token\"", ":", "\"", token, "\"", ",", "\"params\"", ":", "{", "\"ts_code\"", ":", "\"", stockName, "\"", ",", "\"asset\"", //-----------资产类型---------- ":", "\"E\"", ",", "\"adj\"", //--------复权--------- ":", "\"qfq\"", ",", "\"freq\"", //-----------周期------------ ":", "\"", Freq, //数据频度 :支持分钟(min)/日(D)/周(W)/月(M)K线,其中1min表示1分钟(类推1/5/15/30/60分钟) ,默认D。 "\"", ",", "\"start_date\"", ":", "\"", Ts, "\"", ",", "\"end_date\"", ":", "\"", Te, "\"", "}", ",", "\"fields\"", ":", "\"\"", "}" ); StringToCharArray(message_text,message_data,0, StringLen(message_text)); string _jt=CharArrayToString(message_data); //MessageBox(_jt);//--------------------------------------------------------------------------------- //------------------------------------------Http Post 请求服务器下载数据---------------------------------------- ResetLastError(); int res =WebRequest(RequestMethod, END_POINT_URL, headers, timeout, message_data, result, result_headers); if (res == -1) { Print("Error in WebRequest. Error code =",GetLastError()); //--- Perhaps the URL is not listed, display a message about the necessity to add the address MessageBox("Add the address '"+END_POINT_URL+"' to the list of allowed URLs on tab 'Expert Advisors'","Error",MB_ICONINFORMATION); } else { if (res == 200) { MqlRates Rates[]; Tushare_CharArrayToStruct(result,Rates);//---将HTTP POST返回char数组拆分到MQL自定义品种结构中-- Adj_Process(Token,stockName,Adj,Rates);//------除权、复权过程----- CustomSymbolCreate(stockName, "\\Astock");//----自定义Astock品类目录---- int reg=CustomRatesReplace(stockName,tBegin,tEnd,Rates,WHOLE_ARRAY );//----将MqlRates数组数据建立并导入自定义品类目录下的产品中 MessageBox(stockName+" "+"Downloaded"+" "+Freq+" "+"OK!" ); } else PrintFormat("Error in download '%s', code %d", END_POINT_URL, res); } } //----------------------------------------------------------------------------------------------------------------- //----------------------------------将HTTP POST返回char数组拆分到MQL自定义品种结构中--------------------------------------------- void Tushare_CharArrayToStruct(const char &result[],MqlRates &Rates[]) { //---------------------将Tushare返回的char数组合并成字符串处理过程-------------------------------------- string str=CharArrayToString(result,194,-1,0); //Alert(str); int rc=StringReplace(str,"\"",""); rc+=StringReplace(str,"[",""); rc+=StringReplace(str,"]","\r\n"); //Alert(str2); //----------------------将处理好的字符串分装到周期字符串数组-------------------------------------------------- string sep="\r\n"; // 分隔符为字符 ushort u_sep; // 分隔符字符代码 string trade_Arr[]; // 获得字符串数组 //--- 获得分隔符代码 u_sep=StringGetCharacter(sep,0); //--- 字符串分为子字符串 int k=StringSplit(str,u_sep,trade_Arr); //---用分隔符切分周期字符串并装入数组 trade_Arr[0]=","+trade_Arr[0]; //----------------进一步处理周期字符串数组装入MqlRates结构数组中-------------------------------------------------------------------------------- //MessageBox(trade_Arr[2]); k=k-2; ArrayResize(Rates,k); for(int i=0;i<k;i++) { string su_Arr[]; sep=","; u_sep=StringGetCharacter(sep,0); int m=StringSplit(trade_Arr[i],u_sep,su_Arr); //MessageBox(trade_Arr[i]); //按照MQL5历史数据格式重新整合数组格式 //trade_Arr[i]=su_Arr[2]+" "+"09:30:00"+" "+su_Arr[3]+" "+su_Arr[4]+" "+su_Arr[5]+" "+su_Arr[6]+" "+"0"+" "+su_Arr[10]+" "+"0"+"\r\n"; //MessageBox(trade_Arr[i]); datetime stm=D'1980.07.19 12:30:27'; stm=StringToTime(su_Arr[2]+" "+"09:30:01"); //ArraySetAsSeries(Rates,false); //Rates[i].time=stm; Rates[i].time=StringToTime(su_Arr[2]); Rates[i].open=StringToDouble(su_Arr[3]); Rates[i].high=StringToDouble(su_Arr[5]); Rates[i].low=StringToDouble(su_Arr[6]); Rates[i].close=StringToDouble(su_Arr[4]); Rates[i].tick_volume=StringToDouble(su_Arr[7]); Rates[i].real_volume=StringToDouble(su_Arr[8]); //MessageBox(TimeToString(Rates[i].time)); } //-------------------------------------------------------------------------------------------------------------------------------------------------------- } //----------------------------------------------------------------------------------------------------------------------------------------------------------- //------------------------------------读取复权因子和复权过程------------------------------------------------------------------------------------------------- void Adj_Process(const string &token, const string &stockName,const string &adj,MqlRates &Rates[]) { char message_data[], result[]; string RequestMethod ="POST"; string END_POINT_URL ="http://api.waditu.com"; string headers = "content-type:application/json"+"\r\n"; headers += ",charset=UTF-8" + "\r\n"; int timeout = 10000; string result_headers = NULL; string message_text ; //--------------------将字符整合成Post接受的Json标准的char 字符串--------- StringConcatenate(message_text, "{", "\"api_name\"", ":", "\"adj_factor\"", ",", "\"token\"", ":", "\"", token, "\"", ",", "\"params\"", ":", "{", "\"ts_code\"", ":", "\"", StockName, "\"", ",", "\"trade_date\"", ":", "\"\"", "}" ",", "\"fields\"", ":", "\"\"", "}" ); StringToCharArray(message_text,message_data,0, StringLen(message_text)); string _jt=CharArrayToString(message_data); //Alert(_jt); //MessageBox(_jt);//--------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------- //------------------------------------------Http Post 请求服务器下载数据---------------------------------------- ResetLastError(); int res =WebRequest(RequestMethod, END_POINT_URL, headers, timeout, message_data, result, result_headers); if (res == -1) { Print("Error in WebRequest. Error code =",GetLastError()); //--- Perhaps the URL is not listed, display a message about the necessity to add the address MessageBox("Add the address '"+END_POINT_URL+"' to the list of allowed URLs on tab 'Expert Advisors'","Error",MB_ICONINFORMATION); } else { if (res == 200) { struct Mqladj { datetime time; double adj_data; }; Mqladj Adj_arr[]; string str=CharArrayToString(result,159,-1,0); //Alert(str); int rc=StringReplace(str,"\"",""); rc+=StringReplace(str,"[",""); rc+=StringReplace(str,"]","\r\n"); //Alert(str); //----------------------将处理好的字符串分装到周期字符串数组-------------------------------------------------- string sep="\r\n"; // 分隔符为字符 ushort u_sep; // 分隔符字符代码 string trade_Arr[]; // 获得字符串数组 //--- 获得分隔符代码 u_sep=StringGetCharacter(sep,0); //--- 字符串分为子字符串 int k=StringSplit(str,u_sep,trade_Arr); //---用分隔符切分周期字符串并装入数组 trade_Arr[0]=","+trade_Arr[0]; //--------------------------------------------------------------------------------- //----------------进一步处理周期字符串数组装入Mqladj Adj_arr结构数组中------------- k=k-2; ArrayResize(Adj_arr,k); for(int i=0;i<k;i++) { string su_Arr[]; sep=","; u_sep=StringGetCharacter(sep,0); int m=StringSplit(trade_Arr[i],u_sep,su_Arr); //MessageBox(su_Arr[1]+","+su_Arr[2]+","+su_Arr[3]); Adj_arr[i].time=StringToTime(su_Arr[2]); Adj_arr[i].adj_data=StringToDouble(su_Arr[3]); } //---------------不同复权方式处理过程-----复权类型(只针对股票):None未复权 qfq前复权 hfq后复权 , 默认None-------------- //--------------向前复权--------qfq前复权------------------------ if(Adj=="qfq") { for(int i=1;i<ArraySize(Rates);i++) { double ad_0,ad_1; MqlDateTime R_dt,A_dt; TimeToStruct(Rates[i].time,R_dt); for(int n=1;n<ArraySize(Adj_arr);n++) { TimeToStruct(Adj_arr[n].time,A_dt); if( A_dt.year==R_dt.year && A_dt.mon==R_dt.mon && A_dt.day==R_dt.day) { ad_1= Adj_arr[n].adj_data; ad_0= Adj_arr[0].adj_data; //MessageBox(Adj_arr[n-1].time+","+Adj_arr[n-1].adj_data+","+Adj_arr[n].time+","+Adj_arr[n].adj_data); } } Rates[i].open =Rates[i].open *ad_1/ad_0; Rates[i].close =Rates[i].close *ad_1/ad_0; Rates[i].high =Rates[i].high *ad_1/ad_0; Rates[i].low =Rates[i].low *ad_1/ad_0; } } //----------向后复权----hfq后复权-------------------------------- if(Adj=="hfq") { for(int i=0;i<ArraySize(Rates);i++) { double ad_0,ad_1; MqlDateTime R_dt,A_dt; TimeToStruct(Rates[i].time,R_dt); for(int n=0;n<ArraySize(Adj_arr);n++) { TimeToStruct(Adj_arr[n].time,A_dt); if( A_dt.year==R_dt.year && A_dt.mon==R_dt.mon && A_dt.day==R_dt.day) { ad_1= Adj_arr[n].adj_data; //ad_0= Adj_arr[0].adj_data; //MessageBox(Adj_arr[n-1].time+","+Adj_arr[n-1].adj_data+","+Adj_arr[n].time+","+Adj_arr[n].adj_data); } } Rates[i].open =Rates[i].open *ad_1; Rates[i].close =Rates[i].close *ad_1; Rates[i].high =Rates[i].high *ad_1; Rates[i].low =Rates[i].low *ad_1; } } } else PrintFormat("Error in download '%s', code %d", END_POINT_URL, res); } } //--------------------------------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------------------------------- 图例:分钟线 … 附加的文件: Astock_Stock_Min.mq5 51 kb 哈哈哈哈 2021.09.28 18:11 #1 好人 大神 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
7、读取A股个股分钟数据及数据结构介绍
图例:分钟线
…