您現(xiàn)在的位置:程序化交易>> 外匯現(xiàn)貨>> MT4>> MT4知識(shí)>>正文內(nèi)容

MT4 DLL開(kāi)發(fā)--通過(guò)DLL傳遞數(shù)據(jù)到外部程序 [MT4]

  • 在Visual C++開(kāi)發(fā)工具中創(chuàng)建一個(gè)工程,選擇MFC(DLL)類型,假設(shè)工程名為demo。創(chuàng)建好工程后,最核心的兩個(gè)文件為demo.cpp和demo.def。
    假設(shè)希望開(kāi)發(fā)的dll文件中包含三個(gè)功能函數(shù):
    復(fù)制代碼
    1.  double GetCloseValue( RateInfo* rates,int totalRecords, int shift )返回收盤價(jià)位
    2.  double GetHighValue( RateInfo* rates,int totalRecords, int shift )返回最高價(jià)位
    3.  void GetSMAArray( RateInfo* rates, int totalRecords, int period, double result[] ) 返回SMA移動(dòng)平均線值

    其中RateInfo被定義為結(jié)構(gòu)類型:
    復(fù)制代碼
    1. struct RateInfo
    2. {
    3. unsigned int time; //時(shí)間
    4. double open;//開(kāi)盤價(jià)格
    5. double low; //最低價(jià)格
    6. double high;//最高價(jià)格
    7. double close; //收盤價(jià)格
    8. double volume; //成交量
    9. };

    比較精妙的是MT4提供了ArrayCopyRates函數(shù)用于復(fù)制一段走勢(shì)圖上的數(shù)據(jù)到一個(gè)二維數(shù)組,并返回復(fù)制柱子的總數(shù)。其第二維為固定的6個(gè)項(xiàng)目,從0到5分別為“時(shí)間、開(kāi)盤價(jià)格、最低價(jià)格、最高價(jià)格、收盤價(jià)格、成交量”。
    復(fù)制代碼
    1. int ArrayCopyRates( void dest_array[], void symbol, void timeframe)

    因此這里的RateInfo結(jié)構(gòu)定義正好對(duì)應(yīng)上面二維數(shù)組的第二維,MT4程序也是默認(rèn)通過(guò)這種方式來(lái)提供二維數(shù)組到結(jié)構(gòu)指針(即RateInfo結(jié)構(gòu)數(shù)組)的映射的。
    在demo.def中定義DLL的輸出函數(shù)(如下),經(jīng)過(guò)編譯后將在指定目錄生成DLL文件。
    復(fù)制代碼
    1. LIBRARY"demo"
    2. EXPORTS
    3. GetCloseValue
    4. GetHighValue
    5. GetSMAArray

    將生成的DLL文件拷貝到MT4程序的”experts/libraries目錄下。在MT4程序中調(diào)用引用DLL的代碼為:
    復(fù)制代碼
    1. #import "demo.dll"
    2. double GetCloseValue( double rates[][6], int totalRecords, int shift );
    3. doubleGetHighValue( double rates[][6], int totalRecords, int shift );
    4. void GetSMAArray( double rates[][6], int totalRecords, int period, double& results[]);
    5. #import

    這里引用DLL函數(shù)的一個(gè)重要的區(qū)別在于RateInfo*被映射為二維數(shù)組double rates[][6],也就是說(shuō)MT4調(diào)用DLL的時(shí)候由操作系統(tǒng)根據(jù)內(nèi)存指針完成了數(shù)據(jù)的訪問(wèn),且結(jié)構(gòu)定義中的unsigned int是從double類型轉(zhuǎn)換后得到的。在MT4程序中調(diào)用DLL中函數(shù)的代碼為:
    復(fù)制代碼
    1. int start()
    2. {
    3. double rates[][6];
    4. int totalRecords = ArrayCopyRates( rates, Symbol(), 0 );
    5. for( int i = totalRecords; i >= 0; i-- )
    6. { `
    7. results[i] = EMPTY;
    8. }
    9. GetSMAArray( rates, totalRecords, period, results );
    10. return(0);
    11. }

    示例代碼(DLL對(duì)應(yīng)cpp文件中的函數(shù)定義和代碼):
    復(fù)制代碼
    1. //+------------------------------------------------------------------+
    2. //|MT4調(diào)用DLL示例程序 |
    3. //| Copyright @2009-2010, 笨蛋學(xué)經(jīng)濟(jì) |
    4. //| [url]http://macy01.blogcn.com[/url] |
    5. //+------------------------------------------------------------------+
    6. #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
    7. #define MT4_EXPFUNC __declspec(dllexport)
    8. //+-----------------------------------------------------------------------------------------------------------------------------+
    9. //| MT4數(shù)據(jù)結(jié)構(gòu)|
    10. //+-----------------------------------------------------------------------------------------------------------------------------+
    11. #pragma pack(push,1)
    12. struct RateInfo
    13. {
    14. unsigned int time;
    15. double open;
    16. double low;
    17. double high;
    18. double close;
    19. double volume;
    20. };
    21. struct MqlStr
    22. {
    23. int len;
    24. char* string;
    25. };
    26. #pragma pack(pop)
    27. //+-----------------------------------------------------------------------------------------------------------------------------+
    28. //|DLL函數(shù)定義 |
    29. //+-----------------------------------------------------------------------------------------------------------------------------+
    30. MT4_EXPFUNC double _stdcall GetCloseValue( RateInfo* rates,int totalRecords, int shift )
    31. {
    32. return( rates[totalRecords-shift-1].close );
    33. }
    34. MT4_EXPFUNC double _stdcall GetHighValue( RateInfo* rates,int totalRecords, int shift )
    35. {
    36. return( rates[totalRecords-shift-1].high );
    37. }
    38. MT4_EXPFUNC void _stdcall GetSMAArray( RateInfo* rates, int totalRecords, int period, double result[] )
    39. {
    40. for( int i = 0; i < totalRecords; i++)
    41. {
    42. double sum = 0.0;
    43. for( int k = 0; k < period ; k++ )
    44. {
    45. sum += rates[totalRecords-i-1-k].close;
    46. }
    47. result[totalRecords-i-1] = sum / period ;
    48. }
    49. }

【字體: 】【打印文章】【查看評(píng)論

相關(guān)文章

    沒(méi)有相關(guān)內(nèi)容
主站蜘蛛池模板: 免费国内精品久久久久影院| 色屁屁www欧美激情在线观看| 色噜噜狠狠成人中文综合| 欧美人与动人物姣配xxxx| 国产成人亚洲综合一区| 丰满老熟妇好大bbbbb| 空白tk2一一视频丨vk| 国产自产21区| 久热这里只有精品视频6| 美女张开腿黄网站免费| 在线观看国产一区亚洲bd| 亚洲一区二区三区免费在线观看 | 80s国产成年女人毛片| 日韩美女va毛片在线播放| 向日葵app下载视频免费| 91麻豆果冻天美精东蜜桃传媒| 曰皮全部过程视频免费国产30分钟| 啦啦啦手机完整免费高清观看 | 四虎国产精品永久在线网址| 999精品视频在线观看热6| 日韩电影免费在线观看网站| 出差被绝伦上司侵犯中文字幕| 2021国内精品久久久久影院| 日本一卡二卡≡卡四卡精品| 人人玩人人添人人| 日本最新免费网站| 成人爱做日本视频免费| 亚洲欧美日韩色| 青青草原国产视频| 女人战争之肮脏的交易| 亚洲人成高清在线播放| 色综合久久久久久久久久| 在线观看免费视频一区| 中文字幕在线精品| 欧美激情高清整在线| 国产片AV片永久免费观看| 中文字字幕在线| 欧美日韩一区二区三区四区 | 2019av在线视频| 我的娇妻acome| 亚洲欧美一区二区三区|