Mql5自定义品种 中国金融产品: A股票、期货、债券、数字货币的应用(4) ~A股指数

 

6、读取A股指数数据及数据结构介绍

//+------------------------------------------------------------------+
//|                                                 Astock_index.mq5 |
//|                                    Copyright 2019, MarsYuan 苑兵 |
//|                                              Mars.yuan@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019,  MarsYuan"
#property link      "https://www.mql5.com/zh/users/marsyuan"
#property version   "1.00"
//+------------------------------------------------------------------+


input string Token="e5282e6eee67e52c4b0b420c96d5ac6dcb7cf291b06c080547649086";

input  string IndexName="399300.SZ";              //注意SZ、SH要大写
input  datetime TBegin = D'20100101 00:00:00';    // 数据开始时间
//input  datetime TEnd   = D'20191219 00:00:00';    // 数据结束时间
       datetime TEnd=TimeLocal();                 //获取当前时间
                                
//+------------------------------------------------------------------+
void  OnStart()
{
       string list[];
      
       ReadList(Token,list);
       
       int n=ArraySize(list);
       
       MessageBox("AstockIndex Total quantity:"+n);

       ReadStock(Token,IndexName,TBegin,TEnd);
       for(int i=0;i<n;i++)
       {
       
       //ReadStock(Token,list[i],TBegin,TEnd); 

       }
          
}    

//-----------------------------------------------------------------------------------------------------------------
//-------------------Http协议Post方式读取股票名称列表并存入数组list------Http post download stock list-----------------------

void ReadList(const string &token,string &list[])
{
         //---------Http post Josn string to char Arr----------------------------------------------------------------
            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 = "";
            
           //--------------------将字符整合成Post接受的Json标准的char 字符串--------- 
           StringConcatenate(message_text,
                              "{",
                              "\"api_name\"",
                              ":",
                              "\"index_basic\"", 
                              ",",
                              
                              
                              "\"token\"",
                              ":",
                              "\"",
                              token,
                              "\"",
                              ",",

                              "\"params\"",
                              ":",
                              "{",
                              
                              "\"market\"",
                              ":",
                              "\"SZSE\"",
                              "}",
                             
                              "}"
                            );
                            
           
         
           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)
               {
               //-------------------------------------------------------------------------------------
                /*
                //--- Succesfully downloaded
                
                   PrintFormat("Succesfully downloaded, size %d.", ArraySize(result));
         
                   //--- Save result[] to file
                   int filehandle = FileOpen("debug_output.csv", FILE_WRITE | FILE_BIN);
                   if (filehandle != INVALID_HANDLE)
                   {
                       FileWriteArray(filehandle, result, 0, ArraySize(result));
                       FileClose(filehandle);
                   }
                   else
                   {
                       Print("Error in FileOpen. Error code =", GetLastError());
                   }
               */  
               
               //------------------------拆分result[] char数组串将导入list数组----------
               
               //---------------------将Tushare返回的char数组合并成字符串处理过程--------------------------------------
               
               
               
                     string str=CharArrayToString(result,213,-1,0);  
   
                         
                     //int rc=StringReplace(str,"\"","");
                     int 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,list);     //---用分隔符切分周期字符串并装入数组
                     list[0]=","+list[0];
               
                     //----------------进一步处理周期字符串数组提取股票代码装入list数组中------------------------------------- 
                     //MessageBox(trade_Arr[2]);
                     
                     k=k-2;
                   
                     
                     for(int i=0;i<k;i++)
                     {
                       string list_Arr[];
                       sep=",";
                       u_sep=StringGetCharacter(sep,0);
                       int m=StringSplit(list[i],u_sep,list_Arr); 
                       //MessageBox(list_Arr[1]);
                       //Print(list_Arr[1]);
                       //提取股票代码装入list数组中
                       list[i]=list_Arr[1];
                       rc+=StringReplace(list[i],"\"","");
                       StringTrimLeft(list[i]);
                       
                       //MessageBox(list[i]);
                   
                     }            
                     //-------------------------------------------------------------------------------------------------------
               
               }
               else
                   PrintFormat("Error in download '%s', code %d", END_POINT_URL, res);
           }
           

}

//-----------------------------------------------------------------------------------------------------------------
//------------------------读取个股数据----download stock data-------------------------------------
void ReadStock(const string  &token, const string &indexName,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,".","");           
           
           //--------------------将字符整合成Post接受的Json标准的char 字符串---------
           StringConcatenate(message_text,
                              "{",
                              "\"api_name\"",
                              ":",
                              "\"index_daily\"", 
                              ",",
                              
                              
                              "\"token\"",
                              ":",
                              "\"",
                              token,
                              "\"",
                              ",",
         
                              
                              "\"params\"",
                              ":",
                              "{",
                              
                              "\"ts_code\"",
                              ":",
                              "\"",
                              indexName,
                              "\"",
                              ",",
                              
                              
                              "\"start_date\"",
                              ":",
                              "\"",
                              Ts,
                              "\"",
                              ",",
                              
                              "\"end_date\"",
                              ":",
                              "\"",
                              Te,
                              "\"",
                              
                              "}",
         
                              "}"
                            );

         
           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)
               {
                   
                   //--- Succesfully downloaded
                   //PrintFormat("Succesfully downloaded, size %d.", ArraySize(result));
                   //MessageBox(ArraySize(result),"ok",MB_ICONINFORMATION);
                   
                   
                  
                   
               //--- Save result[] to file
                   //int filehandle = FileOpen("debug_output6.csv", FILE_WRITE | FILE_BIN);
                   //if (filehandle != INVALID_HANDLE)
                   //{
                   //FileWriteArray(filehandle, result, 0, ArraySize(result));
                   //FileClose(filehandle);
                      
                      MqlRates Rates[];
                      
                      Tushare_CharArrayToStruct(result,Rates);
                      
                      CustomSymbolCreate(indexName, "\\AstockIndex");
                      
                      int reg=CustomRatesReplace(indexName,tBegin,tEnd,Rates,WHOLE_ARRAY );
                         
                      MessageBox(indexName+" "+"Downloaded"+" "+"OK!" );
                     
                      
                   //}
                   //else
                   //{
                       Print("Error in FileOpen. Error code =", GetLastError());
                   //}
                   
               }
               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,0,-1,0);  
      
      string str2=StringSubstr(str,228);
         
      int rc=StringReplace(str2,"\"","");
      rc+=StringReplace(str2,"[","");
      rc+=StringReplace(str2,"]","\r\n");
      //Alert(str2); 
      
      //----------------------将处理好的字符串分装到周期字符串数组--------------------------------------------------
      string sep="\r\n";                            // 分隔符为字符 
      ushort u_sep;                                 // 分隔符字符代码 
      string trade_Arr[];                           // 获得字符串数组 
      //--- 获得分隔符代码 
      u_sep=StringGetCharacter(sep,0); 
      //--- 字符串分为子字符串 
      int k=StringSplit(str2,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("09:30:00");
        Rates[i].open=StringToDouble(su_Arr[4]);
        Rates[i].high=StringToDouble(su_Arr[5]);
        Rates[i].low=StringToDouble(su_Arr[6]);
        Rates[i].close=StringToDouble(su_Arr[3]);
        Rates[i].tick_volume=StringToDouble(su_Arr[10]);
       
        Rates[i].real_volume=StringToDouble(su_Arr[11]);
        
   }
   //MessageBox(TimeToString( Rates[0].open));
  //--------------------------------------------------------------------------------------------------------------------------------------------------------
  
}

//---------------------------------------------------------------------------------------------------------------        
          

图例:沪深300指数

沪深300 指数 399300.SZ MQL5自定义品种


附加的文件:
 
+1插眼
 
MARK一下
 
+1