tag:blogger.com,1999:blog-60277205617017947292024-03-05T15:16:52.799+09:00『Expert advisor』は、おもしろい!bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.comBlogger102125tag:blogger.com,1999:blog-6027720561701794729.post-14008751915864312492017-03-14T01:30:00.000+09:002017-03-15T15:42:08.334+09:00(Open-Close)のヒストグラムを再現してみました。今回は、Jupyter Notebookの勉強も兼ねなが進めていきます。^^;方法として、まずTickVolumeをヒストリカルデータから見積もります。次に、作成したTickVolume数だけランダムウォークさせて実際の値幅との違いを見ます。<br />
<br />
<h2>
まずは、TIckVolumeの作成です。</h2>
<script src="https://gist.github.com/bighopefx/eff0510c01580d7e48e71393ff4c74eb.js"></script>
<br />
<h2>
次に密度分布の作成です。</h2>
<script src="https://gist.github.com/bighopefx/fb63435daa953649a1d096f326a3a8e9.js"></script>
<br />
<h2>
いろいろなペアと時間で試してみました。</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNvVyE8Aq7LmyVWVHjWeDl9hfG65Mab98efhiZfCMuBFc020YLxdswI5I_Mungwrc0XPH7GRSWIWoW2Td5JB1aex0brDExEZSEd6kBatGlUmVu6pmWqcEhkEN1jyUuLnbvIV8JD1ahOeE/s1600/USDJPY5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNvVyE8Aq7LmyVWVHjWeDl9hfG65Mab98efhiZfCMuBFc020YLxdswI5I_Mungwrc0XPH7GRSWIWoW2Td5JB1aex0brDExEZSEd6kBatGlUmVu6pmWqcEhkEN1jyUuLnbvIV8JD1ahOeE/s640/USDJPY5.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTuCh7QgcXBQvklJ7fg266sp9WpGjZEkV1CtfZnCtEec7X9FyHFibfIfkbrMcOO5l_DPh53JzniynPYGqEjirROU-VneNIwMSP7PZ9olj832Tf-0ALp9H7vygIWPW7oJx2hOKQtVfOd5w/s1600/USDJPY60.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTuCh7QgcXBQvklJ7fg266sp9WpGjZEkV1CtfZnCtEec7X9FyHFibfIfkbrMcOO5l_DPh53JzniynPYGqEjirROU-VneNIwMSP7PZ9olj832Tf-0ALp9H7vygIWPW7oJx2hOKQtVfOd5w/s640/USDJPY60.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioyv71lyJ1O_q2pUh64t11dgyYngv-zTBtJ0yMC6OakGJH_4-mOK8Ue_MkYQYSFU_YwYyQL27MJOjVALV4DFYYW7WsxO8UTTny3GRQNcsm-iJ_PJVcZTx-MJpQsCksAl57cHjHkDq69K4/s1600/USDJPY1440.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioyv71lyJ1O_q2pUh64t11dgyYngv-zTBtJ0yMC6OakGJH_4-mOK8Ue_MkYQYSFU_YwYyQL27MJOjVALV4DFYYW7WsxO8UTTny3GRQNcsm-iJ_PJVcZTx-MJpQsCksAl57cHjHkDq69K4/s640/USDJPY1440.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2Ox4FxYLG_3N63Vx9t_UR96wg4pMGneUtqoCZrFgtPXc9-0GoJ__j0076vZUx_GCs6VRzUKO4Y5xnSBBFtYQHPIf_qW7m6GgV_jD8uDiCmOlvHYKgra_iBF2Oyesm4KV-8b-h7X36WM0/s1600/EURUSD5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2Ox4FxYLG_3N63Vx9t_UR96wg4pMGneUtqoCZrFgtPXc9-0GoJ__j0076vZUx_GCs6VRzUKO4Y5xnSBBFtYQHPIf_qW7m6GgV_jD8uDiCmOlvHYKgra_iBF2Oyesm4KV-8b-h7X36WM0/s640/EURUSD5.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6wHpErEYS_lhHBGpz1m3DrksPyBpILMH5EAoh9H89KdEyvX2vI3GadvPaaicd_uU-PA1hVPktzR3XdfA0PKHoyiSjOm4sf7oy0AE_x4sAJx3YDas5vqLSLgqeH59TX75AGcfZFUqAJX8/s1600/EURUSD60.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6wHpErEYS_lhHBGpz1m3DrksPyBpILMH5EAoh9H89KdEyvX2vI3GadvPaaicd_uU-PA1hVPktzR3XdfA0PKHoyiSjOm4sf7oy0AE_x4sAJx3YDas5vqLSLgqeH59TX75AGcfZFUqAJX8/s640/EURUSD60.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0mbrB-ECbwYsv4uqmMcFiUJxeMDtchbkTrqYuIYdljwaU0lGXBQk6543ILFzK0bOTCz1x0EHn0daGI31AXPwl6cxsgxVDXLOPIf_Wzd0DbKBKDZj8edifS4MSqUyVdPQWMdRWq3wRSnE/s1600/EURUSD1440.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0mbrB-ECbwYsv4uqmMcFiUJxeMDtchbkTrqYuIYdljwaU0lGXBQk6543ILFzK0bOTCz1x0EHn0daGI31AXPwl6cxsgxVDXLOPIf_Wzd0DbKBKDZj8edifS4MSqUyVdPQWMdRWq3wRSnE/s640/EURUSD1440.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijWFdffOa31E70dgj_al4ECxz6Vpc5HPPWqAS6eJ0rfH28R4BEd5q6A6yS_sF4pr8R1VVywNI5RC1ws0JYy3Co4N_V6hygtGkxLQZzHizmU-HoWC-VtaXT_RyInuPuAn2WlLbTDUf50Vs/s1600/EURJPY5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijWFdffOa31E70dgj_al4ECxz6Vpc5HPPWqAS6eJ0rfH28R4BEd5q6A6yS_sF4pr8R1VVywNI5RC1ws0JYy3Co4N_V6hygtGkxLQZzHizmU-HoWC-VtaXT_RyInuPuAn2WlLbTDUf50Vs/s640/EURJPY5.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK7YY72VDY-fmeZ25Rb_IXXrM1CGiQvoIlZmneLn8KfNoeq0ywU9sSNopzVECKiJRscPuBXP6d4ym9EQBQc-v_fGAqvW1BZcFjSx05HJ-WbKBwdEorQFV0B-jrVy5EuZ2RCJ5N4Gq_6ls/s1600/EURJPY60.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK7YY72VDY-fmeZ25Rb_IXXrM1CGiQvoIlZmneLn8KfNoeq0ywU9sSNopzVECKiJRscPuBXP6d4ym9EQBQc-v_fGAqvW1BZcFjSx05HJ-WbKBwdEorQFV0B-jrVy5EuZ2RCJ5N4Gq_6ls/s640/EURJPY60.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikx4v6Ts51II4WbP4TVV_iIeO2E1BqysOILZSOw6IsPHz1ukUW5sKR843dus2qHutEiSLDy2lQachw6VrHe7AIOXxOZKMptbvj17-IKd6k7hN4-ee3ZWccEsZX81BaVuc4bJ4J9AvyfPA/s1600/EURJPY1440.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikx4v6Ts51II4WbP4TVV_iIeO2E1BqysOILZSOw6IsPHz1ukUW5sKR843dus2qHutEiSLDy2lQachw6VrHe7AIOXxOZKMptbvj17-IKd6k7hN4-ee3ZWccEsZX81BaVuc4bJ4J9AvyfPA/s640/EURJPY1440.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeX4c585LB-B8tTX9V6h_FgG9Ch3eDFOGKO8-o239UgNf67Ikfrh5lXszyb93BNIxlOFSVA-FlWpRI9fSchyphenhyphen-LShjwrYu-D7uHfSZO8-stV7POgjc_DtQWbGSQC152sRuiWzD7etBp1C4/s1600/GBPAUD60.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeX4c585LB-B8tTX9V6h_FgG9Ch3eDFOGKO8-o239UgNf67Ikfrh5lXszyb93BNIxlOFSVA-FlWpRI9fSchyphenhyphen-LShjwrYu-D7uHfSZO8-stV7POgjc_DtQWbGSQC152sRuiWzD7etBp1C4/s640/GBPAUD60.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisHp1YqqZjBbPYpJyL5i3bAKLsbTU6uGhxlVbVshB_l0Kq1HWWmQd8qt8DXKrCBGKDW24h4Nx1xcz-2W6KkTUsPH7NOesLLbFcx5PTD3rJHtrm474RHdi_tNl2gJqTw5reo2kxPwpqyaU/s1600/GBPJPY60.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisHp1YqqZjBbPYpJyL5i3bAKLsbTU6uGhxlVbVshB_l0Kq1HWWmQd8qt8DXKrCBGKDW24h4Nx1xcz-2W6KkTUsPH7NOesLLbFcx5PTD3rJHtrm474RHdi_tNl2gJqTw5reo2kxPwpqyaU/s640/GBPJPY60.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhodBF9sn9cMbFKz2Labvsmjaw8d703OVE46_27t59pi4ktNC2SOcsHSDaLi7bsgqaMolvI_ql_xyHNJIDGbT38dx3RbM9cJPtoWms4WEROPH9fnxjFB2Mqf9WHsznOM1z5QUyC7goc63w/s1600/ZARJPY60.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhodBF9sn9cMbFKz2Labvsmjaw8d703OVE46_27t59pi4ktNC2SOcsHSDaLi7bsgqaMolvI_ql_xyHNJIDGbT38dx3RbM9cJPtoWms4WEROPH9fnxjFB2Mqf9WHsznOM1z5QUyC7goc63w/s640/ZARJPY60.png" width="640" /></a></div>
<h2>
まとめ</h2>
試行回数が異なるランダムウォークの密度分布がほぼ(Open-Close)の密度分布と重なるということは、(Open-Close)のヒストグラムは、分散が異なる正規分布の集合体で表せれる。ということですね。。<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com1tag:blogger.com,1999:blog-6027720561701794729.post-47470260091748731592015-08-08T14:03:00.000+09:002015-08-08T14:42:39.881+09:00外部エネルギーが加えられることによりエントロピーの増大が妨げられるとさ。。<h2>
はじめに</h2>
ご無沙汰しております^^;<br />
さてさて今回は、チャート内の特異値(Bar)を見える化する指標を作成することにしました。<br />
<br />
<br />
<h2>
手順</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijXIEtdRbIRuWaEhrmkd3QoaJaBUIWgcqNgzahS2VMCI3Vkgs7VDABn2gOe_pvPJyNsTcb3AoPV-FpOhWkP5nJ486HC6dsbhb33IfDCKV5hOFjOPr5iMgqXT-E4qrc7yDrhIUeaBltQQs/s1600/hisuto.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijXIEtdRbIRuWaEhrmkd3QoaJaBUIWgcqNgzahS2VMCI3Vkgs7VDABn2gOe_pvPJyNsTcb3AoPV-FpOhWkP5nJ486HC6dsbhb33IfDCKV5hOFjOPr5iMgqXT-E4qrc7yDrhIUeaBltQQs/s200/hisuto.png" width="200" /></a></div>
<br />
まず初めに、各Barの値として(高値-安値)《以下 高安値》を採用しました。<br />
高安値を採用したことにより対数正規分布を連続確率分布として採用します。<br />
参考記事:<a href="http://expertadviser-bighope.blogspot.jp/2010/01/blog-post.html">ベキ分布?</a> <a href="http://expertadviser-bighope.blogspot.jp/2012/03/blog-post.html">対数正規分布を調べてみた。</a> <a href="http://expertadviser-bighope.blogspot.jp/2012/04/blog-post.html">検証してみました。 </a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhea_JY1mBEm_6WbBUq-ee3PsoJgZiXFiKS_xuwssUAwDCsxlpUbsKMF48LOajNODWhhIJGKEe0Kd9oNCaH3IxFiFnePvnSFkMppNknzR2GaQvjwIrEDjK0dSNTDLpDn4kitIKKD_hc1w8/s1600/deki.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhea_JY1mBEm_6WbBUq-ee3PsoJgZiXFiKS_xuwssUAwDCsxlpUbsKMF48LOajNODWhhIJGKEe0Kd9oNCaH3IxFiFnePvnSFkMppNknzR2GaQvjwIrEDjK0dSNTDLpDn4kitIKKD_hc1w8/s200/deki.png" width="200" /></a></div>
<br />
あとは、分布のパラメータを推定して、各高安値を当てはめて発生確率を求めました。そして出来上がったのがコレです。。。。。なんだか全然見える化できていない。。orz<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWDWHaC1GmWpvlVpYREY__yUKjBrKSWBNZdkA0Hzb_YufZGromFWc1Rsd_8Isnx0HdA_0-78OM4pRAyRZwnTnz07lgcZDQJM8eikU11Hgymo3wO2zmjRLm7K0aewovJ-rVD4allzcHlRg/s1600/ttreya.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="118" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWDWHaC1GmWpvlVpYREY__yUKjBrKSWBNZdkA0Hzb_YufZGromFWc1Rsd_8Isnx0HdA_0-78OM4pRAyRZwnTnz07lgcZDQJM8eikU11Hgymo3wO2zmjRLm7K0aewovJ-rVD4allzcHlRg/s200/ttreya.png" width="200" /></a></div>
<br />
そこで、選択情報量の定義を利用して左記のように見やすくしました。自画自賛w<br />
※ちなみに情報量の定義などは、<a href="https://ja.wikipedia.org/wiki/%E6%83%85%E5%A0%B1%E9%87%8F">こちら</a>。<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<h2>
まとめ</h2>
今回実施した特異値に理由付けを行ってみた結果が以下の画像です。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn-chyK_ohVKiAzLpMQWdO0C161iqYy_2q6RMQ1Q0QJAWuue2VgEpiuCLu3we0JEXo8iGO9iIcXYD5ua4ElxhHc16kwqnZvRORf0in18R0TNJI2tsaTvFRu-MinSlE4V2X7Mn4dcSTaro/s1600/ttreya2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="382" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn-chyK_ohVKiAzLpMQWdO0C161iqYy_2q6RMQ1Q0QJAWuue2VgEpiuCLu3we0JEXo8iGO9iIcXYD5ua4ElxhHc16kwqnZvRORf0in18R0TNJI2tsaTvFRu-MinSlE4V2X7Mn4dcSTaro/s640/ttreya2.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7dtbzfu7iZ4f21OO2NTu7VBm3e33QP3QJTXnQSsZIfGLd69ABLT8cOMkK42eCBdUzQQKKVLIdfQSDwHG0Dq_ZK_JOhew7GAZN26MZt4_bHHxL39vG5GUrZwTTKbtXoWEoP5TeajdHRKc/s1600/errrrr.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7dtbzfu7iZ4f21OO2NTu7VBm3e33QP3QJTXnQSsZIfGLd69ABLT8cOMkK42eCBdUzQQKKVLIdfQSDwHG0Dq_ZK_JOhew7GAZN26MZt4_bHHxL39vG5GUrZwTTKbtXoWEoP5TeajdHRKc/s320/errrrr.png" width="320" /></a></div>
大きく指標が跳ね上がった部分は、何らかの理由付けができそうです。いや~黒田日銀総裁の円安是正発言は、まいりました。^^;<br />
さてさて、今回の指標は、高安値が高いから指標が跳ね上がるだけでなく極端に低い場合でも跳ね上がります。右のチャート部分は、時間当たり2ティックしかなく特異値として指標が跳ね上がりました。発生確率が低い値(高安値)を見える化する事が目的なのでこんな感じとなります。データの抜けが原因かな?。。<br />
ここでお題の話を少し。。情報エントロピーという情報量の定義指標があって(<a href="http://e-words.jp/w/%E6%83%85%E5%A0%B1%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC.html">参考</a>)、情報を受け取ると情報エントロピーは、最小となる。つまり、事象の不確かさが、最小となる。つまり、(ここからは、妄想。。)不確実さが低減されるのであれば、秩序だった動きが現れるんじゃないの?だったら∑(゚Д゚;)!! いや~妄想ってホント素敵ですねw 夏があまり好きではないおっさんの戯言でありました。<br />
<br />
<br />
<h2>
コード</h2>
DLは、<a href="https://drive.google.com/file/d/0B42sh1xkCfgtZ2VLNl9MaEJ2TEk/view?usp=sharing">ココ</a><br />
<br />
<pre><span class="comment">//+------------------------------------------------------------------+
//| impact.mq4 |
//| Copyright 2015, bighope. |
//| http://expertadviser-bighope.blogspot.jp/ |
//+------------------------------------------------------------------+
</span><span class="keyword">#property </span><span class="macro">copyright </span><span class="string">"Copyright 2015,bighope."
</span><span class="keyword">#property </span><span class="macro">link </span><span class="string">"http://expertadviser-bighope.blogspot.jp/"
</span><span class="keyword">#property </span><span class="macro">version </span><span class="string">"1.00"
</span><span class="keyword">#property </span><span class="macro">strict
</span><span class="keyword">#property </span><span class="macro">indicator_separate_window
</span><span class="keyword">#property </span><span class="macro">indicator_minimum </span><span class="number">5
</span><span class="keyword">#property </span><span class="macro">indicator_maximum </span><span class="number">20
</span><span class="keyword">#property </span><span class="macro">indicator_buffers </span><span class="number">1
</span><span class="keyword">#property </span><span class="macro">indicator_color1 </span>Snow
<span class="keyword">#define </span>pi <span class="number">3.14159265358979
</span><span class="keyword">input int </span><span class="input">Startbar </span><span class="operator">= </span><span class="number">0</span><span class="operator">; </span><span class="comment">//データの取得開始Bar数
</span><span class="keyword">input int </span><span class="input">Range </span><span class="operator">= </span><span class="number">2000</span><span class="operator">; </span><span class="comment">//平均と偏差を導くためのデータ数
</span><span class="keyword">input double </span><span class="input">wide </span><span class="operator">= </span><span class="number">10.0</span><span class="operator">; </span><span class="comment">//確率密度×○倍(特に意味がありません)
</span><span class="keyword">double </span>Buf<span class="operator">[];
</span><span class="keyword">string </span>Indicator_Name <span class="operator">;
</span><span class="comment">//+------------------------------------------------------------------+
//|GetData
//|out[Ns] データの取得配列
//|Ns データの取得数
//|St 開始インデックス
//+------------------------------------------------------------------+
</span><span class="keyword">int </span>GetData<span class="operator">(</span><span class="keyword">int </span>St<span class="operator">,</span><span class="keyword">int </span>Ns<span class="operator">,</span><span class="keyword">const double </span><span class="operator">&</span>hi<span class="operator">[],</span><span class="keyword">const double </span><span class="operator">&</span>lw<span class="operator">[],</span><span class="keyword">double </span><span class="operator">&</span>out<span class="operator">[]){
</span> <span class="keyword">int </span>i<span class="operator">;
</span> <span class="keyword">double </span>pt <span class="operator">= </span><span class="function">MathPow</span><span class="operator">(</span><span class="number">10</span><span class="operator">,</span><span class="predefine">Digits</span><span class="operator">);
</span> <span class="keyword">for</span><span class="operator">(</span>i<span class="operator">=</span><span class="number">0</span><span class="operator">;</span>i<span class="operator"><</span>Ns<span class="operator">;</span>i<span class="operator">++) </span>out<span class="operator">[</span>i<span class="operator">]=(</span>hi<span class="operator">[</span>St<span class="operator">+</span>i<span class="operator">] - </span>lw<span class="operator">[</span>St<span class="operator">+</span>i<span class="operator">])*</span>pt<span class="operator">;
</span> <span class="keyword">return</span><span class="operator">(</span>i<span class="operator">);
}
</span><span class="comment">//+------------------------------------------------------------------+
//| Logsd_likelihood 対数正規分布 最尤法によるパラメータ推定
//|data[Ns] 対象データ
//|Ns データの取得数
//|mu 対数正規分布パラメータ
//|sigma2 対数正規分布パラメータ (sigma^2)
//+------------------------------------------------------------------+
</span><span class="keyword">void </span>Logsd_likelihood<span class="operator">(</span><span class="keyword">int </span>Ns<span class="operator">,</span><span class="keyword">double </span><span class="operator">&</span>data<span class="operator">[],</span><span class="keyword">double </span><span class="operator">&</span>mu<span class="operator">,</span><span class="keyword">double </span><span class="operator">&</span>sigma2<span class="operator">){
</span> <span class="keyword">int </span>i<span class="operator">;
</span> mu <span class="operator">=</span><span class="number">0.0</span><span class="operator">;
</span> sigma2 <span class="operator">= </span><span class="number">0.0</span><span class="operator">;
</span> <span class="keyword">for</span><span class="operator">(</span>i<span class="operator">=</span><span class="number">0</span><span class="operator">;</span>i<span class="operator"><</span>Ns<span class="operator">;</span>i<span class="operator">++)</span>mu <span class="operator">+= </span><span class="function">MathLog</span><span class="operator">(</span>data<span class="operator">[</span>i<span class="operator">]);
</span> mu <span class="operator">/= </span>Ns<span class="operator">;
</span> <span class="keyword">for</span><span class="operator">(</span>i<span class="operator">=</span><span class="number">0</span><span class="operator">;</span>i<span class="operator"><</span>Ns<span class="operator">;</span>i<span class="operator">++) </span>sigma2 <span class="operator">+= </span><span class="function">MathPow</span><span class="operator">((</span><span class="function">MathLog</span><span class="operator">(</span>data<span class="operator">[</span>i<span class="operator">])-</span>mu<span class="operator">),</span><span class="number">2</span><span class="operator">);
</span> sigma2 <span class="operator">/= </span>Ns<span class="operator">;
}
</span><span class="comment">//+------------------------------------------------------------------+
//|Logsd_dist 対数正規分布の確率密度
//|dt データ
//|w 対象データの幅
//|mu 対数正規分布パラメータ
//|sigma2 対数正規分布パラメータ (sigma^2)
//+------------------------------------------------------------------+
</span><span class="keyword">double </span>Logsd_dist<span class="operator">(</span><span class="keyword">double </span>dt<span class="operator">,</span><span class="keyword">double </span>w<span class="operator">,</span><span class="keyword">double </span>mu<span class="operator">,</span><span class="keyword">double </span>sigma2<span class="operator">){
</span> <span class="keyword">double </span>A<span class="operator">,</span>B<span class="operator">;
</span> A <span class="operator">= </span><span class="number">1</span><span class="operator">/</span><span class="function">MathSqrt</span><span class="operator">(</span><span class="number">2</span><span class="operator">*</span>pi<span class="operator">*</span>sigma2<span class="operator">);
</span> B <span class="operator">= </span><span class="function">MathPow</span><span class="operator">((</span><span class="function">MathLog</span><span class="operator">(</span>dt<span class="operator">)-</span>mu<span class="operator">),</span><span class="number">2</span><span class="operator">)/(</span><span class="number">2 </span><span class="operator">* </span>sigma2<span class="operator">);
</span> <span class="keyword">return</span><span class="operator">(</span>w<span class="operator">*</span>A<span class="operator">*</span><span class="function">MathExp</span><span class="operator">(-</span>B<span class="operator">)/</span>dt<span class="operator">);
}
</span><span class="comment">//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
</span><span class="keyword">int </span><span class="function">OnInit</span><span class="operator">(){
</span> <span class="function">IndicatorBuffers</span><span class="operator">(</span><span class="number">1</span><span class="operator">);
</span> <span class="function">SetIndexStyle</span><span class="operator">(</span><span class="number">0</span><span class="operator">,</span><span class="macro">DRAW_LINE</span><span class="operator">);
</span> <span class="function">SetIndexBuffer</span><span class="operator">(</span><span class="number">0</span><span class="operator">,</span>Buf<span class="operator">);
</span> <span class="keyword">return</span><span class="operator">(</span><span class="macro">INIT_SUCCEEDED</span><span class="operator">);
</span> <span class="operator">}
</span><span class="comment">//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
</span><span class="keyword">int </span><span class="function">OnCalculate</span><span class="operator">(</span><span class="keyword">const int </span>rates_total<span class="operator">,
</span> <span class="keyword">const int </span>prev_calculated<span class="operator">,
</span> <span class="keyword">const datetime </span><span class="operator">&</span>time<span class="operator">[],
</span> <span class="keyword">const double </span><span class="operator">&</span>open<span class="operator">[],
</span> <span class="keyword">const double </span><span class="operator">&</span>high<span class="operator">[],
</span> <span class="keyword">const double </span><span class="operator">&</span>low<span class="operator">[],
</span> <span class="keyword">const double </span><span class="operator">&</span>close<span class="operator">[],
</span> <span class="keyword">const long </span><span class="operator">&</span>tick_volume<span class="operator">[],
</span> <span class="keyword">const long </span><span class="operator">&</span>volume<span class="operator">[],
</span> <span class="keyword">const int </span><span class="operator">&</span>spread<span class="operator">[])
</span> <span class="operator">{
</span> <span class="keyword">int </span>i<span class="operator">,</span>limit<span class="operator">;
</span> <span class="keyword">double </span>d<span class="operator">;
</span> <span class="function">ArraySetAsSeries</span><span class="operator">(</span>high<span class="operator">,</span><span class="macro">true</span><span class="operator">);
</span> <span class="function">ArraySetAsSeries</span><span class="operator">(</span>low<span class="operator">,</span><span class="macro">true</span><span class="operator">);
</span> <span class="comment">//対数正規分布 最尤法によるパラメータ
</span> <span class="keyword">static double </span>Mu <span class="operator">= </span><span class="number">0.0</span><span class="operator">;
</span> <span class="keyword">static double </span>Sigma2 <span class="operator">= </span><span class="number">0.0</span><span class="operator">;
</span> <span class="comment">//初期設定
</span> <span class="keyword">if</span><span class="operator">(</span>prev_calculated <span class="operator">==</span><span class="number">0</span><span class="operator">){
</span> <span class="keyword">double </span>date<span class="operator">[];
</span> <span class="function">ArrayResize</span><span class="operator">(</span>date<span class="operator">,</span><span class="input">Range</span><span class="operator">);
</span> <span class="comment">//データの取得
</span> <span class="keyword">if</span><span class="operator">(</span>GetData<span class="operator">( </span><span class="input">Startbar</span><span class="operator">,</span><span class="input">Range</span><span class="operator">,</span>high<span class="operator">,</span>low<span class="operator">,</span>date<span class="operator">)<(</span><span class="input">Range</span><span class="operator">-</span><span class="number">2</span><span class="operator">)){
</span> <span class="function">Print</span><span class="operator">(</span><span class="string">"データが設定分取得できませんでした。"</span><span class="operator">);
</span> <span class="keyword">return</span><span class="operator">(</span><span class="number">0</span><span class="operator">);
</span> <span class="operator">}
</span>
<span class="comment">//パラメータ推定
</span> Logsd_likelihood<span class="operator">(</span><span class="input">Range</span><span class="operator">,</span>date<span class="operator">,</span>Mu<span class="operator">,</span>Sigma2<span class="operator">);
</span> <span class="keyword">if</span><span class="operator">(</span>Mu <span class="operator">></span><span class="number">0 </span><span class="operator">&& </span>Sigma2 <span class="operator">></span><span class="number">0</span><span class="operator">){
</span> <span class="function">Print</span><span class="operator">(</span><span class="string">"mu="</span><span class="operator">,</span>Mu<span class="operator">,</span><span class="string">" Sigma^2="</span><span class="operator">,</span>Sigma2<span class="operator">);
</span> <span class="operator">}</span><span class="keyword">else</span><span class="operator">{
</span> <span class="function">Print</span><span class="operator">(</span><span class="string">"パラメータの推定に失敗しました。"</span><span class="operator">);
</span> <span class="keyword">return</span><span class="operator">(</span><span class="number">0</span><span class="operator">);
</span> <span class="operator">}
</span> <span class="operator">}
</span>
limit <span class="operator">= </span>rates_total<span class="operator">-</span>prev_calculated<span class="operator">-</span><span class="number">1</span><span class="operator">;
</span> <span class="keyword">if</span><span class="operator">(</span>prev_calculated<span class="operator">></span><span class="number">0</span><span class="operator">)</span>limit<span class="operator">++;
</span> <span class="keyword">for</span><span class="operator">(</span>i<span class="operator">=</span><span class="number">0</span><span class="operator">;</span>i<span class="operator"><</span>limit<span class="operator">;</span>i<span class="operator">++){
</span> d <span class="operator">= (</span>high<span class="operator">[</span>i<span class="operator">+</span><span class="number">1</span><span class="operator">]-</span>low<span class="operator">[</span>i<span class="operator">+</span><span class="number">1</span><span class="operator">])* </span><span class="function">MathPow</span><span class="operator">(</span><span class="number">10</span><span class="operator">,</span><span class="predefine">Digits</span><span class="operator">);
</span> <span class="keyword">if</span><span class="operator">(</span>d<span class="operator">></span><span class="number">0</span><span class="operator">) </span>Buf<span class="operator">[</span>i<span class="operator">] = -</span><span class="function">MathLog</span><span class="operator">(</span>Logsd_dist<span class="operator">(</span>d<span class="operator">,</span><span class="input">wide</span><span class="operator">,</span>Mu<span class="operator">,</span>Sigma2<span class="operator">));
</span> <span class="operator">}
</span> <span class="keyword">return</span><span class="operator">(</span>rates_total<span class="operator">);
</span> <span class="operator">}
</span><span class="comment">//+------------------------------------------------------------------+
</span></pre>
<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com0tag:blogger.com,1999:blog-6027720561701794729.post-47417606077458920292014-09-05T00:57:00.001+09:002014-09-08T11:20:32.768+09:00なんとな~くWebRequest()が使ってみたくなって。。。イベントタイマーを作ってみました。新MT4で新たに追加されたWebRequest()関数を使うことで、外部のサーバーにリクエストを送ることが可能となりました。(DLLを使用したり、ほかの言語を使用すれば、もちろん可能ですが。。^^;)ということで、今回は、DLLや多言語を使用することなく、外部サーバーから指標データを取得し、表示させてみました。<br />
<br />
<h2>
準 備</h2>
まず、WebRequest()関数のリファレンスを確認すると、この関数を使用する場合は、【ツール(T)】-【オプション(o)】―【エキスパートアドバイザー】で《Allow WebRequest for listed URL:》にチェックを入れ、外部サーバーのアドレスを追加しておきます。<br />
今回は、<a href="http://www.dailyfx.co.jp/">DailyfxJapan</a>を使用させて頂くので以下のようにしています。<br />
<a href="http://lh3.ggpht.com/-BCMyQTo6Oyw/VAiL4TmNkDI/AAAAAAAABIU/2NBgYuwCNgA/s1600-h/opustion6.png"><img alt="opustion" border="0" src="http://lh3.ggpht.com/-rDVnSqvetjI/VAiL5Pt6yAI/AAAAAAAABIc/XHMZv1qytZ0/opustion_thumb4.png?imgmax=800" height="293" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="opustion" width="520" /></a> <br />
その他の注意事項として、WebRequest()関数は、非同期関数で、EAもしくはスクリプトのみ使用可能。インジケーターで使用すると【error 4060 – "Function is not allowed for call".】と怒られます。∑(゚∀゚ノ)ノキャー今回は、EA上で使用することにしました。<br />
<h2>
</h2>
<br />
<h2>
実行してみると・・・</h2>
<a href="http://lh3.ggpht.com/-x4SZfHxUDHk/VAiL51-XSgI/AAAAAAAABIk/tI1n9rB1tWc/s1600-h/karenda%25255B5%25255D.png"><img alt="karenda" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4rp0NbBbloMRuekzDTI9FnZuqnxQjBdkH81uD-JdcQgEJFddOa7-7PQhI2b17kQ15XqomNrC7fS9VOnkjOneVaRH50PAbfG_cpEN326MVS8r5oEIHnFeD2kl3Nf5X0_QTQQ6SCmTd1YY/?imgmax=800" height="418" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="karenda" width="548" /></a> <br />
今回作成したEAを<a href="https://drive.google.com/file/d/0B42sh1xkCfgtNjU1RzNyQXNoams/edit?usp=sharing">ココ</a>に置いておきます。使用する際はEAとして使用してください。※2014/9/8EAを一部変更しました。<br />
また、サーバーから取得したhtmlファイルは、MQL4/Filesに保存されます。<br />
<br />
<br />
<h2>
課題やら留意した点やら問題点</h2>
1.結局WebRequest()関数のテストをしようと思って作り始めたのですがリファレンスの例をそのまま使用しています。..orz<br />
2.保存したHTMLファイルは、Shift_JISで保存しているのでブラウザで開くと文字化けする。(本来は、UTF-8)<br />
3.StringSetChar(A,B,'文字')関数の文字部分は、”ストレートクォーテーションマーク”を使用するとバグが発生しましたので<br />
’アポストロフィー’を使用しました。リファレンスも ’アポストロフィー’を使用しています。<br />
4.終日イベントの時間を00:00としているので、00:00を過ぎると表示されなくなる。。orz<br />
5.LABELオブジェクトを使用したので、表示させる文字数が多すぎるとすべてが表示されない。。orz<br />
6.週末すべてのイベントが終了すると寂しい。土曜日に実行しても同じ。。。<br />
<br />
<br />
<h2>
まとめ</h2>
ん~なんだか中途半端な気がします。。^^;<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com4tag:blogger.com,1999:blog-6027720561701794729.post-71483775133742043702014-08-05T00:21:00.001+09:002015-08-20T08:08:23.225+09:00new MT4 de SQLite3古い仕様のMT4が使えなくなってしまったので、新しい仕様に対応したSLQLite3用のヘッダーファイルを作成しました。<br />
(※warapperDLL未使用)<br />
<br />
<h2>
はじめに</h2>
新しいMT4のエンコードを調べてみたら以下の通りとなりまいた。<br />
<ul>
<li>MetaEditorが新規に作成するmq4,mqhは、ANSI(Shift_JIS) </li>
<li>UNICODE(UTF-16BOM)で作成したmq4.mqhでもコンパイル出来た。 </li>
<li>内部は、UNICODE(UTF-16BOM) </li>
<li>logファイルは、ANSI(Shift_JIS) </li>
</ul>
※毎回ではないが、UNICODE(UTF-16BOM)で作成したファイルをMetaEditorで加工すると文字化けが発生しました。<br />
流れとしては、mq4(ANSI or UNICODE)→MT4(UNICODE)→SQLite3(UTF-8)→MT4(UNICODE)→output(ANSI)となります。 <br />
また、MQL5フォームに『<a href="http://www.mql5.com/en/articles/862">SQL and MQL5: Working with SQLite Database</a>』という記事があったのですが、使用することができませんでした。そのため、この記事を参考にコンパクトな物を作ることにしました。<br />
<br />
<h2>
コード</h2>
ココから<a href="https://drive.google.com/file/d/0B42sh1xkCfgtekt5djVRQWFyM3M/edit?usp=sharing">DL</a>することが出来ます。(sqlite3.mqh test.mq4 sqlite3.dll )<br />
<pre><span class="comment">
//+------------------------------------------------------------------+
//| SQLite3.mqh |
//+------------------------------------------------------------------+
</span>
<span class="keyword">#define </span>PTR <span class="keyword">int </span><span class="comment">//32bit:int 64bit:long?</span>
<span class="keyword">#define </span>sqlite3_stmt PTR
<span class="keyword">#define </span>sqlite3 PTR
<span class="keyword">#define </span>PTRPTR PTR
<span class="keyword">#define </span>SQLITE_OK <span class="number">0 </span><span class="comment">/* Successful result */
</span><span class="keyword">#define </span>SQLITE_ERROR <span class="number">1 </span><span class="comment">/* SQL error or missing database */
</span><span class="keyword">#define </span>SQLITE_INTERNAL <span class="number">2 </span><span class="comment">/* An internal logic error in SQLite */
</span><span class="keyword">#define </span>SQLITE_PERM <span class="number">3 </span><span class="comment">/* Access permission denied */
</span><span class="keyword">#define </span>SQLITE_ABORT <span class="number">4 </span><span class="comment">/* Callback routine requested an abort */
</span><span class="keyword">#define </span>SQLITE_BUSY <span class="number">5 </span><span class="comment">/* The database file is locked */
</span><span class="keyword">#define </span>SQLITE_LOCKED <span class="number">6 </span><span class="comment">/* A table in the database is locked */
</span><span class="keyword">#define </span>SQLITE_NOMEM <span class="number">7 </span><span class="comment">/* A malloc() failed */
</span><span class="keyword">#define </span>SQLITE_READONLY <span class="number">8 </span><span class="comment">/* Attempt to write a readonly database */
</span><span class="keyword">#define </span>SQLITE_INTERRUPT <span class="number">9 </span><span class="comment">/* Operation terminated by sqlite_interrupt() */
</span><span class="keyword">#define </span>SQLITE_IOERR <span class="number">10 </span><span class="comment">/* Some kind of disk I/O error occurred */
</span><span class="keyword">#define </span>SQLITE_CORRUPT <span class="number">11 </span><span class="comment">/* The database disk image is malformed */
</span><span class="keyword">#define </span>SQLITE_NOTFOUND <span class="number">12 </span><span class="comment">/* (Internal Only) Table or record not found */
</span><span class="keyword">#define </span>SQLITE_FULL <span class="number">13 </span><span class="comment">/* Insertion failed because database is full */
</span><span class="keyword">#define </span>SQLITE_CANTOPEN <span class="number">14 </span><span class="comment">/* Unable to open the database file */
</span><span class="keyword">#define </span>SQLITE_PROTOCOL <span class="number">15 </span><span class="comment">/* Database lock protocol error */
</span><span class="keyword">#define </span>SQLITE_EMPTY <span class="number">16 </span><span class="comment">/* (Internal Only) Database table is empty */
</span><span class="keyword">#define </span>SQLITE_SCHEMA <span class="number">17 </span><span class="comment">/* The database schema changed */
</span><span class="keyword">#define </span>SQLITE_TOOBIG <span class="number">18 </span><span class="comment">/* Too much data for one row of a table */
</span><span class="keyword">#define </span>SQLITE_CONSTRAINT <span class="number">19 </span><span class="comment">/* Abort due to contraint violation */
</span><span class="keyword">#define </span>SQLITE_MISMATCH <span class="number">20 </span><span class="comment">/* Data type mismatch */
</span><span class="keyword">#define </span>SQLITE_MISUSE <span class="number">21 </span><span class="comment">/* Library used incorrectly */
</span><span class="keyword">#define </span>SQLITE_NOLFS <span class="number">22 </span><span class="comment">/* Uses OS features not supported on host */
</span><span class="keyword">#define </span>SQLITE_AUTH <span class="number">23 </span><span class="comment">/* Authorization denied */
</span><span class="keyword">#define </span>SQLITE_ROW <span class="number">100 </span><span class="comment">/* sqlite_step() has another row ready */
</span><span class="keyword">#define </span>SQLITE_DONE <span class="number">101 </span><span class="comment">/* sqlite_step() has finished executing */
</span><span class="keyword">#import </span><span class="string">"sqlite3.dll"
</span><span class="comment">//int sqlite3_open(const uchar &filename[],sqlite3 &paDb);
</span><span class="keyword">int </span>sqlite3_open16<span class="operator">(</span><span class="keyword">string </span>filename<span class="operator">,</span>sqlite3 <span class="operator">&</span>paDb<span class="operator">);
</span><span class="keyword">int </span>sqlite3_close<span class="operator">(</span>sqlite3 aDb<span class="operator">);
</span><span class="comment">//int sqlite3_prepare(sqlite3 aDb,const char &sql[],int nByte,sqlite3_stmt &pStmt,PTRPTR pzTail);
//int sqlite3_prepare16(sqlite3 aDb,string sql,int nByte,sqlite3_stmt &pStmt,PTRPTR pzTail);
</span><span class="keyword">int </span>sqlite3_prepare16_v2<span class="operator">(</span>sqlite3 aDb<span class="operator">,</span><span class="keyword">string </span>sql<span class="operator">,</span><span class="keyword">int </span>nByte<span class="operator">,</span>sqlite3_stmt <span class="operator">&</span>pStmt<span class="operator">,</span>PTRPTR pzTail<span class="operator">);
</span><span class="keyword">int </span>sqlite3_exec<span class="operator">(</span>sqlite3 aDb<span class="operator">,</span><span class="keyword">const char </span><span class="operator">&</span>sql<span class="operator">[],</span>PTR acallback<span class="operator">,</span>PTR apvoid<span class="operator">,</span>PTRPTR errmsg<span class="operator">);
</span><span class="keyword">int </span>sqlite3_step<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">);
</span><span class="keyword">int </span>sqlite3_finalize<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">);
</span><span class="keyword">int </span>sqlite3_reset<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">);
</span><span class="keyword">int </span>sqlite3_errcode<span class="operator">(</span>sqlite3 db<span class="operator">);
</span><span class="keyword">int </span>sqlite3_extended_errcode<span class="operator">(</span>sqlite3 db<span class="operator">);
</span><span class="comment">//const PTR sqlite3_errmsg(sqlite3 db);
</span><span class="keyword">const string </span>sqlite3_errmsg16<span class="operator">(</span>sqlite3 db<span class="operator">);
</span><span class="keyword">int </span>sqlite3_bind_null<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">,</span><span class="keyword">int </span>icol<span class="operator">);
</span><span class="keyword">int </span>sqlite3_bind_int<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">,</span><span class="keyword">int </span>icol<span class="operator">,</span><span class="keyword">int </span>a<span class="operator">);
</span><span class="keyword">int </span>sqlite3_bind_int64<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">,</span><span class="keyword">int </span>icol<span class="operator">,</span><span class="keyword">long </span>a<span class="operator">);
</span><span class="keyword">int </span>sqlite3_bind_double<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">,</span><span class="keyword">int </span>icol<span class="operator">,</span><span class="keyword">double </span>a<span class="operator">);
</span><span class="comment">//int sqlite3_bind_text(sqlite3_stmt apstmt,int icol,char &a[],int len,PTRPTR destr);
</span><span class="keyword">int </span>sqlite3_bind_text16<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">,</span><span class="keyword">int </span>icol<span class="operator">,</span><span class="keyword">string </span>a<span class="operator">,</span><span class="keyword">int </span>len<span class="operator">,</span>PTRPTR destr<span class="operator">);
</span><span class="comment">//int sqlite3_bind_blob(sqlite3_stmt apstmt,int icol,uchar &a[],int len,PTRPTR destr);
</span><span class="keyword">const </span>PTR sqlite3_column_name<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">,</span><span class="keyword">int </span>icol<span class="operator">);
</span><span class="keyword">int </span>sqlite3_column_count<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">);
</span><span class="keyword">int </span>sqlite3_column_type<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">,</span><span class="keyword">int </span>acol<span class="operator">);
</span><span class="keyword">int </span>sqlite3_column_bytes<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">,</span><span class="keyword">int </span>acol<span class="operator">);
</span><span class="keyword">int </span>sqlite3_column_int<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">,</span><span class="keyword">int </span>acol<span class="operator">);
</span><span class="keyword">long </span>sqlite3_column_int64<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">,</span><span class="keyword">int </span>acol<span class="operator">);
</span><span class="keyword">double </span>sqlite3_column_double<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">,</span><span class="keyword">int </span>acol<span class="operator">);
</span><span class="comment">//const PTR sqlite3_column_text(sqlite3_stmt apstmt,int acol);
</span><span class="keyword">string </span>sqlite3_column_text16<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">, </span><span class="keyword">int </span>acol<span class="operator">);
</span><span class="keyword">const </span>PTR sqlite3_column_blob<span class="operator">(</span>sqlite3_stmt apstmt<span class="operator">,</span><span class="keyword">int </span>acol<span class="operator">);
</span><span class="keyword">#import
class </span>CSQLite3<span class="operator">{
</span> <span class="keyword">public</span><span class="operator">:
</span> sqlite3 sdb<span class="operator">;
</span> sqlite3_stmt stmt<span class="operator">;
</span>
CSQLite3<span class="operator">(){};
</span> CSQLite3<span class="operator">(</span><span class="keyword">string </span>file_name<span class="operator">);
</span> <span class="operator">~</span>CSQLite3<span class="operator">(){</span><span class="keyword">if</span><span class="operator">(</span>stmt<span class="operator">){</span>finalize<span class="operator">(); </span>sqlite3_close <span class="operator">(</span>sdb<span class="operator">);}};
</span>
<span class="keyword">void </span>db_set<span class="operator">(</span><span class="keyword">string </span>file_name<span class="operator">); </span><span class="comment">//ファイル名のセット
</span> <span class="keyword">int </span>reset<span class="operator">(); </span><span class="comment">//ステートメントの初期化
</span> <span class="keyword">int </span>finalize<span class="operator">(); </span><span class="comment">//ステートメントの解放
</span> <span class="keyword">void </span>db_close<span class="operator">(){</span>sqlite3_close <span class="operator">(</span>sdb<span class="operator">);}
</span> <span class="keyword">int </span>execute<span class="operator">(</span><span class="keyword">string </span>sql<span class="operator">); </span><span class="comment">//入出力のないクエリーの実行
</span> <span class="keyword">int </span>prepare<span class="operator">(</span><span class="keyword">string </span>sql<span class="operator">); </span><span class="comment">//入出力のあるクエリーの実行
</span> <span class="keyword">int </span>col_count<span class="operator">(); </span><span class="comment">//列数の取得
</span> <span class="keyword">bool </span>next_row<span class="operator">(); </span><span class="comment">//次の行を取得(true:あり false:なし)
</span> <span class="keyword">int </span>bind_text<span class="operator">(</span><span class="keyword">int </span>col<span class="operator">,</span><span class="keyword">string </span>txt<span class="operator">); </span><span class="comment">//文字データの入力
</span> <span class="keyword">int </span>bind_int<span class="operator">(</span><span class="keyword">int </span>col<span class="operator">,</span><span class="keyword">int </span>integer<span class="operator">); </span><span class="comment">//整数値の入力
</span> <span class="keyword">int </span>bind_double<span class="operator">(</span><span class="keyword">int </span>col<span class="operator">, </span><span class="keyword">double </span>dbl<span class="operator">); </span><span class="comment">//Doubule値の入力
</span> <span class="keyword">int </span>get_int<span class="operator">(</span><span class="keyword">int </span>col<span class="operator">); </span><span class="comment">//整数値の出力
</span> <span class="keyword">double </span>get_double<span class="operator">(</span><span class="keyword">int </span>col<span class="operator">); </span><span class="comment">//Doubule値の出力
</span> <span class="keyword">string </span>get_text<span class="operator">(</span><span class="keyword">int </span>col<span class="operator">); </span><span class="comment">//文字データの出力
</span> <span class="keyword">void </span>errmsg<span class="operator">(); </span><span class="comment">//エラーメッセージをプリント
</span><span class="operator">};
</span><span class="comment">//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
</span>CSQLite3<span class="operator">::</span>CSQLite3<span class="operator">(</span><span class="keyword">string </span>file_name<span class="operator">){
</span> <span class="keyword">if</span><span class="operator">(</span>file_name <span class="operator">!= </span><span class="string">""</span><span class="operator">)</span>db_set<span class="operator">(</span>file_name<span class="operator">);
}
</span><span class="keyword">void </span>CSQLite3<span class="operator">::</span>db_set<span class="operator">(</span><span class="keyword">string </span>file_name<span class="operator">){
</span> <span class="keyword">int </span>res <span class="operator">= </span>sqlite3_open16 <span class="operator">(</span>file_name<span class="operator">, </span>sdb<span class="operator">);
</span> <span class="keyword">if </span><span class="operator">(</span>res <span class="operator">!= </span>SQLITE_OK<span class="operator">) </span>errmsg<span class="operator">();
}
</span><span class="comment">//+-----------------------------------------------------------------+
// int CSQLite3::reset();
// ※ステートメントのリセット
//+-----------------------------------------------------------------+
</span><span class="keyword">int </span>CSQLite3<span class="operator">::</span>reset<span class="operator">(){
</span> <span class="keyword">int </span>ret <span class="operator">= </span><span class="number">0</span><span class="operator">;
</span> <span class="keyword">if</span><span class="operator">(</span>stmt<span class="operator">)</span>ret <span class="operator">= </span>sqlite3_reset<span class="operator">(</span>stmt<span class="operator">);
</span> <span class="keyword">return</span><span class="operator">(</span>ret<span class="operator">);
}
</span><span class="comment">//+-----------------------------------------------------------------+
// int CSQLite3::finalize();
// ※ステートメントの解放
//+-----------------------------------------------------------------+
</span><span class="keyword">int </span>CSQLite3<span class="operator">::</span>finalize<span class="operator">(){
</span> <span class="keyword">int </span>ret <span class="operator">= </span><span class="number">0</span><span class="operator">;
</span> <span class="keyword">if</span><span class="operator">(</span>stmt<span class="operator">){
</span> ret <span class="operator">= </span>sqlite3_finalize <span class="operator">(</span>stmt<span class="operator">);
</span> stmt <span class="operator">= </span><span class="number">0</span><span class="operator">;
</span> <span class="operator">}
</span> <span class="keyword">return</span><span class="operator">(</span>ret<span class="operator">);
}
</span><span class="comment">//+------------------------------------------------------------------+
// int CSQLite3::execute(string sql)
// ※入出力のないクリエ―の実行
// sql : クエリー
//+------------------------------------------------------------------+
</span><span class="keyword">int </span>CSQLite3<span class="operator">::</span>execute<span class="operator">(</span><span class="keyword">string </span>sql<span class="operator">){
</span> <span class="keyword">int </span>sq<span class="operator">,</span>res<span class="operator">;
</span> <span class="keyword">uchar </span>qr<span class="operator">[];
</span> sq <span class="operator">= </span><span class="function">StringToCharArray</span><span class="operator">(</span>sql<span class="operator">,</span>qr<span class="operator">);
</span> <span class="function">ArrayResize</span><span class="operator">(</span>qr<span class="operator">,</span>sq<span class="operator">);
</span> <span class="keyword">if</span><span class="operator">(</span>stmt<span class="operator">)</span>reset<span class="operator">();
</span> res <span class="operator">= </span>sqlite3_exec <span class="operator">(</span>sdb<span class="operator">, </span>qr<span class="operator">, </span><span class="macro">NULL</span><span class="operator">, </span><span class="macro">NULL</span><span class="operator">, </span><span class="macro">NULL</span><span class="operator">);
</span> <span class="keyword">return</span><span class="operator">(</span>res<span class="operator">);
}
</span><span class="comment">//+-----------------------------------------------------------------+
// int CSQLite3::prepare(string sql);
// ※入出力のあるクリエーの実行。
// ※反復処理は、(next_row,get_col)を使用。
// ※finalize()を使用し解放をおこなう。
// sql : クエリー
//+------------------------------------------------------------------+
</span><span class="keyword">int </span>CSQLite3<span class="operator">::</span>prepare<span class="operator">(</span><span class="keyword">string </span>sql<span class="operator">){
</span> <span class="keyword">int </span>res<span class="operator">;
</span> <span class="keyword">if</span><span class="operator">(</span>stmt<span class="operator">)</span>finalize<span class="operator">();
</span> res <span class="operator">= </span>sqlite3_prepare16_v2<span class="operator">(</span>sdb<span class="operator">, </span>sql<span class="operator">,</span><span class="function">StringLen</span><span class="operator">(</span>sql<span class="operator">)*</span><span class="number">2 </span><span class="operator">, </span>stmt<span class="operator">, </span><span class="macro">NULL</span><span class="operator">);
</span> <span class="keyword">return</span><span class="operator">(</span>res<span class="operator">);
}
</span><span class="comment">//+------------------------------------------------------------------+
// int CSQLite3::colum_count ();
// ※列数を返す。
//+------------------------------------------------------------------+
</span><span class="keyword">int </span>CSQLite3<span class="operator">::</span>col_count<span class="operator">(){
</span> <span class="keyword">return</span><span class="operator">(</span>sqlite3_column_count <span class="operator">(</span>stmt<span class="operator">));
}
</span><span class="comment">//+------------------------------------------------------------------+
// bool CSQLite3::next_row ();
// ※次の行を取得する 。(true:あり false:なし)
//+------------------------------------------------------------------+
</span><span class="keyword">bool </span>CSQLite3<span class="operator">::</span>next_row <span class="operator">(){
</span> <span class="keyword">if</span><span class="operator">(!</span>stmt<span class="operator">)</span><span class="keyword">return</span><span class="operator">(</span><span class="macro">false</span><span class="operator">);
</span> <span class="keyword">int </span>ret <span class="operator">= </span><span class="number">0</span><span class="operator">;
</span> ret <span class="operator">= </span>sqlite3_step <span class="operator">(</span>stmt<span class="operator">);
</span> <span class="keyword">return </span><span class="operator">(</span>ret <span class="operator">== </span>SQLITE_ROW <span class="operator">? </span><span class="macro">true </span><span class="operator">: </span><span class="macro">false</span><span class="operator">);
}
</span><span class="comment">//+------------------------------------------------------------------+
// bind_?? ();
// ※値を入力
//+-------------------------------------------------------------------+
//文字データ
</span><span class="keyword">int </span>CSQLite3<span class="operator">::</span>bind_text<span class="operator">(</span><span class="keyword">int </span>col<span class="operator">,</span><span class="keyword">string </span>txt<span class="operator">){
</span> <span class="keyword">int </span>ret <span class="operator">= </span><span class="number">0</span><span class="operator">;
</span> ret <span class="operator">= </span>sqlite3_bind_text16<span class="operator">(</span>stmt<span class="operator">,</span>col<span class="operator">,</span>txt<span class="operator">,</span><span class="function">StringLen</span><span class="operator">(</span>txt<span class="operator">)*</span><span class="number">2</span><span class="operator">,</span><span class="number">0</span><span class="operator">);
</span> <span class="keyword">return </span><span class="operator">(</span>ret<span class="operator">);
}
</span><span class="comment">//整数値
</span><span class="keyword">int </span>CSQLite3<span class="operator">::</span>bind_int<span class="operator">(</span><span class="keyword">int </span>col<span class="operator">,</span><span class="keyword">int </span>integer<span class="operator">){
</span> <span class="keyword">int </span>ret <span class="operator">= </span><span class="number">0</span><span class="operator">;
</span> ret <span class="operator">= </span>sqlite3_bind_int<span class="operator">(</span>stmt<span class="operator">,</span>col<span class="operator">,</span>integer<span class="operator">);
</span> <span class="keyword">return </span><span class="operator">(</span>ret<span class="operator">);
}
</span><span class="comment">//double値
</span><span class="keyword">int </span>CSQLite3<span class="operator">::</span>bind_double<span class="operator">(</span><span class="keyword">int </span>col<span class="operator">, </span><span class="keyword">double </span>dbl<span class="operator">){
</span> <span class="keyword">int </span>ret <span class="operator">= </span><span class="number">0 </span><span class="operator">;
</span> ret <span class="operator">= </span>sqlite3_bind_double<span class="operator">(</span>stmt<span class="operator">,</span>col<span class="operator">,</span>dbl<span class="operator">);
</span> <span class="keyword">return </span><span class="operator">(</span>ret<span class="operator">);
}
</span><span class="comment">//+------------------------------------------------------------------+
// column_?? ();
// ※値を取得
//+-------------------------------------------------------------------+
//整数値
</span><span class="keyword">int </span>CSQLite3<span class="operator">::</span>get_int<span class="operator">(</span><span class="keyword">int </span>col<span class="operator">){
</span> <span class="keyword">int </span>date <span class="operator">= </span><span class="number">0 </span><span class="operator">;
</span> date <span class="operator">= </span>sqlite3_column_int <span class="operator">(</span>stmt<span class="operator">, </span>col<span class="operator">);
</span> <span class="keyword">return </span><span class="operator">(</span>date<span class="operator">);
}
</span><span class="comment">//double値
</span><span class="keyword">double </span>CSQLite3<span class="operator">::</span>get_double<span class="operator">(</span><span class="keyword">int </span>col<span class="operator">){
</span> <span class="keyword">double </span>date <span class="operator">= </span><span class="number">0.0</span><span class="operator">;
</span> date <span class="operator">= </span>sqlite3_column_double <span class="operator">(</span>stmt<span class="operator">, </span>col<span class="operator">);
</span> <span class="keyword">return</span><span class="operator">(</span>date<span class="operator">);
}
</span><span class="comment">//文字データ
</span><span class="keyword">string </span>CSQLite3<span class="operator">::</span>get_text<span class="operator">(</span><span class="keyword">int </span>col<span class="operator">){
</span> <span class="keyword">string </span>date <span class="operator">= </span><span class="string">""</span><span class="operator">;
</span> date <span class="operator">= </span>sqlite3_column_text16<span class="operator">(</span>stmt<span class="operator">, </span>col<span class="operator">);
</span> <span class="keyword">return</span><span class="operator">(</span>date<span class="operator">);
}
</span><span class="comment">//+------------------------------------------------------------------+
// Errmsg();
// ※エラーメッセージをプリント
//+-------------------------------------------------------------------+
</span><span class="keyword">void </span>CSQLite3<span class="operator">::</span>errmsg<span class="operator">(){
</span> <span class="function">Print</span><span class="operator">(</span>sqlite3_errmsg16<span class="operator">(</span>sdb<span class="operator">));
}
</span></pre>
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />
使用例(サンプル)<br />
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />
<pre><span class="comment">
//+------------------------------------------------------------------+
//| SQLite3test.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
</span><span class="keyword">#property </span><span class="macro">copyright </span><span class="string">"Copyright 2012, MetaQuotes Software Corp."
</span><span class="keyword">#property </span><span class="macro">link </span><span class="string">"http://www.metaquotes.net"
</span><span class="keyword">#property </span><span class="macro">show_inputs
</span><span class="keyword">#include </span><span class="operator"><</span>sqlite3.mqh<span class="operator">>
</span><span class="keyword">input string </span><span class="input">dbns</span><span class="operator">=</span><span class="string">"C:\Testdb.db"</span><span class="operator">;</span><span class="comment">//データベース名(フルパス)
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
</span><span class="keyword">int </span><span class="function">start</span><span class="operator">(){
</span> <span class="keyword">string </span>sql <span class="operator">= </span><span class="string">""</span><span class="operator">;
</span> <span class="keyword">int </span>i<span class="operator">;
</span> <span class="comment">//インスタンス
</span> CSQLite3 sqlite<span class="operator">(</span><span class="input">dbns</span><span class="operator">);
</span>
<span class="comment">//テーブルの作成
</span> sql <span class="operator">= </span><span class="string">"CREATE TABLE IF NOT EXISTS `Test` (`id` INTEGER, `time` TEXT, `open_price` DOUBLE)"</span><span class="operator">;
</span> <span class="keyword">if</span><span class="operator">(</span>sqlite.execute<span class="operator">(</span>sql<span class="operator">)!= </span>SQLITE_OK<span class="operator">)</span>sqlite.errmsg<span class="operator">();
</span>
<span class="comment">//入力
</span> sql <span class="operator">= </span><span class="string">"INSERT INTO 'Test' VALUES (?,?,?)"</span><span class="operator">;
</span> <span class="comment">//トランザクション
</span> <span class="keyword">if</span><span class="operator">(</span>sqlite.execute<span class="operator">(</span><span class="string">"BEGIN"</span><span class="operator">)!=</span>SQLITE_OK<span class="operator">)</span>sqlite.errmsg<span class="operator">();
</span>
<span class="keyword">for</span><span class="operator">(</span>i<span class="operator">=</span><span class="number">0</span><span class="operator">;</span>i<span class="operator"><</span><span class="function">Bars</span><span class="operator">;</span>i<span class="operator">++){
</span> <span class="keyword">if</span><span class="operator">(</span>sqlite.prepare<span class="operator">(</span>sql<span class="operator">)!=</span>SQLITE_OK<span class="operator">)</span>sqlite.errmsg<span class="operator">();
</span> <span class="keyword">if</span><span class="operator">(</span>sqlite.bind_int<span class="operator">(</span><span class="number">1</span><span class="operator">,</span><span class="function">Bars</span><span class="operator">-</span>i<span class="operator">)!=</span>SQLITE_OK<span class="operator">)</span>sqlite.errmsg<span class="operator">();
</span> <span class="keyword">if</span><span class="operator">(</span>sqlite.bind_text<span class="operator">(</span><span class="number">2</span><span class="operator">,</span><span class="function">TimeToStr</span><span class="operator">(</span><span class="predefine">Time</span><span class="operator">[</span>i<span class="operator">]))!=</span>SQLITE_OK<span class="operator">)</span>sqlite.errmsg<span class="operator">();
</span> <span class="keyword">if</span><span class="operator">(</span>sqlite.bind_double<span class="operator">(</span><span class="number">3</span><span class="operator">,</span><span class="predefine">Open</span><span class="operator">[</span>i<span class="operator">])!=</span>SQLITE_OK<span class="operator">)</span>sqlite.errmsg<span class="operator">();
</span> sqlite.next_row<span class="operator">();
</span> <span class="operator">}
</span> <span class="comment">//トランザクション終了
</span> <span class="keyword">if</span><span class="operator">(</span>sqlite.execute<span class="operator">(</span><span class="string">"COMMIT"</span><span class="operator">)!=</span>SQLITE_OK<span class="operator">)</span>sqlite.errmsg<span class="operator">();
</span>
<span class="comment">//ステートメントの解法
</span> sqlite.finalize<span class="operator">();
</span>
<span class="comment">//出力
</span> sql <span class="operator">= </span><span class="string">"SELECT COUNT(*) FROM 'Test'"</span><span class="operator">;
</span> <span class="keyword">if</span><span class="operator">(</span>sqlite.prepare<span class="operator">(</span>sql<span class="operator">)!=</span>SQLITE_OK<span class="operator">)</span>sqlite.errmsg<span class="operator">();
</span> sqlite.next_row<span class="operator">();
</span> <span class="function">Print</span><span class="operator">(</span><span class="string">"Bars="</span><span class="operator">,</span><span class="function">IntegerToString</span><span class="operator">(</span><span class="function">Bars</span><span class="operator">),</span><span class="string">" データベース内のデータ数="</span><span class="operator">,</span>sqlite.get_text<span class="operator">(</span><span class="number">0</span><span class="operator">));
</span>
<span class="comment">//ステートメントの解法
</span> sqlite.finalize<span class="operator">();
</span>
<span class="comment">//抽出
</span> sql <span class="operator">= </span><span class="string">"SELECT * FROM 'Test'" </span><span class="operator">;
</span> <span class="keyword">if</span><span class="operator">(</span>sqlite.prepare<span class="operator">(</span>sql<span class="operator">)!=</span>SQLITE_OK<span class="operator">)</span>sqlite.errmsg<span class="operator">();
</span> <span class="keyword">while</span><span class="operator">(</span>sqlite.next_row<span class="operator">()){
</span> <span class="function">Print</span><span class="operator">(</span><span class="function">IntegerToString</span><span class="operator">(
</span> sqlite.get_int<span class="operator">(</span><span class="number">0</span><span class="operator">)),</span><span class="string">" : "</span><span class="operator">,
</span> sqlite.get_text<span class="operator">(</span><span class="number">1</span><span class="operator">),</span><span class="string">" : "</span><span class="operator">,
</span> <span class="function">DoubleToStr</span><span class="operator">(</span>sqlite.get_double<span class="operator">(</span><span class="number">2</span><span class="operator">),</span><span class="predefine">Digits</span><span class="operator">));
</span> <span class="operator">}
</span>
<span class="comment">//ステートメントの解法
</span> sqlite.finalize<span class="operator">();
</span> <span class="comment">//データベースを閉じる。
</span> sqlite.db_close<span class="operator">();
</span> <span class="keyword">return </span><span class="operator">(</span><span class="number">0</span><span class="operator">);
</span> <span class="operator">}
</span> </pre>
<br />
<h2>
まとめ</h2>
mq4(ANSI or UNICODE)→MT4(UNICODE)→SQLite3(UTF-8)→MT4(UNICODE)→output(ANSI)<br />
エンコードの統一ってできないものでしょうか(ー_ー)!!。。<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com0tag:blogger.com,1999:blog-6027720561701794729.post-26906497331089747432014-06-03T00:09:00.001+09:002014-06-08T01:14:21.852+09:00ボラティリティを手の中に・・今回の内容は、偏見に満ちた自主検証の内容となっていますのでご了承ください。^^;<br />
<br />
<h2>
</h2>
<h2>
はじめに</h2>
さて、しばらくの間、下記のヒストグラム(CLOSE-OPEN)が、どのような分布で近似できるか検討してきましたが、なかなか良い分布が見つかりませんでした。<br />
<a href="http://lh3.ggpht.com/--ZBLX7IJEbk/U5M49uUJ1rI/AAAAAAAABCM/_J7qF2TfbA8/s1600-h/clop%25255B1%25255D.png"><img alt="clop" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2PO9aBiy3LooeugBD-Paj4t0XO70hUNQq6XdVgdmF6F9Q1Vokb7gfOmEkPcvx2SStuxT2NLoc0fra5pKIEPLTOUxhaUmuL-AzGpbRpA97nLEF7m1mgnFjVxgjuUDyWcvkdw_viZaCiQ0/?imgmax=800" height="360" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="clop" width="360" /></a> <br />
<br />
そこで、tick-volumeのヒストグラムに視点を変更してみました。すると、そのヒストグラムは、対数正規分布がマッチすることが分かりました。<br />
<a href="http://lh4.ggpht.com/-eS958fc8784/U4yTl218g4I/AAAAAAAABCc/wOxz1va74zQ/s1600-h/volumer%25255B1%25255D.png"><img alt="volumer" border="0" src="http://lh5.ggpht.com/-L2asBbd_NaY/U4yTmfnfxaI/AAAAAAAABCk/ZGXYQjLIUpk/volumer_thumb%25255B1%25255D.png?imgmax=800" height="360" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="volumer" width="360" /></a> <br />
<br />
また、時間単位で作成されている足(データ)をtick数単位にまとめ直した足(データ)ではどうなるか?<br />
確認しました。すると、正規分布がマッチすることが分かりました。<br />
※1分足をtick数でまとめて加工したデータ<br />
<a href="http://lh4.ggpht.com/-i33F8N9JKEw/U4yTm5YI6AI/AAAAAAAABCs/MAsOvQkb64M/s1600-h/tick%25255B1%25255D.png"><img alt="tick" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZPriOAMnMZ1nswvL5gprkgE2eNQTe4t33WkOv-7tgYOtGj6Y3yeHFR46T_HIQN08-P4Ja6yx525nugzOS3DucoewUZ9QBELNDWkbxPRdoOeKKlAoqhJv4xA_dc3zw0nm-wfjzGCJNCTg/?imgmax=800" height="360" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="tick" width="360" /></a> <br />
<br />
そこで、,まとめるtick数を変化させた場合の偏差を求めてみると、下図のドットが現れました。<br />
次に、そのドットに近似させる式を探したところ、ランダムウォークの拡散現象(分散)を表す式(上)のt(時間)をtick_volumeに置き換えた式であることがわかりました。また、拡散係数を便宜上ルートの外に出すと、下記の通りの式となりマッチさせることが出来ました(緑色のライン)。ちなみにα=2.24<br />
<a href="http://lh5.ggpht.com/-vk6ATQXhgNU/U4yTqORARGI/AAAAAAAABC8/VAnPEL56g58/s1600-h/ttcct%25255B1%25255D.png"><img alt="ttcct" border="0" src="http://lh5.ggpht.com/-6iuOC6RpWA4/U4yTqg4-k-I/AAAAAAAABDE/j_ostV_kkr4/ttcct_thumb%25255B1%25255D.png?imgmax=800" height="360" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="ttcct" width="360" /></a><br />
<br />
<div align="right">
※t:時間 / tc:tick_volume</div>
<a href="http://lh6.ggpht.com/-rqzDA0NNVrA/U4yTn1DuvEI/AAAAAAAABDM/zysIDBDsk9M/s1600-h/ttty%25255B1%25255D.png"><img alt="ttty" border="0" src="http://lh6.ggpht.com/-taziocw2bqo/U4yTopz_fDI/AAAAAAAABDU/cpSwYEPUID0/ttty_thumb.png?imgmax=800" height="60" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="ttty" width="189" /></a><br />
<div align="right">
<a href="http://lh4.ggpht.com/-oFF6UJsyaJc/U4yTpD8rUUI/AAAAAAAABDc/B5q1wUISlmI/s1600-h/tttcc%25255B1%25255D.png"><img alt="tttcc" border="0" src="http://lh5.ggpht.com/--t2meIavZTc/U4yTpr36kkI/AAAAAAAABDk/uo9zsMW6u8U/tttcc_thumb.png?imgmax=800" height="60" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="tttcc" width="203" /></a><a href="http://lh5.ggpht.com/-vk6ATQXhgNU/U4yTqORARGI/AAAAAAAABDs/j6NkLVgGiYs/s1600-h/ttcct1.png"></a></div>
<br />
ここまでをまとめてみると・・・<br />
<ul>
<li>ドル円の単位時間当たり(今回は、H1)のボラティリティ(CL-OP)のヒストグラムに単独でマッチするような分布は見つけられなかった。しかし、tick_volumeをまとめて作成したヒストグラムが正規分布となり、かつ、tick_volumeのヒストグラムが対数正規分布となっていることが解った。そのことから、偏差が異なる正規分布の集合(合成)が、あのような分布を形作るという結論となった。 </li>
<li>ランダムウォークの拡散現象(分散)を表す式をtick_volumeに置き換えた式を用い、偏差とtick_volumeの関係を数式化することができることがわかった。 </li>
</ul>
というものになりました。<-我ながらかなり強引ですww<br />
<br />
<h2>
</h2>
<h2>
tick_volumeの予測</h2>
さて、ここから本題です。偏差とtick_volumeの関係がわかれば、ticl_volumeを予測することにより偏差を予測することが可能ではないか?と考え、tick_volumeを予測してみることにしました。<br />
まずは、チャートのtick_volumeを観察してみます。(今回は、USDJPY & EURUSDのH1を使用しています。)<br />
<div align="right">
<a href="http://lh4.ggpht.com/-SOjzzoPq3dU/U5M5E5J5IHI/AAAAAAAABD0/BNDgY2n59ro/s1600-h/vol%25255B1%25255D.png"><img alt="vol" border="0" src="http://lh3.ggpht.com/-eFo4niVOJ8o/U5M5FkWpH-I/AAAAAAAABD8/9pkYjcvo6BY/vol_thumb.png?imgmax=800" height="386" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="vol" width="360" /></a> ※縦のラインは、1日を表しています。</div>
<br />
ジ~と見ます。wすると、1日単位で周期的に変化している様に見えます。そこで、次の様に仮定してみます。<br />
【各時間毎のtick_volumeは、各時間の固有パラメータと直前のtick_volumeの出来高に影響を受ける。】<br />
これを式にすると。。<br />
<a href="http://lh6.ggpht.com/-_a003YbWLTg/U5M5GJFOprI/AAAAAAAABEE/xoDSvElThhE/s1600-h/tc.png"><img alt="tc" border="0" src="http://lh5.ggpht.com/-QDQxvkujK1Q/U5M5GmjTv8I/AAAAAAAABEM/-pkiTqUGwv4/tc_thumb.png?imgmax=800" height="60" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="tc" width="497" /></a> <br />
<div align="right">
※a[0]~a[23]:各時間に割り当てられるパラメータ</div>
<br />
ここまで仮定すれば、後は重回帰を用いて最適解を求めれば出来上がりです。まずは、結果からご覧ください。赤の折れ線が予測値で水色が、tick_volumeです。表示期間は、2014/05/29~06/04で、最適化の期間は、2014/05/01から1000barsです。<br />
<a href="http://lh5.ggpht.com/-zYmYATvQbVM/U5M5He9sZzI/AAAAAAAABEU/_OrwnFl-iOc/s1600-h/EURUSDH1%25255B9%25255D.png"><img alt="EURUSDH1" border="0" src="http://lh6.ggpht.com/-Bz5dfAOBYKc/U5M5IDsSFCI/AAAAAAAABEc/YPUpYEKu6_k/EURUSDH1_thumb%25255B6%25255D.png?imgmax=800" height="380" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="EURUSDH1" width="480" /></a> <br />
うまくマッチしているように見えるのですが如何なものでしょうか(・・?<br />
<br />
今回テストしたモノは、MT4がMT5の仕様に対応したこともありMT5用のヘッダーをお借りして作成してみました。<br />
<a href="https://drive.google.com/file/d/0B42sh1xkCfgtcjJGa3ZtYy1WNkU/edit?usp=sharing">ココ</a>よりDLが可能です。<br />
DL出来るファイルは、以下の通りです。(今回は、DLL未使用にしてみました。)<br />
┣Matrix.mqh 【<a href="http://www.mql5.com/en/code/601">Matrix operations library - library for MetaTrader 5</a>】から取得し一部加工しました。(行列用)<br />
┣Multiple_Regression_Analysis.mqh (重回帰用)<br />
┗TKVP_H1.mq4 (テスト用のインジケータ)<br />
<br />
<h2>
</h2>
<h2>
ボラティリティの予測</h2>
次に、予測したtick_volumeを用いて1σを表示させてみました。(白線:1時間後 青線:2時間後)<br />
<a href="http://lh5.ggpht.com/-Bs3tZS4tF30/U5M5I7j241I/AAAAAAAABEk/P3K0FmJpVZg/s1600-h/band%25255B4%25255D.png"><img alt="band" border="0" src="http://lh4.ggpht.com/-l_-hOVlcgrQ/U5M5Jb8r_EI/AAAAAAAABEs/KVBNED30goU/band_thumb%25255B2%25255D.png?imgmax=800" height="380" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="band" width="549" /></a> <br />
tick_volumeの予測値が結果より若干高くなっているためか、1σの範囲が若干広い気もしますが。。<br />
<br />
<h2>
</h2>
<h2>
課題</h2>
パラメータの不足<br />
TKVP_H1.mq4 を作動させてもらうとわかると思いますが、予測値が結果と大きく乖離する場合があります。それは、イベント(指標の発表、要人の発言、市場の休場など)が原因です。イベントを取り入れるパラメータが必要だと思われます。<br />
拡散係数の計算<br />
tickデータから直接計算できれいいのですが、M1を使用しているのでまとめる時に誤差が生じてしまいます。<br />
良い方法があればいいのですが、今回は、単純にvolumeの加算による方法をとりました。<br />
<br />
<h2>
</h2>
<h2>
まとめ</h2>
課題が解決できれば、ボラティリティを予測する手段として良い方法だと思うのですが。。。^^;<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com4tag:blogger.com,1999:blog-6027720561701794729.post-19903691885980447212014-03-26T16:14:00.001+09:002014-03-26T16:19:50.108+09:00Notepad++ de MQL4 Stage 2懲りもせずに新MT4用のNotepad++用の補完とハイライト用のデータを作成したので公開しておきます。<br />
<br />
<a href="http://lh6.ggpht.com/-rSYCEZMfspM/UzJ-VodBeEI/AAAAAAAAA-U/WvMb8dXM3GA/s1600-h/mqq%25255B10%25255D.png"><img alt="mqq" border="0" src="http://lh3.ggpht.com/-G-0QJ-sajQk/UzJ-WkgecmI/AAAAAAAAA-c/-egP8uWxC8c/mqq_thumb%25255B6%25255D.png?imgmax=800" height="317" style="border-color: -moz-use-text-color; border-style: none; border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="mqq" width="512" /></a> <br />
<br />
ファイルは、<a href="https://drive.google.com/file/d/0B42sh1xkCfgtVVA2NUlqVGdIOVU/edit?usp=sharing">ここからDL</a>してください。ファイルの説明は、以下の通りです。<br />
<ul>
<li>MQL4.xml 補完用データ | 保存先は、---\Notepad++\plugins\APIs</li>
<li>MQL4_color.xml ハイライト用のデータ | 【言語(L)】-【言語の定義】-【インポート】から</li>
<li>Reserved_word.mq4 確認用及び他エディタ用予約語一覧テキスト</li>
</ul>
<br />
<br />
補足 ハイライトの分類は、以下の配色の通りです。<br />
<ul>
<li>黄色枠:旧MQL4の範囲</li>
<li>赤色枠:新規追加範囲(MetaEditorのハイライトを参考に分類)</li>
<li>緑色枠:旧+新 ピンク色(デフォルト)</li>
<li>色は、適当に指定していますので調整してください。</li>
</ul>
<img alt="raberu" border="0" src="http://lh6.ggpht.com/-4hvjLUJiXPY/UzJ-ZJ8b88I/AAAAAAAAA-g/Upzjz0XlBJw/raberu_thumb%25255B5%25255D.png?imgmax=800" height="327" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="raberu" width="221" /><br />
<br />
<br />
<h2>
【蛇足】</h2>
mql.exe(旧.metalang.exe)が更新時に添付されなくなるという情報を聞き、新しいmql.exeをDLしてみました。・・・が、倍以上になってる@@;。。。なぜでしょう?<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://lh5.ggpht.com/-shmuvlzRA-g/UzJ-Zs6MymI/AAAAAAAAA-o/z1ElMxqeU10/s1600-h/sin%25255B5%25255D.png" style="margin-left: 1em; margin-right: 1em;"><img alt="sin" border="0" src="http://lh4.ggpht.com/-wKiE5EM19oM/UzJ-afVQtMI/AAAAAAAAA-s/_M42bt7ukkw/sin_thumb%25255B3%25255D.png?imgmax=800" height="56" style="border-color: -moz-use-text-color; border-style: none; border-width: 0px; display: inline;" title="sin" width="364" /></a></div>
<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com0tag:blogger.com,1999:blog-6027720561701794729.post-62898415816877584222013-11-17T00:31:00.001+09:002013-11-17T00:38:29.896+09:00f(x)=a+bX1+cX2+dX3+eX4+fX5+gX6 で重回帰分析今回は、多項式回帰のコードを流用して複数(6つ以下)の異なる時系列データを用て、元となる時系列データを重回帰分析してみました。<br />
<br />
<a href="http://lh4.ggpht.com/-PlYCjSpm1hs/UoePsPa4j9I/AAAAAAAAA54/mxsE2ou_Wf0/s1600-h/jp225%25255B6%25255D.png"><img alt="jp225" border="0" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn-YCGXqYT01FeRXflUogGwHV_NTndsZs339nJ47KmtVT9yKVfWFBLUw8gl7Jv216JYxsrSKb67UiFjmtSg-ai65EdJ_e6OcBHN2hFFU58X8PWLYVS7scYbwIYi4qsQ6bpRVZ34p8E278/?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="jp225" width="480" /></a> <br />
<br />
<h2>
【仕様説明】</h2>
f(x)=a+bX1+cX2+dX3+eX4+fX5+gX6 (a~g:定数 X1~X6:説明変数)<br />
の場合の定数(a~g)を重回帰分析で求め近似モデルf(x)を表示させる。また、上記式に代入した式と近似モデルからの残差二乗和を精度としコメント表示させる。<br />
重回帰分析の範囲は、各説明変数の最古の時系列データの中で最新データのものを基準としパラメータで指定した範囲で分析する。また、欠損データがある場合は、欠損データからもっとも近い過去のデータを使用し補完を行う。<br />
<br />
例)<br />
USDJPY(M5)を説明変数(EURUSDとEURJPY)で分析した場合は、以下のようになる。<br />
[USDJPY]f(x)=[97.80020313]+[72.30209778]*EURUSD+[0.73920198]EURJPY 精度=0.00525783<br />
<div align="center">
<a href="http://lh6.ggpht.com/-pDan4N8_6pY/UoePs-fbYVI/AAAAAAAAA6E/8rv1jLWif8E/s1600-h/USDJPYTT%25255B4%25255D.png"><img alt="USDJPYTT" border="0" height="258" src="http://lh5.ggpht.com/-JISptW70ipU/UoePtb4EUWI/AAAAAAAAA6Q/nNR0sN-YP_A/USDJPYTT_thumb%25255B2%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="USDJPYTT" width="497" /></a> ※本来USDJPYをEURUSD及びEURJPYで説明する場合は、f(x)=EURJPY/EURUSDですよね^^;</div>
ちなみに、一番初めの画像は、<br />
[NIKKEI225]f(x)=[4382]+[372]*USDJPY+[0.3139]*DJ30+[0.2165]*GOLD+[-501]*JAPAN_BOND+[-223]*5Y_T-NOTES+[225]*10Y_T-NOTES 精度=6954558 (※細部省略) です。<br />
<br />
<h2>
【使い方】</h2>
1.<a href="https://drive.google.com/file/d/0B42sh1xkCfgtOV9XV25lY2ZNMFk/edit?usp=sharing">ココから重回帰.zip</a>をDLし解凍する。<br />
2.gsl.dllとgslcblas.dllをMT4のterminal.exeと同じ位置に置き、!重回帰v2.mq4をindicatorsフォルダに置く。<br />
3.説明変数となる通貨ペアを表示させ、なるべく多くのデータを取得しておく。<br />
4.!重回帰v2.mq4をチャートにセットし、DLLの使用を許可する。<br />
<a href="http://lh6.ggpht.com/-jn7elJ1QRzQ/UoePuOtyrfI/AAAAAAAAA6U/2oEtls-dgXc/s1600-h/dll%25255B4%25255D.png"><img alt="dll" border="0" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYOGMqFqChQ9ZY4gHg7LCe2fTqi5O3l1DOovE1uu9A_WnR2GcwB8jWf6f24UJOcxRpieLppKFtHrwGutNy8f-XZGNTgE_xf4RWd_Lgd3DQ678nQDM1JPyL5ERPIojLLraJ0-GISA75YY8/?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="dll" width="432" /></a> <br />
5.パラメータの説明<br />
N: 重回帰分析の範囲 デフォルトは、1000個のデータを使用<br />
type_price: 0:終値 1:初値 2:高値 3:底値 4:(高値+低値)/2 5:(高値+低値+終値)/3 <br /> 6:(高値+低値+2*終値)/4<br />
zeroset: 一日ごとに重回帰分析を更新する場合は、true そうでない場合は、false <br /> ※ 更新時刻は、サーバー時間の00:00です。<br />
symb1~6: 説明変数の通貨ペアを記入します。ただし、symb1から記入し使用しない箇所は、空欄(何も記入しない)にしてください。<br />
<blockquote>
<a href="http://lh5.ggpht.com/-TDwU0yEuXcc/UoePu_bKIxI/AAAAAAAAA6k/PbVr-NtOrN4/s1600-h/pea%25255B4%25255D.png"><img alt="pea" border="0" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje899RCJ3uTwxT5SckOC2eFOp65GnzOg_n9lF-kKcZjDHk128vts-n3B3Dg1FoQMAxRwOUE5hMc99rS6fJ1gvl33sRTYEoAYw_TP98goX6mISBT0ZDZCdF6Lxw7Sxb0JChp_YTYiO27_k/?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="pea" width="433" /></a></blockquote>
<br />
<h2>
【まとめ】</h2>
MT4の仕様(バグ?)により以下のコードが通りませんでした。(昔からだけど。。。)<br />
//////////////////////////////////////////////////////////////////////////////////<br />
string symb[6] = {USDJPY,EURUSD,EURJPY,AUDJPY,CHFJPY,GBPJPY};<br />
double date[6];<br />
for(int i=0;i<6;i++) date[i] = iMA(symb[i], 0,1,0,MODE_SMA,0,0);<br />
////////////////////////////////////////////////////////////////////////////////////<br />
一度、string型の変数に代入し直してやるかiMA(symb[0],…の様にしてやると通りました。<br />
また、ラッパーを使用せず作成したため行列の範囲を指定して剥きとるgsl関数が使用できませんでした。<br />
<br />
<br />
<h2>
【PR】</h2>
MT4使いの方でMT5なんて別にいらないんじゃないの?という方へ<br />
MT4の最適化作業にイライラしていませんか?<br />
せっかく高スペックのCPUを積んでいるのにMT4が作動しているのはシングルスレッドのみで、ほかのスレッドが空いていませんか?Core i7 が泣いていますよ!<br />
MT5ならマルチスレッドに対応しているので、最適化作業の時間短縮が測れます。また、複数のPCを繋いだり専用クラウドサービスを使用して最適化作業をすることも可能です。<br />
数日前に『メタトレーダー4&5』という書籍が発売になりました。著者は、豊嶋先生です。これを機にMT5の世界に足を組み入れてみませんか?<br />
いつやるの?。。。いまでしょう! <フルw<br />
<img height="245" src="http://ecx.images-amazon.com/images/I/51-H-UjZD9L._SS500_.jpg" style="display: block; float: none; margin-left: auto; margin-right: auto;" width="245" /> <br />
<div class="wlWriterEditableSmartContent" id="scid:71DAE225-7A86-476b-AB02-93AD817CAA63:a2248e4d-24e7-4e66-b8f1-d34a4b9f3b71" style="display: inline; float: none; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<a href="http://www.blogger.com/blogger.g?blogID=6027720561701794729"></a></div>
<div align="center">
<a href="http://www.amazon.co.jp/gp/product/4775991256/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4775991256&linkCode=as2&tag=bighope05-22">amazonへのリンク</a><img alt="" border="0" height="1" src="http://ir-jp.amazon-adsystem.com/e/ir?t=bighope05-22&l=as2&o=9&a=4775991256" style="border-bottom-style: none !important; border-left-style: none !important; border-right-style: none !important; border-top-style: none !important; margin: 0px;" width="1" /> </div>
<div align="center">
<a href="http://www.tradersshop.com/bin/showprod?c=9784775991251">Traders Shopへのリンク</a></div>
<br />
<br />
<h2>
【code】</h2>
<pre><span style="font-size: x-small;">
<span style="color: grey;">//+------------------------------------------------------------------+
//| !重回帰v2.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
</span><span style="color: blue;">#property</span> <span style="color: blue;">copyright</span> <span style="color: teal;">"Copyright 2012, MetaQuotes Software Corp."
</span><span style="color: blue;">#property</span> <span style="color: blue;">link</span> <span style="color: teal;">"http://www.metaquotes.net"
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_chart_window
#property</span> <span style="color: blue;">show_inputs
#property</span> <span style="color: blue;">indicator_buffers</span> <span style="color: green;">1
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_color1</span> <span style="color: #333399;">Snow
</span><span style="color: grey;">//DLL
</span><span style="color: blue;">#import</span> <span style="color: teal;">"gsl.dll"
</span> <span style="color: grey;">//ベクトル
</span> <span style="color: grey;">//長さ n のベクトルを生成し、生成したベクトル構造体へのハンドルを返す。
</span> <span style="color: blue;">int</span> gsl_vector_alloc <span style="color: navy;">(</span><span style="color: blue;">int</span> n<span style="color: navy;">);
</span> <span style="color: grey;">//v:成形されているベクトル構造体へのハンドル。すでに確保されているベクトル v を解放する。
</span> <span style="color: blue;">void</span> gsl_vector_free <span style="color: navy;">(</span><span style="color: blue;">int</span> v<span style="color: navy;">);
</span> <span style="color: grey;">//ベクトル v の i 番目の要素を返す。
</span> <span style="color: blue;">double</span> gsl_vector_get <span style="color: navy;">(</span><span style="color: blue;">int</span> v<span style="color: navy;">,</span> <span style="color: blue;">int</span> i<span style="color: navy;">);
</span> <span style="color: grey;">//ベクトル v の i 番目の要素に x の値を代入する。
</span> <span style="color: blue;">void</span> gsl_vector_set <span style="color: navy;">(</span><span style="color: blue;">int</span> v<span style="color: navy;">,</span> <span style="color: blue;">int</span> i<span style="color: navy;">,</span> <span style="color: blue;">double</span> x<span style="color: navy;">);
</span>
<span style="color: grey;">//行列
</span> <span style="color: grey;">//大きさか. n1 行× n2 列の行列を生成し、新しい初期化された行列構造体へのポインタを返す。
</span> <span style="color: blue;">int</span> gsl_matrix_alloc <span style="color: navy;">(</span><span style="color: blue;">int</span> n1<span style="color: navy;">,</span> <span style="color: blue;">int</span> n2<span style="color: navy;">);
</span> <span style="color: grey;">//すでに確保されている行列 m を解放する。
</span> <span style="color: blue;">void</span> gsl_matrix_free <span style="color: navy;">(</span><span style="color: blue;">int</span> m<span style="color: navy;">);
</span> <span style="color: grey;">//行列 m の (i, j) 成分に x の値を代入する。
</span> <span style="color: blue;">void</span> gsl_matrix_set <span style="color: navy;">(</span><span style="color: blue;">int</span> m<span style="color: navy;">,</span> <span style="color: blue;">int</span> i<span style="color: navy;">,</span> <span style="color: blue;">int</span> j<span style="color: navy;">,</span> <span style="color: blue;">double</span> x<span style="color: navy;">);
</span> <span style="color: grey;">//行列 m の (i, j) 成分を返す。
</span> <span style="color: blue;">double</span> gsl_matrix_get <span style="color: navy;">(</span><span style="color: blue;">int</span> m<span style="color: navy;">,</span> <span style="color: blue;">int</span> i<span style="color: navy;">,</span><span style="color: blue;">int</span> j<span style="color: navy;">);</span>
<span style="color: grey;">//重回帰
</span> <span style="color: grey;">//この関数は n 変数て. p 個のパラメータを持つモデルで近似するための作業領域を確保する。
</span> <span style="color: blue;">int</span> gsl_multifit_linear_alloc <span style="color: navy;">(</span><span style="color: blue;">int</span> n<span style="color: navy;">,</span> <span style="color: blue;">int</span> p<span style="color: navy;">);
</span> <span style="color: grey;">//この関数は作業領域 w に割り当てられたメモリを解放する。
</span> <span style="color: blue;">void</span> gsl_multifit_linear_free <span style="color: navy;">(</span><span style="color: blue;">int</span> work<span style="color: navy;">);</span>
<span style="color: grey;">//この関数は観測データ y と予測子変数の行列 X に対する、モデル y = Xc の最良近似パラ
</span> <span style="color: grey;">//メータ c を計算する。モデルパラメータの分散共分散行列 cov は、近似に対するデータの
</span> <span style="color: grey;">//ばらつきから計算される。近似モデルからの残差二乗和 χ2 は chisq に返される。
</span> <span style="color: blue;">int</span> gsl_multifit_linear <span style="color: navy;">(</span><span style="color: blue;">int</span> X<span style="color: navy;">,</span> <span style="color: blue;">int</span> y<span style="color: navy;">,</span> <span style="color: blue;">int</span> c<span style="color: navy;">,</span><span style="color: blue;">int</span> cov<span style="color: navy;">,</span> <span style="color: blue;">double</span> <span style="color: navy;">&</span> chisq<span style="color: navy;">[],</span> <span style="color: blue;">int</span> work<span style="color: navy;">);
</span><span style="color: blue;">#import
</span><span style="color: grey;">//+--------------------------------------------------------------------------------------+
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> N <span style="color: navy;">=</span> <span style="color: green;">1000</span><span style="color: navy;">;</span> <span style="color: grey;">//回帰範囲
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> type_price <span style="color: navy;">=</span> <span style="color: #333399;">PRICE_CLOSE</span><span style="color: navy;">;</span> <span style="color: grey;">//取得値
</span><span style="color: blue;">extern</span> <span style="color: blue;">bool</span> zeroset <span style="color: navy;">=</span> <span style="color: blue;">false</span><span style="color: navy;">;</span> <span style="color: grey;">//true: 00:00に再計算 false: 再計算しない
</span><span style="color: blue;">extern</span> <span style="color: blue;">string</span> symb1 <span style="color: navy;">=</span> <span style="color: teal;">"EURUSD"</span><span style="color: navy;">;</span> <span style="color: grey;">//説明変数1
</span><span style="color: blue;">extern</span> <span style="color: blue;">string</span> symb2 <span style="color: navy;">=</span> <span style="color: teal;">"EURJPY"</span><span style="color: navy;">;</span> <span style="color: grey;">//説明変数2
</span><span style="color: blue;">extern</span> <span style="color: blue;">string</span> symb3 <span style="color: navy;">=</span> <span style="color: teal;">"AUDUSD"</span><span style="color: navy;">;</span> <span style="color: grey;">//説明変数3
</span><span style="color: blue;">extern</span> <span style="color: blue;">string</span> symb4 <span style="color: navy;">=</span> <span style="color: teal;">"AUDJPY"</span><span style="color: navy;">;</span> <span style="color: grey;">//説明変数4
</span><span style="color: blue;">extern</span> <span style="color: blue;">string</span> symb5 <span style="color: navy;">=</span> <span style="color: teal;">"GBPUSD"</span><span style="color: navy;">;</span> <span style="color: grey;">//説明変数5
</span><span style="color: blue;">extern</span> <span style="color: blue;">string</span> symb6 <span style="color: navy;">=</span> <span style="color: teal;">"GBPJPY"</span><span style="color: navy;">;</span> <span style="color: grey;">//説明変数6
//+--------------------------------------------------------------------------------------+
</span><span style="color: blue;">string</span> symb<span style="color: navy;">[</span><span style="color: green;">6</span><span style="color: navy;">];
</span><span style="color: blue;">int</span> vcont<span style="color: navy;">;
</span><span style="color: blue;">double</span> line1<span style="color: navy;">[];
</span><span style="color: grey;">//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> init<span style="color: navy;">(){
</span> <span style="color: blueviolet;">SetIndexStyle</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: #333399;">DRAW_LINE</span><span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexBuffer</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">,</span>line1<span style="color: navy;">);
</span> symb<span style="color: navy;">[</span><span style="color: green;">0</span><span style="color: navy;">]=</span>symb1<span style="color: navy;">;
</span> symb<span style="color: navy;">[</span><span style="color: green;">1</span><span style="color: navy;">]=</span>symb2<span style="color: navy;">;
</span> symb<span style="color: navy;">[</span><span style="color: green;">2</span><span style="color: navy;">]=</span>symb3<span style="color: navy;">;
</span> symb<span style="color: navy;">[</span><span style="color: green;">3</span><span style="color: navy;">]=</span>symb4<span style="color: navy;">;
</span> symb<span style="color: navy;">[</span><span style="color: green;">4</span><span style="color: navy;">]=</span>symb5<span style="color: navy;">;
</span> symb<span style="color: navy;">[</span><span style="color: green;">5</span><span style="color: navy;">]=</span>symb6<span style="color: navy;">;
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span><span style="color: blue;">int</span> i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span><span style="color: green;">6</span><span style="color: navy;">;</span>i<span style="color: navy;">++)</span><span style="color: blue;">if</span><span style="color: navy;">(</span>symb<span style="color: navy;">[</span>i<span style="color: navy;">]!=</span><span style="color: teal;">""</span><span style="color: navy;">)</span>vcont<span style="color: navy;">++;</span> <span style="color: blue;">else</span> <span style="color: blue;">break</span><span style="color: navy;">;
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> deinit<span style="color: navy;">(){
</span> <span style="color: blueviolet;">Comment</span><span style="color: navy;">(</span><span style="color: teal;">""</span><span style="color: navy;">);
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> start<span style="color: navy;">(){
</span> <span style="color: blue;">string</span> text<span style="color: navy;">;
</span> <span style="color: blue;">static</span> <span style="color: blue;">double</span> ix<span style="color: navy;">[</span><span style="color: green;">8</span><span style="color: navy;">];
</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> barsht<span style="color: navy;">;
</span> <span style="color: blue;">int</span> matricx_xn<span style="color: navy;">;
</span> <span style="color: blue;">double</span> line<span style="color: navy;">;
</span> <span style="color: blue;">string</span> name<span style="color: navy;">,</span>sym<span style="color: navy;">;
</span> <span style="color: blue;">int</span> i<span style="color: navy;">,</span>q<span style="color: navy;">,</span>z<span style="color: navy;">,</span>j<span style="color: navy;">,</span>s<span style="color: navy;">;
</span> <span style="color: blue;">int</span> counted_bars<span style="color: navy;">=</span><span style="color: blueviolet;">IndicatorCounted</span><span style="color: navy;">();
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>counted_bars<span style="color: navy;"><</span><span style="color: green;">1</span><span style="color: navy;">){
</span> <span style="color: grey;">//各データ数で最も少ないbar数の取得
</span> <span style="color: blue;">datetime</span> oldbars<span style="color: navy;">;
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>z<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>z<span style="color: navy;"><</span>vcont<span style="color: navy;">;</span>z<span style="color: navy;">++)</span>oldbars <span style="color: navy;">=</span> <span style="color: blueviolet;">MathMax</span><span style="color: navy;">(</span>oldbars<span style="color: navy;">,</span><span style="color: green;">iTime</span><span style="color: navy;">(</span>symb<span style="color: navy;">[</span>z<span style="color: navy;">],</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: green;">iBars</span><span style="color: navy;">(</span>symb<span style="color: navy;">[</span>z<span style="color: navy;">],</span><span style="color: green;">0</span><span style="color: navy;">)-</span><span style="color: green;">1</span><span style="color: navy;">));
</span> <span style="color: blue;">int</span> lastbar <span style="color: navy;">=</span> <span style="color: green;">iBarShift</span><span style="color: navy;">(</span><span style="color: #333399;">NULL</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span>oldbars<span style="color: navy;">)-</span><span style="color: green;">1</span><span style="color: navy;">;
</span> barsht <span style="color: navy;">=</span> <span style="color: magenta;">Bars</span><span style="color: navy;">-</span>lastbar<span style="color: navy;">;
</span> <span style="color: grey;">//領域の確保
</span> <span style="color: blue;">int</span> matricx_xt <span style="color: navy;">=</span> gsl_matrix_alloc<span style="color: navy;">(</span>lastbar<span style="color: navy;">,</span> vcont<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">);
</span> <span style="color: blue;">int</span> matricx_xa<span style="color: navy;">=</span> gsl_matrix_alloc<span style="color: navy;">(</span>N<span style="color: navy;">,</span> vcont<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">);
</span> <span style="color: blue;">double</span> date<span style="color: navy;">;
</span> <span style="color: grey;">//全データの取得
</span> SelectPrices<span style="color: navy;">(</span>symb<span style="color: navy;">,</span>type_price<span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span>lastbar<span style="color: navy;">,</span>matricx_xt<span style="color: navy;">);
</span> <span style="color: grey;">/*確認用
for(i=0;i<lastbar;i++)
Print(
gsl_matrix_get(matricx_xt,i,0),":"
,gsl_matrix_get(matricx_xt,i,1),":"
,gsl_matrix_get(matricx_xt,i,2),":"
,gsl_matrix_get(matricx_xt,i,3),":"
,gsl_matrix_get(matricx_xt,i,4),":"
,gsl_matrix_get(matricx_xt,i,5),":"
,gsl_matrix_get(matricx_xt,i,6)
);
*/
</span> <span style="color: grey;">//重回帰分析用のデータの取得
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=(</span>lastbar<span style="color: navy;">-</span>N<span style="color: navy;">);</span>i<span style="color: navy;">></span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;">--){
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>i<span style="color: navy;">==</span> lastbar<span style="color: navy;">-</span>N <span style="color: navy;">||(</span><span style="color: magenta;">Time</span><span style="color: navy;">[</span>i<span style="color: navy;">]%</span><span style="color: green;">86400</span> <span style="color: navy;">==</span><span style="color: green;">0</span> <span style="color: navy;">&&</span> zeroset<span style="color: navy;">)){
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>j<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>j<span style="color: navy;"><</span>N<span style="color: navy;">;</span>j<span style="color: navy;">++){
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>q<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>q<span style="color: navy;"><</span>vcont<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">;</span>q<span style="color: navy;">++){
</span> date <span style="color: navy;">=</span> gsl_matrix_get<span style="color: navy;">(</span>matricx_xt<span style="color: navy;">,</span>i<span style="color: navy;">+</span>j<span style="color: navy;">,</span>q<span style="color: navy;">);
</span> gsl_matrix_set <span style="color: navy;">(</span>matricx_xa<span style="color: navy;">,</span>j<span style="color: navy;">,</span>q<span style="color: navy;">,</span>date<span style="color: navy;">);
</span> <span style="color: navy;">}
</span> <span style="color: navy;">}
</span> <span style="color: grey;">//重回帰分析
</span> Multiple_regression<span style="color: navy;">(</span>i<span style="color: navy;">,</span>N<span style="color: navy;">,</span>type_price<span style="color: navy;">,</span>matricx_xa<span style="color: navy;">,</span>ix<span style="color: navy;">);
</span> <span style="color: navy;">}
</span> line<span style="color: navy;">=</span><span style="color: green;">0.0</span><span style="color: navy;">;
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>q<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>q<span style="color: navy;"><=</span>vcont<span style="color: navy;">;</span>q<span style="color: navy;">++)</span>line <span style="color: navy;">+=</span> ix<span style="color: navy;">[</span>q<span style="color: navy;">]*</span>gsl_matrix_get<span style="color: navy;">(</span>matricx_xt<span style="color: navy;">,</span>i<span style="color: navy;">,</span>q<span style="color: navy;">);
</span> line1<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> line<span style="color: navy;">;
</span> <span style="color: navy;">}
</span> gsl_matrix_free<span style="color: navy;">(</span>matricx_xt<span style="color: navy;">);
</span> gsl_matrix_free<span style="color: navy;">(</span>matricx_xa<span style="color: navy;">);
</span> <span style="color: navy;">}</span><span style="color: blue;">else</span><span style="color: navy;">{
</span> i<span style="color: navy;">=</span><span style="color: magenta;">Bars</span><span style="color: navy;">-</span>counted_bars<span style="color: navy;">;
</span> <span style="color: blue;">while</span><span style="color: navy;">(</span>i<span style="color: navy;">>=</span><span style="color: green;">0</span><span style="color: navy;">){
</span> <span style="color: blue;">if</span><span style="color: navy;">((</span>ix<span style="color: navy;">[</span><span style="color: green;">0</span><span style="color: navy;">]==</span><span style="color: green;">0</span><span style="color: navy;">)||(</span><span style="color: magenta;">Time</span><span style="color: navy;">[</span>i<span style="color: navy;">]%</span><span style="color: green;">86400</span> <span style="color: navy;">==</span><span style="color: green;">0</span> <span style="color: navy;">&&</span> zeroset<span style="color: navy;">)){
</span> matricx_xn <span style="color: navy;">=</span> gsl_matrix_alloc<span style="color: navy;">(</span>N<span style="color: navy;">,</span> vcont<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">);
</span> SelectPrices<span style="color: navy;">(</span>symb<span style="color: navy;">,</span>type_price<span style="color: navy;">,</span>i<span style="color: navy;">,</span>N<span style="color: navy;">,</span>matricx_xn<span style="color: navy;">);
</span> Multiple_regression<span style="color: navy;">(</span>i<span style="color: navy;">,</span>N<span style="color: navy;">,</span>type_price<span style="color: navy;">,</span>matricx_xn<span style="color: navy;">,</span>ix<span style="color: navy;">);
</span> gsl_matrix_free<span style="color: navy;">(</span>matricx_xn<span style="color: navy;">);
</span> <span style="color: navy;">}</span>
line1<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> ix<span style="color: navy;">[</span><span style="color: green;">0</span><span style="color: navy;">];
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>s<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>s<span style="color: navy;"><</span>vcont<span style="color: navy;">;</span>s<span style="color: navy;">++){
</span> sym <span style="color: navy;">=</span> symb<span style="color: navy;">[</span>s<span style="color: navy;">];
</span> line1<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">+=</span> ix<span style="color: navy;">[</span>s<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]*</span><span style="color: green;">iMA</span><span style="color: navy;">(</span>sym<span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: green;">1</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: #333399;">MODE_SMA</span><span style="color: navy;">,</span>type_price<span style="color: navy;">,</span>i<span style="color: navy;">);
</span> <span style="color: navy;">}
</span> i<span style="color: navy;">--;
</span> <span style="color: navy;">}
</span> <span style="color: navy;">}
</span>
text <span style="color: navy;">=</span> <span style="color: teal;">"["</span><span style="color: navy;">+</span><span style="color: blueviolet;">Symbol</span><span style="color: navy;">()+</span><span style="color: teal;">"]f(x) =["</span><span style="color: navy;">+</span>ix<span style="color: navy;">[</span><span style="color: green;">0</span><span style="color: navy;">]</span> <span style="color: navy;">+</span><span style="color: teal;">"]"</span><span style="color: navy;">;
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>s<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>s<span style="color: navy;"><</span>vcont<span style="color: navy;">;</span>s<span style="color: navy;">++)</span> text <span style="color: navy;">=</span> text <span style="color: navy;">+</span> <span style="color: teal;">" + ["</span><span style="color: navy;">+</span>ix<span style="color: navy;">[</span>s<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]+</span><span style="color: teal;">"]*"</span><span style="color: navy;">+</span>symb<span style="color: navy;">[</span>s<span style="color: navy;">];
</span> text<span style="color: navy;">=</span> text <span style="color: navy;">+</span><span style="color: teal;">" 精度="</span><span style="color: navy;">+</span>ix<span style="color: navy;">[</span><span style="color: green;">7</span><span style="color: navy;">];
</span> <span style="color: blueviolet;">Comment</span><span style="color: navy;">(</span>text<span style="color: navy;">);
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|データの取得
//+------------------------------------------------------------------+
</span><span style="color: blue;">void</span> SelectPrices<span style="color: navy;">(</span><span style="color: blue;">string</span><span style="color: navy;">&</span> sym<span style="color: navy;">[],</span><span style="color: blue;">int</span> pricetype<span style="color: navy;">,</span><span style="color: blue;">int</span> index<span style="color: navy;">,</span><span style="color: blue;">int</span> range<span style="color: navy;">,</span><span style="color: blue;">int</span> matricx_handle<span style="color: navy;">){
</span> <span style="color: blue;">datetime</span> sytime<span style="color: navy;">;
</span> <span style="color: blue;">int</span> s<span style="color: navy;">,</span>i<span style="color: navy;">,</span>q<span style="color: navy;">,</span>t<span style="color: navy;">;
</span> <span style="color: blue;">double</span> price<span style="color: navy;">;
</span> <span style="color: grey;">//f(x) = a + b*x1+c*x2+.....g*x6
</span> <span style="color: grey;">//a
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span><span style="color: blue;">int</span> z<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>z<span style="color: navy;"><</span>range<span style="color: navy;">;</span>z<span style="color: navy;">++)</span>gsl_matrix_set <span style="color: navy;">(</span>matricx_handle<span style="color: navy;">,</span> z<span style="color: navy;">,</span> <span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: green;">1.0</span><span style="color: navy;">);
</span> <span style="color: grey;">//x1...x6
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>s<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>s<span style="color: navy;"><</span>vcont<span style="color: navy;">;</span>s<span style="color: navy;">++){
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>sym<span style="color: navy;">[</span>s<span style="color: navy;">]==</span><span style="color: teal;">""</span><span style="color: navy;">)</span><span style="color: blue;">break</span><span style="color: navy;">;
</span> SelectPrice_symb<span style="color: navy;">(</span>sym<span style="color: navy;">[</span>s<span style="color: navy;">],</span>s<span style="color: navy;">,</span>pricetype<span style="color: navy;">,</span>index<span style="color: navy;">,</span>range<span style="color: navy;">,</span>matricx_handle<span style="color: navy;">);
</span> <span style="color: navy;">}
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|データの取得(通貨ペア)
//+------------------------------------------------------------------+
</span><span style="color: blue;">void</span> SelectPrice_symb<span style="color: navy;">(</span><span style="color: blue;">string</span> symbl<span style="color: navy;">,</span><span style="color: blue;">int</span> symb_i<span style="color: navy;">,</span><span style="color: blue;">int</span> pricetype<span style="color: navy;">,</span><span style="color: blue;">int</span> index<span style="color: navy;">,</span><span style="color: blue;">int</span> range<span style="color: navy;">,</span><span style="color: blue;">int</span> matricx_h<span style="color: navy;">){
</span> <span style="color: blue;">datetime</span> sytime<span style="color: navy;">;
</span> <span style="color: blue;">int</span> q <span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">,</span>t<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span><span style="color: blue;">int</span> i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>range<span style="color: navy;">;</span>i<span style="color: navy;">++){
</span> sytime <span style="color: navy;">=</span> <span style="color: green;">iTime</span><span style="color: navy;">(</span>symbl<span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span>q<span style="color: navy;">+</span>i<span style="color: navy;">+</span>index<span style="color: navy;">);
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>t<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>t<span style="color: navy;"><</span><span style="color: green;">100</span><span style="color: navy;">;</span>t<span style="color: navy;">++)</span> <span style="color: navy;">{
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span><span style="color: magenta;">Time</span><span style="color: navy;">[</span>i<span style="color: navy;">+</span>index<span style="color: navy;">]>=</span>sytime<span style="color: navy;">)</span><span style="color: blue;">break</span><span style="color: navy;">;</span> <span style="color: blue;">else</span> q<span style="color: navy;">++;
</span> sytime <span style="color: navy;">=</span> <span style="color: green;">iTime</span><span style="color: navy;">(</span>symbl<span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span>q<span style="color: navy;">+</span>i<span style="color: navy;">+</span>index<span style="color: navy;">);
</span> <span style="color: navy;">}
</span> gsl_matrix_set <span style="color: navy;">(</span>matricx_h<span style="color: navy;">,</span> i<span style="color: navy;">,</span> symb_i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">,</span><span style="color: green;">iMA</span><span style="color: navy;">(</span>symbl<span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: green;">1</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: #333399;">MODE_SMA</span><span style="color: navy;">,</span>pricetype<span style="color: navy;">,</span>q<span style="color: navy;">+</span>i<span style="color: navy;">+</span>index<span style="color: navy;">));
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span><span style="color: magenta;">Time</span><span style="color: navy;">[</span>i<span style="color: navy;">+</span>index<span style="color: navy;">]</span> <span style="color: navy;">></span> sytime<span style="color: navy;">)</span>q<span style="color: navy;">--;
</span> <span style="color: navy;">}
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|重回帰分析
//+------------------------------------------------------------------+
</span><span style="color: blue;">void</span> Multiple_regression<span style="color: navy;">(</span><span style="color: blue;">int</span> index<span style="color: navy;">,</span><span style="color: blue;">int</span> range<span style="color: navy;">,</span><span style="color: blue;">int</span> type<span style="color: navy;">,</span><span style="color: blue;">int</span> matricx_xd<span style="color: navy;">,</span><span style="color: blue;">double</span> <span style="color: navy;">&</span> ans<span style="color: navy;">[]){
</span> <span style="color: blue;">int</span> matrix_cov<span style="color: navy;">,</span>vector_y<span style="color: navy;">,</span>vector_c<span style="color: navy;">,</span>multifit_work<span style="color: navy;">;
</span> <span style="color: blue;">int</span> i<span style="color: navy;">;
</span> <span style="color: blue;">double</span> chisq<span style="color: navy;">[</span><span style="color: green;">1</span><span style="color: navy;">];
</span> <span style="color: grey;">//f(x) = a + b*x1+c*x2+.....g*x6
</span> <span style="color: grey;">//作業領域の確保
</span> matrix_cov <span style="color: navy;">=</span> gsl_matrix_alloc<span style="color: navy;">(</span>vcont<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">,</span>vcont<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">);
</span> vector_y <span style="color: navy;">=</span> gsl_vector_alloc<span style="color: navy;">(</span>range<span style="color: navy;">);
</span> vector_c <span style="color: navy;">=</span> gsl_vector_alloc<span style="color: navy;">(</span>vcont<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">);
</span> multifit_work <span style="color: navy;">=</span> gsl_multifit_linear_alloc <span style="color: navy;">(</span>range<span style="color: navy;">,</span>vcont<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">);
</span> <span style="color: grey;">//y
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>range<span style="color: navy;">;</span>i<span style="color: navy;">++)</span>gsl_vector_set <span style="color: navy;">(</span>vector_y <span style="color: navy;">,</span> i<span style="color: navy;">,</span><span style="color: green;">iMA</span><span style="color: navy;">(</span><span style="color: #333399;">NULL</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: green;">1</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: #333399;">MODE_SMA</span><span style="color: navy;">,</span>type<span style="color: navy;">,</span>i<span style="color: navy;">+</span>index<span style="color: navy;">));
</span>
<span style="color: grey;">//処理
</span> multifit_work <span style="color: navy;">=</span> gsl_multifit_linear_alloc <span style="color: navy;">(</span>range<span style="color: navy;">,</span>vcont<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">);
</span> gsl_multifit_linear<span style="color: navy;">(</span>matricx_xd<span style="color: navy;">,</span>vector_y<span style="color: navy;">,</span>vector_c<span style="color: navy;">,</span>matrix_cov<span style="color: navy;">,</span>chisq<span style="color: navy;">,</span>multifit_work<span style="color: navy;">);
</span> gsl_multifit_linear_free <span style="color: navy;">(</span>multifit_work<span style="color: navy;">);
</span>
<span style="color: grey;">//結果の取得
</span> <span style="color: grey;">//ans[8] = {a,b,c,d....chisq}
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>vcont<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">;</span>i<span style="color: navy;">++)</span> ans<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> gsl_vector_get<span style="color: navy;">(</span>vector_c<span style="color: navy;">,</span>i<span style="color: navy;">);
</span> ans<span style="color: navy;">[</span><span style="color: green;">7</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> chisq<span style="color: navy;">[</span><span style="color: green;">0</span><span style="color: navy;">];
</span>
<span style="color: grey;">//メモリ解放
</span> gsl_matrix_free<span style="color: navy;">(</span>matrix_cov<span style="color: navy;">);
</span> gsl_vector_free<span style="color: navy;">(</span>vector_y<span style="color: navy;">);
</span> gsl_vector_free<span style="color: navy;">(</span>vector_c<span style="color: navy;">);
}
</span>
</span></pre>
<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com0tag:blogger.com,1999:blog-6027720561701794729.post-14724786596479322442013-08-18T00:34:00.001+09:002013-08-18T00:37:19.340+09:00Notepad++ de MQL4 (Function List 編) Notepad++v6.4からFunction List がデフォルトで追加され、MQL4でも使用できることが判りましたのでご報告します。※現在の最新版は、Notepad++v6.4.5です。詳細はこちらで、 <a href="http://notepad-plus-plus.org/features/function-list.html">Function List</a><br />
<a href="http://lh6.ggpht.com/--qARU-pJKqY/Ug-X6A_SULI/AAAAAAAAA4Y/bDpPKdonfAA/s1600-h/main%25255B4%25255D.png"><img alt="main" border="0" height="416" src="http://lh3.ggpht.com/-51l4lUYmhoQ/Ug-X60YcfQI/AAAAAAAAA4c/RDeeubBv9HU/main_thumb%25255B2%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="main" width="644" /></a> <br />
<br />
<br />
<h2>
【設定手順】</h2>
1.Notepad++の更新をする。(?--Notepad++のアップグレード)<br />
2.Notepad++がインストールされているディレクトリを開きfunctionList.xmlを開く。<br />
3.functionList.xmlの21行目あたりに以下のコードを追加する。<br />
<a href="http://lh4.ggpht.com/-sXitsZDWNh8/Ug-X7ZLLEFI/AAAAAAAAA4o/Zc2XhChbf9g/s1600-h/function%25255B7%25255D.png"><img alt="function" border="0" height="416" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2J-whq_4AKtti3sooJrVIKLOkkAlpQ7EcaDuYgx_5GNuwmxLUenECBuGutkd72glekpDr_dxOZ0YZ-O2QOj7tQLseb5RPG91cwNnQSvyO1SMwcEVsMuM-GzSqPGHscDnLKFQ80BO55SI/?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="function" width="644" /></a> <br />
<br />
/////////////////////////////////////////////////////////////////////////////////////////<br />
<association ext="mq4" id="c_cpp_function"/><br />
<association ext="mqh" id="c_cpp_function"/><br />
/////////////////////////////////////////////////////////////////////////////////////////<br />
※MQL4は、C語に似ているのでC語のparserをそのまま使用します。(手抜き^^;<br />
<br />
4.functionList.xmlを上書き保存し、notepad++を起動させ、MQL4のファイルを開き、Function List のアイコンをクリックし完了です。<br />
<br />
・・・・・とできればいいのですが。。。私はうまく作動しませんでした。これ以降は、そんな方用の説明です。<br />
5.以下のディレクトリに行き、functionList.xmlを開き上記と同じことを行う。<br />
WIN_XP:C:\Documents and Settings\...user...\Application Data\Notepad++<br />
WIN_7:C:\Users\...user...\AppData\Roaming\Notepad++ <br />
WIN_8:┐(´∀`)┌<br />
※以前のplug-in用Function Listの【FunctionList.ini or FunctionListRules.xml】などがあったら削除する。<br />
<br />
6.完了(これで私は作動しました。)<br />
<br />
<br />
【おまけ】<br />
現在使用しているハイライト用の設定ファイル(MQL4highlight.xml)と自動補完用の設定ファイル(mql4.xml)を添付しておきます。<a href="https://docs.google.com/file/d/0B42sh1xkCfgtczJxdVd0VVZiNGc/edit?usp=sharing">ココ</a>からDLしてください。<br />
自分が使いやすいように、ハイライトの色などは、変更してください。<a href="http://expertadviser-bighope.blogspot.jp/2012/10/notepad-de-mql4.html">参考</a><br />
前回からの変更点は、省略します。<忘れてしまいました^^;<br />
<br />
<br />
【気になる妄想】<br />
全く話は、変わりますがMQL4の大規模な変更が予定されているそうです。詳細は,<a href="http://www.softgate.co.jp/ja/resources/blog/item/20130725-mql4-ex4-upcoming-changes">Softgateさんの記事</a>を参照ください。<br />
この記事を読んでいろいろな妄想(願望)が湧いてきました。以下は私の妄想です。<br />
1.MQL4とMQL5のコンパイラが共通化される。となるとMQL4でデバッグが可能になるんじゃないの!<br />
2.MQL4がANISIからUnicodeに変更されるんじゃないの!<DLLはどうなるんだろう?<br />
3.MQL4がマルチスレッド化されるんじゃないの! <最適化の高速が期待できるよね!<br />
4.今年のATCが開催されないのは、これが原因じゃないの!<来年は。。。<br />
5.MQ社さんMQL5リリースの時みたいにバグが頻発するんじゃないの!<(*´・b・`*)シー<br />
などなど、MQL4の今後に期待しています。<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com1tag:blogger.com,1999:blog-6027720561701794729.post-74716182452926380172013-08-05T00:42:00.001+09:002013-08-05T00:57:24.309+09:00ロンドンコーリング手法の検証かなりご無沙汰しておりますが、久しぶりにブログを更新します^^;<br />
<a href="http://zai.diamond.jp/articles/-/149730">『誰もが結果が出せるロンドンコーリング手法をマネーパートナーズでやってみた【実践編】』</a>という記事を見て面白そうだったのでEAを作成し検証してみました。<br />
<h2>
コード化</h2>
本来は、OCO注文ですが、そこは、EAということで通常の発注形態です。<br />
<pre><span style="color: grey;">//+------------------------------------------------------------------+
//| London_Call.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
</span><span style="color: blue;">#property</span> <span style="color: blue;">copyright</span> <span style="color: teal;">"Copyright 2012, MetaQuotes Software Corp."
</span><span style="color: blue;">#property</span> <span style="color: blue;">link</span> <span style="color: teal;">"http://www.metaquotes.net"
</span><span style="color: blue;">extern</span> <span style="color: blue;">string</span> Pd_time <span style="color: navy;">=</span> <span style="color: teal;">"08:00"</span><span style="color: navy;">;</span><span style="color: grey;">//日本時間15時
</span><span style="color: blue;">extern</span> <span style="color: blue;">string</span> Start_time <span style="color: navy;">=</span> <span style="color: teal;">"14:00"</span><span style="color: navy;">;</span><span style="color: grey;">//日本時間21時(夏時間20時)
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> Week_index <span style="color: navy;">=</span> <span style="color: green;">0</span><span style="color: navy;">;</span> <span style="color: grey;">//0:all 1:月曜日 2:火曜日。。
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> Type_Order <span style="color: navy;">=</span> <span style="color: green;">1</span><span style="color: navy;">;</span><span style="color: grey;">//1:順張り 2:逆張り</span><span style="color: grey;">
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> Tp <span style="color: navy;">=</span> <span style="color: green;">100</span><span style="color: navy;">;</span><span style="color: grey;">//利食い値
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> Sl <span style="color: navy;">=</span> <span style="color: green;">100</span><span style="color: navy;">;</span><span style="color: grey;">//損切値
</span><span style="color: blue;">extern</span> <span style="color: blue;">double</span> lots <span style="color: navy;">=</span> <span style="color: green;">0.1</span><span style="color: navy;">;</span><span style="color: grey;">//ロット
</span><span style="color: blue;">int</span> magic <span style="color: navy;">=</span> <span style="color: green;">20120803</span> <span style="color: navy;">;</span><span style="color: grey;">//マジックNo
</span><span style="color: blue;">int</span> shour<span style="color: navy;">;
</span><span style="color: grey;">//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> init<span style="color: navy;">(){
</span> shour <span style="color: navy;">=</span> <span style="color: blueviolet;">TimeHour</span><span style="color: navy;">(</span><span style="color: blueviolet;">StrToTime</span><span style="color: navy;">(</span>Start_time<span style="color: navy;">));
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> start<span style="color: navy;">()</span> <span style="color: navy;">{
</span> <span style="color: blue;">static</span> <span style="color: blue;">bool</span> set <span style="color: navy;">=</span> <span style="color: blue;">false</span><span style="color: navy;">;
</span> <span style="color: blue;">int</span> index<span style="color: navy;">,</span>n<span style="color: navy;">;
</span> <span style="color: blue;">double</span> tpf<span style="color: navy;">,</span>spl<span style="color: navy;">,</span>hi<span style="color: navy;">,</span>lw<span style="color: navy;">;
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span><span style="color: blueviolet;">Hour</span><span style="color: navy;">()==</span><span style="color: green;">0</span><span style="color: navy;">)</span> set <span style="color: navy;">=</span> <span style="color: blue;">false</span><span style="color: navy;">;</span>
<span style="color: blue;">if</span><span style="color: navy;">(</span><span style="color: blueviolet;">Hour</span><span style="color: navy;">()</span> <span style="color: navy;"><</span> shour<span style="color: navy;">)</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span> <span style="color: blueviolet;">DayOfWeek</span><span style="color: navy;">()</span> <span style="color: navy;">!=</span> Week_index <span style="color: navy;">&&</span> Week_index <span style="color: navy;">!=</span><span style="color: green;">0</span><span style="color: navy;">)</span><span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);</span>
<span style="color: blue;">if</span><span style="color: navy;">(!</span>set<span style="color: navy;">){
</span> index <span style="color: navy;">=</span> <span style="color: green;">iBarShift</span><span style="color: navy;">(</span><span style="color: #333399;">NULL</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: blueviolet;">StrToTime</span><span style="color: navy;">(</span>Pd_time<span style="color: navy;">));
</span> n <span style="color: navy;">=</span> <span style="color: green;">iBarShift</span><span style="color: navy;">(</span><span style="color: #333399;">NULL</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: blueviolet;">StrToTime</span><span style="color: navy;">(</span>Start_time <span style="color: navy;">));
</span> hi <span style="color: navy;">=</span> <span style="color: magenta;">High</span><span style="color: navy;">[</span><span style="color: green;">iHighest</span><span style="color: navy;">(</span><span style="color: #333399;">NULL</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: #333399;">MODE_HIGH</span><span style="color: navy;">,</span>index<span style="color: navy;">,</span>n<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">)];
</span> lw <span style="color: navy;">=</span> <span style="color: magenta;">Low</span><span style="color: navy;">[</span><span style="color: green;">iLowest</span><span style="color: navy;">(</span><span style="color: #333399;">NULL</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: #333399;">MODE_LOW</span><span style="color: navy;">,</span>index<span style="color: navy;">,</span>n<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">)];
</span>
<span style="color: blue;">if</span><span style="color: navy;">(</span><span style="color: magenta;">High</span><span style="color: navy;">[</span><span style="color: green;">0</span><span style="color: navy;">]</span> <span style="color: navy;">></span> hi<span style="color: navy;">){
</span> <span style="color: blue;">switch</span><span style="color: navy;">(</span>Type_Order<span style="color: navy;">){
</span> <span style="color: blue;">case</span> <span style="color: green;">1</span> <span style="color: navy;">:</span><span style="color: grey;">//順張り
</span> OrderPosition<span style="color: navy;">(</span>magic<span style="color: navy;">,</span><span style="color: #333399;">OP_BUY</span><span style="color: navy;">,</span>lots<span style="color: navy;">,</span>Tp<span style="color: navy;">,</span>Sl<span style="color: navy;">);
</span> set <span style="color: navy;">=</span> <span style="color: blue;">true</span><span style="color: navy;">;
</span> <span style="color: blue;">break</span><span style="color: navy;">;
</span> <span style="color: blue;">case</span> <span style="color: green;">2</span><span style="color: navy;">:</span><span style="color: grey;">//逆張り
</span> OrderPosition<span style="color: navy;">(</span>magic<span style="color: navy;">,</span><span style="color: #333399;">OP_SELL</span><span style="color: navy;">,</span>lots<span style="color: navy;">,</span>Tp<span style="color: navy;">,</span>Sl<span style="color: navy;">);
</span> set <span style="color: navy;">=</span> <span style="color: blue;">true</span><span style="color: navy;">;
</span> <span style="color: blue;">break</span><span style="color: navy;">;
</span> <span style="color: blue;">default</span> <span style="color: navy;">:
</span> <span style="color: blueviolet;">Print</span><span style="color: navy;">(</span><span style="color: teal;">"typ_orderの設定が間違っています。"</span><span style="color: navy;">);
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: navy;">}
</span> <span style="color: navy;">}
</span>
<span style="color: blue;">if</span><span style="color: navy;">(</span>lw <span style="color: navy;">></span> <span style="color: magenta;">Low</span><span style="color: navy;">[</span><span style="color: green;">0</span><span style="color: navy;">]){
</span> <span style="color: blue;">switch</span><span style="color: navy;">(</span>Type_Order<span style="color: navy;">){
</span> <span style="color: blue;">case</span> <span style="color: green;">1</span> <span style="color: navy;">:</span><span style="color: grey;">//順張り
</span> OrderPosition<span style="color: navy;">(</span>magic<span style="color: navy;">,</span><span style="color: #333399;">OP_SELL</span><span style="color: navy;">,</span>lots<span style="color: navy;">,</span>Tp<span style="color: navy;">,</span>Sl<span style="color: navy;">);
</span> set <span style="color: navy;">=</span> <span style="color: blue;">true</span><span style="color: navy;">;
</span> <span style="color: blue;">break</span><span style="color: navy;">;
</span> <span style="color: blue;">case</span> <span style="color: green;">2</span><span style="color: navy;">:</span><span style="color: grey;">//逆張り
</span> OrderPosition<span style="color: navy;">(</span>magic<span style="color: navy;">,</span><span style="color: #333399;">OP_BUY</span><span style="color: navy;">,</span>lots<span style="color: navy;">,</span>Tp<span style="color: navy;">,</span>Sl<span style="color: navy;">);
</span> set <span style="color: navy;">=</span> <span style="color: blue;">true</span><span style="color: navy;">;
</span> <span style="color: blue;">break</span><span style="color: navy;">;
</span> <span style="color: blue;">default</span> <span style="color: navy;">:
</span> <span style="color: blueviolet;">Print</span><span style="color: navy;">(</span><span style="color: teal;">"typ_orderの設定が間違っています。"</span><span style="color: navy;">);
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: navy;">}
</span> <span style="color: navy;">}
</span> <span style="color: navy;">}
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
</span><span style="color: blue;">void</span> OrderPosition<span style="color: navy;">(</span><span style="color: blue;">int</span> MagicNumber<span style="color: navy;">,</span><span style="color: blue;">int</span> Type<span style="color: navy;">,</span><span style="color: blue;">double</span> Lots<span style="color: navy;">,</span><span style="color: blue;">double</span> TakeProfit<span style="color: navy;">,</span><span style="color: blue;">double</span> StopLoss<span style="color: navy;">){</span>
<span style="color: blue;">int</span> Ticket<span style="color: navy;">;
</span> <span style="color: blue;">double</span> price<span style="color: navy;">;
</span> <span style="color: blue;">int</span> Slippage <span style="color: navy;">=</span> <span style="color: green;">30</span><span style="color: navy;">;
</span> <span style="color: blue;">double</span> tkp<span style="color: navy;">,</span>spl<span style="color: navy;">;
</span>
<span style="color: blue;">switch</span><span style="color: navy;">(</span>Type<span style="color: navy;">){
</span> <span style="color: blue;">case</span> <span style="color: #333399;">OP_BUY</span><span style="color: navy;">:</span>
price <span style="color: navy;">=</span> <span style="color: magenta;">Ask</span><span style="color: navy;">;
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>TakeProfit<span style="color: navy;">></span><span style="color: green;">0</span><span style="color: navy;">)</span> tkp <span style="color: navy;">=</span> <span style="color: blueviolet;">NormalizeDouble</span><span style="color: navy;">(</span>TakeProfit<span style="color: navy;">*</span><span style="color: magenta;">Point</span><span style="color: navy;">+</span>price<span style="color: navy;">,</span><span style="color: magenta;">Digits</span><span style="color: navy;">);</span><span style="color: blue;">else</span> tkp <span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>StopLoss<span style="color: navy;">></span><span style="color: green;">0</span><span style="color: navy;">)</span> spl <span style="color: navy;">=</span> <span style="color: blueviolet;">NormalizeDouble</span><span style="color: navy;">(</span>price<span style="color: navy;">-</span>StopLoss<span style="color: navy;">*</span><span style="color: magenta;">Point</span><span style="color: navy;">,</span><span style="color: magenta;">Digits</span><span style="color: navy;">);</span> <span style="color: blue;">else</span> spl <span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;
</span> Ticket <span style="color: navy;">=</span> <span style="color: blueviolet;">OrderSend</span><span style="color: navy;">(</span><span style="color: blueviolet;">Symbol</span><span style="color: navy;">(),</span> <span style="color: #333399;">OP_BUY</span><span style="color: navy;">,</span> Lots<span style="color: navy;">,</span> price<span style="color: navy;">,</span> Slippage<span style="color: navy;">,</span>spl<span style="color: navy;">,</span>tkp<span style="color: navy;">,</span><span style="color: teal;">""</span><span style="color: navy;">,</span> MagicNumber<span style="color: navy;">,</span> <span style="color: green;">0</span><span style="color: navy;">,</span> <span style="color: #333399;">DodgerBlue</span><span style="color: navy;">);
</span> <span style="color: blue;">break</span><span style="color: navy;">;
</span>
<span style="color: blue;">case</span> <span style="color: #333399;">OP_SELL</span><span style="color: navy;">:
</span> price <span style="color: navy;">=</span> <span style="color: magenta;">Bid</span><span style="color: navy;">;
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>TakeProfit<span style="color: navy;">></span><span style="color: green;">0</span><span style="color: navy;">)</span> tkp <span style="color: navy;">=</span> <span style="color: blueviolet;">NormalizeDouble</span><span style="color: navy;">(</span>price<span style="color: navy;">-</span>TakeProfit<span style="color: navy;">*</span><span style="color: magenta;">Point</span><span style="color: navy;">,</span><span style="color: magenta;">Digits</span><span style="color: navy;">);</span><span style="color: blue;">else</span> tkp<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>StopLoss<span style="color: navy;">></span><span style="color: green;">0</span><span style="color: navy;">)</span> spl <span style="color: navy;">=</span> <span style="color: blueviolet;">NormalizeDouble</span><span style="color: navy;">(</span>price<span style="color: navy;">+</span>StopLoss<span style="color: navy;">*</span><span style="color: magenta;">Point</span><span style="color: navy;">,</span><span style="color: magenta;">Digits</span><span style="color: navy;">);</span> <span style="color: blue;">else</span> spl <span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;
</span> Ticket <span style="color: navy;">=</span> <span style="color: blueviolet;">OrderSend</span><span style="color: navy;">(</span><span style="color: blueviolet;">Symbol</span><span style="color: navy;">(),</span> <span style="color: #333399;">OP_SELL</span><span style="color: navy;">,</span> Lots<span style="color: navy;">,</span> price<span style="color: navy;">,</span> Slippage<span style="color: navy;">,</span>spl<span style="color: navy;">,</span>tkp<span style="color: navy;">,</span><span style="color: teal;">""</span><span style="color: navy;">,</span> MagicNumber<span style="color: navy;">,</span> <span style="color: green;">0</span><span style="color: navy;">,</span> <span style="color: #333399;">DeepPink</span><span style="color: navy;">);
</span> <span style="color: blue;">break</span><span style="color: navy;">;
</span> <span style="color: blue;">default</span><span style="color: navy;">:
</span> <span style="color: blueviolet;">Print</span><span style="color: navy;">(</span><span style="color: teal;">"????????"</span><span style="color: navy;">);
</span></pre>
レイアウトが崩れていますがご愛嬌で。。^^;<br />
<br />
<h2>
検証結果</h2>
テスト通貨ペア:EURUSD 期間 :5M スプレッド:1.0pips 期間2013/01/01~08/03<br />
サーバー:アルパリJPデモ <br />
順張り 利食値10pips 損切10pips(全曜日共通)<br />
逆張り 利食値8pips 損切値10pips(全曜日共通)<br />
<br />
月曜日順張り<br />
<a href="http://lh5.ggpht.com/-S8CTNUWwoSs/Uf52Osh486I/AAAAAAAAA1w/AgT7SPec2iY/s1600-h/11%25255B4%25255D.png"><img alt="11" border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWGjoajK0O-aQNu4zHCDN0eK7GgdMCrnpMv1Nwm7K1k-_6lcjtW5yul6F8dAsKGtRd4IKFUzMmLmZwqJJAbAqiBwrPvGJj-KXm2Lw2HQSTHbvKkFqZueo-kUmyqpqOC_NeFxAJvP3xy7E/?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="11" width="474" /></a> <br />
月曜日逆張り<br />
<a href="http://lh5.ggpht.com/-4fnvZnoBmPo/Uf52PiAIf_I/AAAAAAAAA2A/EpGsRISBkeU/s1600-h/12%25255B5%25255D.png"><img alt="12" border="0" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghqtcmuTOQY4vlt8yFqyDmU4Nn2PHxvFhdkG2OmJw3CQTzh0BgzvVINOOVDuU55VdNDZOjW_wO06Ny1fByw1nIAgnr0hyphenhyphenqnLLO8jd42NItwNI20MTB96FCYRHxa5nWwwqn-aVx-NRWels/?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="12" width="474" /></a> <br />
<br />
火曜日順張り<br />
<a href="http://lh4.ggpht.com/-bwQZXJLa7vw/Uf52QgijTSI/AAAAAAAAA2Q/_XBhUmYWDZo/s1600-h/21%25255B3%25255D.png"><img alt="21" border="0" height="120" src="http://lh5.ggpht.com/-am6qr26KI0g/Uf52RBw2CBI/AAAAAAAAA2Y/1N-UHyeTBzM/21_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="21" width="474" /></a> <br />
火曜日逆張り<br />
<a href="http://lh6.ggpht.com/-OMDYzisnnmQ/Uf52Rd-CmGI/AAAAAAAAA2g/OFOPdj8XfQs/s1600-h/22%25255B3%25255D.png"><img alt="22" border="0" height="120" src="http://lh3.ggpht.com/-RuAIxNI0HFQ/Uf52R0_payI/AAAAAAAAA2o/wnx1MvJsARs/22_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="22" width="474" /></a> <br />
<br />
水曜日順張り<br />
<a href="http://lh3.ggpht.com/-Y06co8Ncqpg/Uf52STd3UEI/AAAAAAAAA2w/oWWffrcIeBg/s1600-h/31%25255B3%25255D.png"><img alt="31" border="0" height="120" src="http://lh5.ggpht.com/-JSCmTe-tuYw/Uf52S9FLevI/AAAAAAAAA24/hiawHdi_yss/31_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="31" width="474" /></a> <br />
水曜日逆張り<br />
<a href="http://lh6.ggpht.com/-x8WZnre3OhY/Uf52TSKCyTI/AAAAAAAAA3A/sr_TEm4pnlA/s1600-h/32%25255B3%25255D.png"><img alt="32" border="0" height="120" src="http://lh4.ggpht.com/-kiKWqTcp6wY/Uf52TycqTAI/AAAAAAAAA3I/9MnndODOpPI/32_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="32" width="474" /></a> <br />
<br />
木曜日順張り<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWKBXhGkPrwPjgsXAXW02X7kTyjA4a8o-3IjSUQ_zY_wY-2EJwUh_Wz7gtFYoeJfL9hvLIPCxTwo2oSZLPdRjLGFF4uP5SWEY-M6KfWwZjV9efZP1Rz73sA5P3UjdZXAMAIrKDnt00LdI/s1600-h/41%25255B3%25255D.png"><img alt="41" border="0" height="120" src="http://lh3.ggpht.com/-kBHSU8RhsAw/Uf52U5gd2ZI/AAAAAAAAA3Y/L1-Cds3opuU/41_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="41" width="474" /></a> <br />
木曜日逆張り<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0uROCPb0LCok9c5M2rzGjOu0oObMNRICSFgEKo0O_6hHxWsRqFZtsBBFmns7or_6QC5pPH8DVNTU3P75VeLRqsDaykV07ous8dbUvQ7_P3b9AR708K9L5du9q9z-Jo3YJcEYRjWIy_S0/s1600-h/42%25255B3%25255D.png"><img alt="42" border="0" height="120" src="http://lh6.ggpht.com/-BHdEE5txiqU/Uf52V5gsMcI/AAAAAAAAA3k/j2JV3JKVrY4/42_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="42" width="474" /></a> <br />
<br />
金曜日順張り<br />
<a href="http://lh5.ggpht.com/-WDLsyTkG_5I/Uf52WT5x-5I/AAAAAAAAA3w/_6MdIIcKbE0/s1600-h/51%25255B3%25255D.png"><img alt="51" border="0" height="120" src="http://lh5.ggpht.com/-TZKtRd0gWiU/Uf52Wx6DDXI/AAAAAAAAA34/v9y31RReYc0/51_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="51" width="474" /></a> <br />
金曜日逆張り<br />
<a href="http://lh5.ggpht.com/-2Se0y05dAMA/Uf52XCnev-I/AAAAAAAAA4A/l0vJ-NMt1f8/s1600-h/52%25255B3%25255D.png"><img alt="52" border="0" height="120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0b7bQElbwW3QOxqq_kiEd3xANg4iFgbj21YHBO7hO7ezlO4wYziQSaCZVclgt8b_gG8vAXq74j8HEecqbW_DmfVVzRYT3R96yqSvrfjfTufm7ovSlQ394lQ-ZfZXRDkCrPVeJbatM9fU/?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="52" width="474" /></a> <br />
※今回の検証は、簡素化を図るため指標発表等を考慮していませんのでご注意ください。<br />
<br />
<h2>
まとめ</h2>
今回の検証では、思うような結果出ませんでした。どこか設計ミスがあるのかな?<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com3tag:blogger.com,1999:blog-6027720561701794729.post-85625194482247880972012-12-30T02:09:00.001+09:002012-12-30T02:09:04.380+09:00ATC2012が終わりました。<p>10月から開催されていたATC2012が終了しました。ということで、今回は、その後報告です。</p> <p> </p> <h2>結果報告</h2> <p>損益:▲5678.91$  PF0.44 で総合295位</p> <p>詳しくは以下を参照してください。</p> <p><a href="http://championship.mql5.com/2012/en/users/bighope"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="kekka" border="0" alt="kekka" src="http://lh5.ggpht.com/-HgBiPDPDC7A/UN8jh_h6IrI/AAAAAAAAAyc/iyg5Qq3C380/kekka%25255B3%25255D.png?imgmax=800" width="244" height="184" /></a> </p> <p>残念ながら今回も惨敗しました^^;</p> <p>日本人の方では、MrAwajiさんが48位と健闘され、10名中4名の方がプラスで大会を終了されています。</p> <p>詳しくは、<a href="http://championship.mql5.com/2012/en/users/index/page8?orderby=country&dir=up">ここ</a>を参照ください。</p> <p> </p> <h2>検証</h2> <p>せっかく大会に出たので、大会のトレードとMT5のストラージテスターがどれだけ異なるか確認してみました。</p> <p>まずは、損益グラフの確認です。</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXPR1ch9rn7njNs3gqWoWOSpmTOj9wYbW5flMTp9o1i7APgHfPIC9ThEFtFyIkk-59dbROXbvACyWFQjgtgoCeA5aQ8iX2OvbB_q1MflxmiXEjKORzpF9LYF4BvXYvJhERW5LdnvdgAto/s1600-h/seiseki%25255B3%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="seiseki" border="0" alt="seiseki" src="http://lh3.ggpht.com/-SeKLfvtQdMw/UN8jj5jw4DI/AAAAAAAAAys/riK3tqmJ23Y/seiseki_thumb%25255B1%25255D.png?imgmax=800" width="369" height="217" /></a> </p> <p>やはりストラージテスターとのズレがあるようです。</p> <p>約定時間を調べてみましたが、分単位まで完全に一致していましたので、約定金額を調べてみると以下の様な結果となりました。(データ区間は、pips単位で各数値は、パーセント形式に加工してあります。)</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRm9UEieznwRlYUevkS4IaI4bguoIPQzP1ndU5Iko-EGCKcFJTI0ucC6fUvYxeMJojL3hSPiMBB3qei_VolcQCKeT3-Wx5p1uNdLX-iGtRIq2pLx2fjVbbCaOmf9KNUwOdfllU3k-SJmI/s1600-h/sas%25255B3%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sas" border="0" alt="sas" src="http://lh6.ggpht.com/-_OdepWz7p_g/UN8jli0AjNI/AAAAAAAAAy4/7bAsKl38vWI/sas_thumb%25255B1%25255D.png?imgmax=800" width="399" height="298" /></a> </p> <p><a href="http://lh4.ggpht.com/-bFdUro39BBQ/UN8jmhSG6_I/AAAAAAAAAzA/kbmmXrVKLBY/s1600-h/sa%25255B3%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sa" border="0" alt="sa" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP2DbX2cWLFlvm_9s8yF9FpcA3AUus1YFOmoxiqHgCw55A0nJfo9kht9bDKkwCFIHGSqiBRVevpdLj4ryKKL8IONm2fYuvXZrq921z9faiR8uekjo5qlodTKUZaOeSeR2H2waUHKDFGcg/?imgmax=800" width="523" height="210" /></a> </p> <p> </p> <p></p> <p></p> <p>ストラージテスターとATC2012の約定差が発生しているのが図ります。これが、数秒差(分単位以下)の時間のズレか滑ったのが原因かは、解りません。しかし、前回までの大会と比べると飛躍的にストラージテスターとの整合性が取れていると思います。(私のEAがまともにできていたってことかな(・・?)</p> <p> </p> <h2>たられば</h2> <p>ココからは、単なる負け惜しみですのでご了承ください。</p> <p>今回のEAは、単純なBreakOut系のEAがロット調整でどこまでいけるかが課題だったので、その検証です。</p> <p>まずロット調整なしの損益グラフです。</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAGZS5cYeW4gzjofFymNkuR68duYqSb_yc5-r2ZY_ltAHDD2b0IT-J7bFTETj1krlo6WUhdTYj_514Nc_3CHFsVG74kzHy9WpKwZiL0TogdMx37zkawH0qA_M3CWi73gLyUV7SRQoB6-U/s1600-h/kote%25255B6%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="kote" border="0" alt="kote" src="http://lh5.ggpht.com/-MhWUSpxhKxc/UN8jpfpQh2I/AAAAAAAAAzY/iothFzHkvJQ/kote_thumb%25255B4%25255D.png?imgmax=800" width="535" height="195" /></a> </p> <p>PF1.09で辛うじてプラスとなっています。</p> <p>ロット調整を最適化してみると</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqQ6mWgwdYBxPQmtXN5jPzH8FOmyAua3dkfCaviGCo5gcuSqaQKa7D3FL2dEyavgJ8g9uPieybA9LPh4IZyCJhdLlNBurTlXtYUUeJbvuMpg1gS5M_0blDPJFpjx2L17YKRAfF10j1N0g/s1600-h/tes%25255B7%25255D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="tes" border="0" alt="tes" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTmQsTlQi0JOjPno6VFNLaZyj82AMbb0hL8kJQ1Rs3Pqr1pBXjtVnOq4kYG6fAgyx3aaX9grpeECAygYfu_A6eIDUhW1srGrBQ76QSdUrSMTQ-ahaiX81RnWF4GMLRli-2kv9LziYSN58/?imgmax=800" width="549" height="205" /></a> </p> <p> </p> <p></p> <p>120個のスイッチの内26個を変更した結果です。今回の正解率は、78%で惨敗したわけですw</p> <p> </p> <h2>まとめ</h2> <p>たらればの内容は、大会用のお遊びネタですよ。間違ってもリアルのトレードで使おうなどとは考えない方が得策です。どちらかといえば、悪徳EA販売業者が使う手口のような気がします。</p> <p>本年もいろいろありましたが、何とかすべて乗り越えることが出来ました。ゆっくり新年を迎えたいと思います。</p> <p>ATCに参加されたみなさんお疲れ様でした。また、来年もお目にかかれることを楽しみにしております。</p> <p>では^^;</p> <p>bighope</p> <div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com2tag:blogger.com,1999:blog-6027720561701794729.post-65128627739431673902012-10-30T00:45:00.001+09:002012-11-29T18:19:48.009+09:00続・相関係数<span style="color: red;">2012/10/30追記</span><br />
<a href="http://expertadviser-bighope.blogspot.jp/2012/10/blog-post.html">前回の内容</a>にて、相関係数は、計算コストが高すぎてリアルタイムで随時処理していくには不向きなものと記述しましたが、kartzさんからコメントを頂き、それが誤りであったことがわかりましたので記述します。<br />
内容は、私が説明するよりkartzさんのコメントを見て頂いた方が良いと思いますのでそちらをご覧ください。<br />
※正直完全に理解できたか疑問が残るというのが本音だったりしますが。。(汗<br />
<br />
<h2>
コード化</h2>
kartzさんのコメントをコード化すると以下の様になりました。<br />
<pre><span style="color: grey;">//+------------------------------------------------------------------+
//| 相関係数_i.mq4 |
//| Copyright 2012, MetaQuotes Software Corp.|
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
</span><span style="color: blue;">#property</span> <span style="color: blue;">copyright</span> <span style="color: teal;">"Copyright 2012, MetaQuotes Software Corp."
</span><span style="color: blue;">#property</span> <span style="color: blue;">link</span> <span style="color: teal;">"http://www.metaquotes.net"
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_separate_window
#property</span> <span style="color: blue;">indicator_buffers</span> <span style="color: green;">1
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_color1</span> <span style="color: #333399;">Yellow
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> pd <span style="color: navy;">=</span> <span style="color: green;">100</span><span style="color: navy;">;</span><span style="color: grey;">//期間
</span><span style="color: blue;">double</span> Sx<span style="color: navy;">[];</span> <span style="color: grey;">//S(x,a,b) := Σ[i=a~b; x[i]]: xの総和
</span><span style="color: blue;">double</span> Sy<span style="color: navy;">[];</span> <span style="color: grey;">//S(y,a,b) := Σ[i=a~b; y[i]]: yの総和
</span> <span style="color: grey;">//M(v,a,b) := S(v,a,b) / (b-a+1): 相加平均
</span><span style="color: blue;">double</span> Fxy<span style="color: navy;">[];</span><span style="color: grey;">//F(x,y,a,b) := Σ[i=a~b; (x[i] - M(x,a,b)) * (y[i] - M(y,a,b))]
</span><span style="color: blue;">double</span> Fxx<span style="color: navy;">[];</span><span style="color: grey;">//F(x,x,a,b) := Σ[i=a~b; (x[i] - M(x,a,b)) * (x[i] - M(y,a,b))]
</span><span style="color: blue;">double</span> Fyy<span style="color: navy;">[];</span><span style="color: grey;">//F(y,y,a,b) := Σ[i=a~b; (y[i] - M(x,a,b)) * (y[i] - M(y,a,b))]
</span><span style="color: blue;">double</span> p<span style="color: navy;">[];</span><span style="color: grey;">//相加係数
//+------------------------------------------------------------------+
// | Custom indicator initialization function |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> init<span style="color: navy;">()</span> <span style="color: navy;">{
</span><span style="color: grey;">//---- indicators
</span> <span style="color: blueviolet;">IndicatorBuffers</span><span style="color: navy;">(</span><span style="color: green;">6</span><span style="color: navy;">);
</span><span style="color: grey;">//---- drawing settings
</span> <span style="color: blueviolet;">SetIndexStyle</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: #333399;">DRAW_LINE</span><span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexStyle</span><span style="color: navy;">(</span><span style="color: green;">1</span><span style="color: navy;">,</span><span style="color: #333399;">DRAW_NONE</span><span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexStyle</span><span style="color: navy;">(</span><span style="color: green;">2</span><span style="color: navy;">,</span><span style="color: #333399;">DRAW_NONE</span><span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexStyle</span><span style="color: navy;">(</span><span style="color: green;">3</span><span style="color: navy;">,</span><span style="color: #333399;">DRAW_NONE</span><span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexStyle</span><span style="color: navy;">(</span><span style="color: green;">4</span><span style="color: navy;">,</span><span style="color: #333399;">DRAW_NONE</span><span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexStyle</span><span style="color: navy;">(</span><span style="color: green;">5</span><span style="color: navy;">,</span><span style="color: #333399;">DRAW_NONE</span><span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexBuffer</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">,</span>p<span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexBuffer</span><span style="color: navy;">(</span><span style="color: green;">1</span><span style="color: navy;">,</span>Sx<span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexBuffer</span><span style="color: navy;">(</span><span style="color: green;">2</span><span style="color: navy;">,</span>Sy<span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexBuffer</span><span style="color: navy;">(</span><span style="color: green;">3</span><span style="color: navy;">,</span>Fxy<span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexBuffer</span><span style="color: navy;">(</span><span style="color: green;">4</span><span style="color: navy;">,</span>Fxx<span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexBuffer</span><span style="color: navy;">(</span><span style="color: green;">5</span><span style="color: navy;">,</span>Fyy<span style="color: navy;">);
</span><span style="color: grey;">//----
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|初期値計算 |
//+------------------------------------------------------------------+
</span> <span style="color: blue;">void</span> Base<span style="color: navy;">(</span><span style="color: blue;">int</span> index <span style="color: grey;">//開始位置
</span> <span style="color: navy;">,</span><span style="color: blue;">int</span> range <span style="color: grey;">//適用範囲
</span> <span style="color: navy;">,</span><span style="color: blue;">double</span> <span style="color: navy;">&</span>S_x<span style="color: navy;">[]</span> <span style="color: grey;">//Sx[];
</span> <span style="color: navy;">,</span><span style="color: blue;">double</span> <span style="color: navy;">&</span>S_y<span style="color: navy;">[]</span> <span style="color: grey;">//Sy[];
</span> <span style="color: navy;">,</span><span style="color: blue;">double</span> <span style="color: navy;">&</span>F_xy<span style="color: navy;">[]</span> <span style="color: grey;">//Fxy[];
</span> <span style="color: navy;">,</span><span style="color: blue;">double</span> <span style="color: navy;">&</span>F_xx<span style="color: navy;">[]</span> <span style="color: grey;">//Fx[];
</span> <span style="color: navy;">,</span><span style="color: blue;">double</span> <span style="color: navy;">&</span>F_yy<span style="color: navy;">[]</span> <span style="color: grey;">//Fy[];
</span> <span style="color: navy;">){
</span>
<span style="color: blue;">int</span> i<span style="color: navy;">;
</span> <span style="color: blue;">double</span> x<span style="color: navy;">,</span>y<span style="color: navy;">,</span>avx<span style="color: navy;">,</span>avy<span style="color: navy;">,</span>sigxy<span style="color: navy;">,</span>sigx<span style="color: navy;">,</span>sigy<span style="color: navy;">;
</span>
<span style="color: grey;">//x.yの相加平均
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span>range<span style="color: navy;">;</span>i<span style="color: navy;">></span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;">--){
</span> <span style="color: grey;">//xの加算
</span> avx <span style="color: navy;">+=</span> <span style="color: magenta;">High</span><span style="color: navy;">[</span>index<span style="color: navy;">+</span>i<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">-</span> <span style="color: magenta;">Low</span><span style="color: navy;">[</span>index<span style="color: navy;">+</span>i<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">];
</span> <span style="color: grey;">//yの加算
</span> avy <span style="color: navy;">+=</span> <span style="color: magenta;">Volume</span><span style="color: navy;">[</span>index<span style="color: navy;">+</span>i<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">];
</span> <span style="color: navy;">}
</span> avx <span style="color: navy;">/=</span>range<span style="color: navy;">;
</span> avy <span style="color: navy;">/=</span>range<span style="color: navy;">;
</span>
<span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span>range<span style="color: navy;">;</span>i<span style="color: navy;">></span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;">--){
</span> x <span style="color: navy;">=</span> <span style="color: magenta;">High</span><span style="color: navy;">[</span>index<span style="color: navy;">+</span>i<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">-</span> <span style="color: magenta;">Low</span><span style="color: navy;">[</span>index<span style="color: navy;">+</span>i<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">];
</span> y <span style="color: navy;">=</span> <span style="color: magenta;">Volume</span><span style="color: navy;">[</span>index<span style="color: navy;">+</span>i<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">];
</span> sigxy <span style="color: navy;">+=</span> <span style="color: navy;">(</span>x<span style="color: navy;">-</span>avx<span style="color: navy;">)*(</span>y<span style="color: navy;">-</span>avy<span style="color: navy;">);
</span> sigx <span style="color: navy;">+=</span> <span style="color: navy;">(</span>x<span style="color: navy;">-</span>avx<span style="color: navy;">)*(</span>x<span style="color: navy;">-</span>avx<span style="color: navy;">);
</span> sigy <span style="color: navy;">+=</span> <span style="color: navy;">(</span>y<span style="color: navy;">-</span>avy<span style="color: navy;">)*(</span>y<span style="color: navy;">-</span>avy<span style="color: navy;">);
</span> <span style="color: navy;">}
</span> S_x<span style="color: navy;">[</span>index<span style="color: navy;">]</span> <span style="color: navy;">=</span> avx<span style="color: navy;">*</span>range<span style="color: navy;">;
</span> S_y<span style="color: navy;">[</span>index<span style="color: navy;">]</span> <span style="color: navy;">=</span> avy<span style="color: navy;">*</span>range<span style="color: navy;">;
</span> F_xy<span style="color: navy;">[</span>index<span style="color: navy;">]</span> <span style="color: navy;">=</span> sigxy<span style="color: navy;">;
</span> F_xx<span style="color: navy;">[</span>index<span style="color: navy;">]</span> <span style="color: navy;">=</span> sigx<span style="color: navy;">;
</span> F_yy<span style="color: navy;">[</span>index<span style="color: navy;">]</span> <span style="color: navy;">=</span> sigy<span style="color: navy;">;
}
</span>
<span style="color: grey;">//+------------------------------------------------------------------+
//|相関係数 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> start<span style="color: navy;">(){
</span> <span style="color: blue;">double</span> x<span style="color: navy;">,</span>y<span style="color: navy;">,</span>xn<span style="color: navy;">,</span>yn<span style="color: navy;">;
</span> <span style="color: blue;">int</span> counted_bars<span style="color: navy;">=</span><span style="color: blueviolet;">IndicatorCounted</span><span style="color: navy;">();
</span> <span style="color: blue;">int</span> limit<span style="color: navy;">=</span><span style="color: magenta;">Bars</span><span style="color: navy;">-</span>counted_bars <span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">;<span style="color: red;">//2012/10/30変更</span>
</span> <span style="color: grey;">//初期設定
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>counted_bars<span style="color: navy;"><=</span><span style="color: green;">0</span><span style="color: navy;">){
</span> limit -=pd;<span style="color: red;">//2012/10/30追記</span></pre>
<pre> Base<span style="color: navy;">(</span>limit<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">,</span>pd<span style="color: navy;">,</span>Sx<span style="color: navy;">,</span>Sy<span style="color: navy;">,</span>Fxy<span style="color: navy;">,</span>Fxx<span style="color: navy;">,</span>Fyy<span style="color: navy;">);
</span> p<span style="color: navy;">[</span>limit<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> Fxy<span style="color: navy;">[</span>limit<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]/</span><span style="color: blueviolet;">MathSqrt</span><span style="color: navy;">(</span>Fxx<span style="color: navy;">[</span>limit<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]*</span>Fyy<span style="color: navy;">[</span>limit<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]);
</span> <span style="color: navy;">}
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span><span style="color: blue;">int</span> i<span style="color: navy;">=</span>limit<span style="color: navy;">;</span> i<span style="color: navy;">>=</span><span style="color: green;">0</span><span style="color: navy;">;</span> i<span style="color: navy;">--){
</span> <span style="color: grey;">//追加項
</span> x <span style="color: navy;">=</span> <span style="color: magenta;">High</span><span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">-</span> <span style="color: magenta;">Low</span><span style="color: navy;">[</span>i<span style="color: navy;">];
</span> y <span style="color: navy;">=</span> <span style="color: magenta;">Volume</span><span style="color: navy;">[</span>i<span style="color: navy;">];</span></pre>
<pre><span style="color: navy;"> </span><span style="color: grey;">//削除項<span style="color: red;"><span style="color: grey;">(</span>2012/10/30変更<span style="color: grey;">)</span></span></span> </pre>
<pre> xn <span style="color: navy;">=</span> <span style="color: magenta;">High</span><span style="color: navy;">[</span>i<span style="color: navy;">+</span>pd<span style="color: navy;">]</span> <span style="color: navy;">-</span> <span style="color: magenta;">Low</span><span style="color: navy;">[</span>i<span style="color: navy;">+</span>pd<span style="color: navy;">];<span style="color: red;">//変更前</span></span><span style="color: navy;"><span style="color: red;"> xn= High[i+pd+1] - Low[i+pd+1];</span>
</span> yn <span style="color: navy;">=</span> <span style="color: magenta;">Volume</span><span style="color: navy;">[</span>i<span style="color: navy;">+</span>pd<span style="color: navy;">]; <span style="color: red;">//変更前 </span></span><span style="color: navy;"><span style="color: red;"> yn= Volume[i+pd+1];</span>
</span> <span style="color: grey;">//総和の更新
</span> Sx<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> Sx<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">+</span> x <span style="color: navy;">-</span>xn<span style="color: navy;">;
</span> Sy<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> Sy<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">+</span> y <span style="color: navy;">-</span> yn<span style="color: navy;">;
</span> <span style="color: grey;">//F項の更新
</span> Fxy<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> Fxy<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">+</span> <span style="color: navy;">(</span>Sx<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]*</span>Sy<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">-</span> Sx<span style="color: navy;">[</span>i<span style="color: navy;">]*</span>Sy<span style="color: navy;">[</span>i<span style="color: navy;">])/</span>pd <span style="color: navy;">-</span> xn<span style="color: navy;">*</span>yn <span style="color: navy;">+</span>x<span style="color: navy;">*</span>y<span style="color: navy;">;
</span> Fxx<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> Fxx<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">+</span> <span style="color: navy;">(</span>Sx<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]*</span>Sx<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">-</span> Sx<span style="color: navy;">[</span>i<span style="color: navy;">]*</span>Sx<span style="color: navy;">[</span>i<span style="color: navy;">])/</span>pd <span style="color: navy;">-</span> xn<span style="color: navy;">*</span>xn <span style="color: navy;">+</span>x<span style="color: navy;">*</span>x<span style="color: navy;">;
</span> Fyy<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> Fyy<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">+</span> <span style="color: navy;">(</span>Sy<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]*</span>Sy<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">-</span> Sy<span style="color: navy;">[</span>i<span style="color: navy;">]*</span>Sy<span style="color: navy;">[</span>i<span style="color: navy;">])/</span>pd <span style="color: navy;">-</span> yn<span style="color: navy;">*</span>yn <span style="color: navy;">+</span> y<span style="color: navy;">*</span>y<span style="color: navy;">;
</span> <span style="color: grey;">//相関係数
</span> p<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> Fxy<span style="color: navy;">[</span>i<span style="color: navy;">]/</span><span style="color: blueviolet;">MathSqrt</span><span style="color: navy;">(</span>Fxx<span style="color: navy;">[</span>i<span style="color: navy;">]*</span>Fyy<span style="color: navy;">[</span>i<span style="color: navy;">]);
</span> <span style="color: navy;">}
</span><span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
}
</span> </pre>
<br />
<h2>
表示・確認</h2>
従来の計算方法で求めた結果を赤線で表示させ、今回の計算結果を黄線で重ね合わせてみました。<br />
(変更前) <br />
<a href="http://lh4.ggpht.com/-AePHM_9LsjE/UI6kk9bKRuI/AAAAAAAAAwc/-Cvi7OSnUyw/s1600-h/photo%25255B3%25255D.png"><img alt="photo" border="0" height="257" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvpIjwFZxS4qregX9OMNfttC1qxiYdtM5-2SuPGcxuOufFYJMhXYAd03H3pgQp2PRv7pSlFfSy7Ob8gLsTyFalObp0AiO_6EvzeeWJXY39dkuiUgjnLBYJBHWkOZ_FJ-DgCCvME9HCTgA/?imgmax=800" style="border-color: -moz-use-text-color; border-style: none; border-width: 0px; display: inline;" title="photo" width="400" /></a> <br />
<br />
<br />
(変更後)※わかりやすくするために従来の計算方法を途中で終了させています。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF8LrOJJ2HKFr2Ej9-hZBQLbDWS8q6b8BFo_HyR-r6cIjIdaxx66IdKg5S9eeUjWeqgdDYMC4j4hVN8dIDMT8UCmvoQdHwGgA5Re83qMrqd6ShOcZ6yCENmzneErOZ81R6m28asALWmxY/s1600/photo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF8LrOJJ2HKFr2Ej9-hZBQLbDWS8q6b8BFo_HyR-r6cIjIdaxx66IdKg5S9eeUjWeqgdDYMC4j4hVN8dIDMT8UCmvoQdHwGgA5Re83qMrqd6ShOcZ6yCENmzneErOZ81R6m28asALWmxY/s640/photo.png" width="640" /></a></div>
<br />
<h2>
</h2>
<h2>
まとめ</h2>
この方法なら、随時処理しても十分に使用できます。また、一つ勉強になりました。kartzさんありがとうございました。<br />
//2012/10/30追記<br />
kartzさんから指摘して頂いた、【削除項】の変更の結果、ほぼ一致したラインを作ることが出来ました。<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com9tag:blogger.com,1999:blog-6027720561701794729.post-75620428994791282642012-10-27T21:21:00.001+09:002012-10-30T00:49:10.477+09:00忘却型相関係数 <span style="color: red;">2012/10/29修正しました。</span><strike><br /></strike><br />
<strike>相関係数は、非常に計算コストの高い関数で、私の様な非力なPCを使っている者にとっては、リアルタイムで随時処理していくには不向きなものだと思っています。ということで、近似関数を用いて相関係数の計算コスト削減を行ってみました。</strike><br />
<br />
<h2>
変換</h2>
まずは、相関係数の公式の確認です。対象となるデータをxとyとし期間をnとすると以下のようになります。<br />
<a href="http://lh5.ggpht.com/-cAOQJqF9LwM/UIvRsVFMMXI/AAAAAAAAAuU/KEPyha2zCjw/s1600-h/soukans%25255B4%25255D.png"><img alt="soukans" border="0" height="114" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFfqDexBlp1FOlcWvGlDRxB5XHMKoX3iE8IDu-U6ndc1ySfuu567DocN0acXLR2376cPCjLbUEtzVarNNheZcQDB8ivVBcGvas_lTdQCfzaPSHxuvlVQwdtE1UL-e03dX_qid_mPuGrG8/?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="soukans" width="285" /></a> <br />
この公式の分母と分子にそれぞれ1/nを乗算すると、以下のようになります。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBd_5tQN9UvslaE7Hrq6CI2mjg1raosH-54D9Sz2wdOzUfxt-lABmOO3vZITprTALJUCzyzMJbxuyzJm_YSsOxazAVityF0S-2GBwnt8dCr3g2BASBoQYwkT7W2B-Dg2WQ9S8IjrXiCAA/s1600-h/soukann%25255B4%25255D.png"><img alt="soukann" border="0" height="118" src="http://lh6.ggpht.com/-T--eopnqJIM/UIvRvUqZMaI/AAAAAAAAAus/yncDi-9S6mY/soukann_thumb%25255B2%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="soukann" width="288" /></a> <br />
ここで、各項を見ると相加平均であるのがわかります。そこで、見慣れた記号SMAに置き換えて見ると<br />
<a href="http://lh5.ggpht.com/-9-SICo2CFAQ/UIvRwayYmtI/AAAAAAAAAu0/ZKCH4UXJ6yI/s1600-h/soukanm%25255B4%25255D.png"><img alt="soukanm" border="0" height="79" src="http://lh6.ggpht.com/-oYdJNsyEmEY/UIvRxZOlrxI/AAAAAAAAAu8/TXJ_u1k9qDc/soukanm_thumb%25255B2%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="soukanm" width="292" /></a> <br />
となります。そこで、SMAをEMAで置き換えると(近似させると)、<br />
<a href="http://lh4.ggpht.com/-3K1wSfdXSHs/UIvRyiYOOSI/AAAAAAAAAvE/e_Na9c8GUkg/s1600-h/soukane%25255B4%25255D.png"><img alt="soukane" border="0" height="78" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpYOcSg8wS6o8wg0YGK1YRhZeNRwGNFxjNwPkav9861ejMiFY6PHGGjDC4asOzNfPjtRIZnvo3OayNJcY1Thi-4qqOq6pAfRwDjyQZYRIVDO-X8pICtV144Boa7s8qLUwfSUO-w8z1-ck/?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="soukane" width="290" /></a> <br />
となり、EMAの公式を当てはめると以下のようになります。<br />
<a href="http://lh3.ggpht.com/-OOPJS_WfFrE/UIvR0lLNnnI/AAAAAAAAAvU/pTy1dmdpjYo/s1600-h/susiki%25255B4%25255D.png"><img alt="susiki" border="0" height="125" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8FbgG0L0rGnNQrSJcaeRxHBZCV2hGntXmtAORZK1WNPBd-oTtFfLCot6gGcZuapeo9eif9CWf1W4OtSgBYAuR5eZuLCr0BQLIhBsxXWIG3xtckW_S6sM6WkMKE3Ust5vxyBeCecws65g/?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="susiki" width="339" /></a> <br />
これで忘却型相関係数の完成です。<br />
<br />
<h2>
確認作業</h2>
本来の相関係数と忘却型相関係数をコードにすると以下のようになります。 <br />(※以下のコードは、値幅とティックボリュームの相関関係を求める場合です。)<br />
<pre><span style="color: grey;">//+------------------------------------------------------------------+
//|相関係数 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> start<span style="color: navy;">(){
</span> <span style="color: blue;">double</span> x<span style="color: navy;">,</span>y<span style="color: navy;">,</span>avx<span style="color: navy;">,</span>avy<span style="color: navy;">,</span>sigxy<span style="color: navy;">,</span>sigx<span style="color: navy;">,</span>sigy<span style="color: navy;">;
</span> <span style="color: blue;">int</span> i<span style="color: navy;">,</span>q<span style="color: navy;">;
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span>limit<span style="color: navy;">;</span> i<span style="color: navy;">>=</span><span style="color: green;">0</span><span style="color: navy;">;</span> i<span style="color: navy;">--){
</span> <span style="color: grey;">// x:(High[i] - Low[i]) y:Volume[i];
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>q<span style="color: navy;">=</span>pd<span style="color: navy;">;</span>q<span style="color: navy;">></span><span style="color: green;">0</span><span style="color: navy;">;</span>q<span style="color: navy;">--){
</span> <span style="color: grey;">//xの加算
</span> avx <span style="color: navy;">+=</span> <span style="color: magenta;">High</span><span style="color: navy;">[</span>i<span style="color: navy;">+</span>q<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">-</span> <span style="color: magenta;">Low</span><span style="color: navy;">[</span>i<span style="color: navy;">+</span>q<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">];
</span> <span style="color: grey;">//yの加算
</span> avy <span style="color: navy;">+=</span> <span style="color: magenta;">Volume</span><span style="color: navy;">[</span>i<span style="color: navy;">+</span>q<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">];
</span> <span style="color: navy;">}
</span> <span style="color: grey;">//x.yの相加平均
</span> avx <span style="color: navy;">/=</span>pd<span style="color: navy;">;
</span> avy <span style="color: navy;">/=</span>pd<span style="color: navy;">;
</span>
<span style="color: grey;">//変数の初期化
</span> sigxy <span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;
</span> sigx <span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;
</span> sigy <span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;
</span>
<span style="color: blue;">for</span><span style="color: navy;">(</span>q<span style="color: navy;">=</span>pd<span style="color: navy;">;</span>q<span style="color: navy;">></span><span style="color: green;">0</span><span style="color: navy;">;</span>q<span style="color: navy;">--){
</span> x <span style="color: navy;">=</span> <span style="color: magenta;">High</span><span style="color: navy;">[</span>i<span style="color: navy;">+</span>q<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">-</span> <span style="color: magenta;">Low</span><span style="color: navy;">[</span>i<span style="color: navy;">+</span>q<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">];
</span> y <span style="color: navy;">=</span> <span style="color: magenta;">Volume</span><span style="color: navy;">[</span>i<span style="color: navy;">+</span>q<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">];
</span> sigxy <span style="color: navy;">+=</span> <span style="color: navy;">(</span>x<span style="color: navy;">-</span>avx<span style="color: navy;">)*(</span>y<span style="color: navy;">-</span>avy<span style="color: navy;">);
</span> sigx <span style="color: navy;">+=</span> <span style="color: navy;">(</span>x<span style="color: navy;">-</span>avx<span style="color: navy;">)*(</span>x<span style="color: navy;">-</span>avx<span style="color: navy;">);
</span> sigy <span style="color: navy;">+=</span> <span style="color: navy;">(</span>y<span style="color: navy;">-</span>avy<span style="color: navy;">)*(</span>y<span style="color: navy;">-</span>avy<span style="color: navy;">);
</span> <span style="color: navy;">}
</span> cn<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> sigxy<span style="color: navy;">/(</span><span style="color: blueviolet;">MathSqrt</span><span style="color: navy;">(</span>sigx<span style="color: navy;">)*</span><span style="color: blueviolet;">MathSqrt</span><span style="color: navy;">(</span>sigy<span style="color: navy;">));
</span>
<span style="color: navy;">}
</span><span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
}
</span>
</pre>
<pre><span style="color: grey;">//+------------------------------------------------------------------+
//|忘却型相関係数 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> start<span style="color: navy;">(){
</span> <span style="color: blue;">double</span> x<span style="color: navy;">,</span>y<span style="color: navy;">;
</span> <span style="color: blue;">int</span> counted_bars<span style="color: navy;">=</span><span style="color: blueviolet;">IndicatorCounted</span><span style="color: navy;">();
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>counted_bars<span style="color: navy;">></span><span style="color: green;">0</span><span style="color: navy;">)</span> counted_bars<span style="color: navy;">--;
</span> <span style="color: blue;">int</span> limit<span style="color: navy;">=</span><span style="color: magenta;">Bars</span><span style="color: navy;">-</span>counted_bars<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">;
</span>
<span style="color: blue;">for</span><span style="color: navy;">(</span><span style="color: blue;">int</span> i<span style="color: navy;">=</span>limit<span style="color: navy;">;</span> i<span style="color: navy;">>=</span><span style="color: green;">0</span><span style="color: navy;">;</span> i<span style="color: navy;">--){
</span> x <span style="color: navy;">=</span> <span style="color: magenta;">High</span><span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">-</span> <span style="color: magenta;">Low</span><span style="color: navy;">[</span>i<span style="color: navy;">];
</span> y <span style="color: navy;">=</span> <span style="color: magenta;">Volume</span><span style="color: navy;">[</span>i<span style="color: navy;">];
</span> avx<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> <span style="color: navy;">(</span><span style="color: green;">1</span><span style="color: navy;">-</span>alfa<span style="color: navy;">)*</span>avx<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">+</span> alfa<span style="color: navy;">*</span>x<span style="color: navy;">;
</span> avy<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> <span style="color: navy;">(</span><span style="color: green;">1</span><span style="color: navy;">-</span>alfa<span style="color: navy;">)*</span>avy<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">+</span> alfa<span style="color: navy;">*</span>y<span style="color: navy;">;
</span> sigxy<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> <span style="color: navy;">(</span><span style="color: green;">1</span><span style="color: navy;">-</span>alfa<span style="color: navy;">)*</span>sigxy<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">+</span> alfa<span style="color: navy;">*(</span>x<span style="color: navy;">-</span>avx<span style="color: navy;">[</span>i<span style="color: navy;">])*(</span>y<span style="color: navy;">-</span>avy<span style="color: navy;">[</span>i<span style="color: navy;">]);</span>
sigx<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> <span style="color: navy;">(</span><span style="color: green;">1</span><span style="color: navy;">-</span>alfa<span style="color: navy;">)*</span>sigx<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">+</span> alfa<span style="color: navy;">*(</span>x<span style="color: navy;">-</span>avx<span style="color: navy;">[</span>i<span style="color: navy;">])*(</span>x<span style="color: navy;">-</span>avx<span style="color: navy;">[</span>i<span style="color: navy;">]);
</span> sigy<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> <span style="color: navy;">(</span><span style="color: green;">1</span><span style="color: navy;">-</span>alfa<span style="color: navy;">)*</span>sigy<span style="color: navy;">[</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">+</span> alfa<span style="color: navy;">*(</span>y<span style="color: navy;">-</span>avy<span style="color: navy;">[</span>i<span style="color: navy;">])*(</span>y<span style="color: navy;">-</span>avy<span style="color: navy;">[</span>i<span style="color: navy;">]);
</span> <span style="color: grey;">//忘却型相関係数
</span> cn<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> sigxy<span style="color: navy;">[</span>i<span style="color: navy;">]/(</span><span style="color: blueviolet;">MathSqrt</span><span style="color: navy;">(</span>sigx<span style="color: navy;">[</span>i<span style="color: navy;">])*</span><span style="color: blueviolet;">MathSqrt</span><span style="color: navy;">(</span>sigy<span style="color: navy;">[</span>i<span style="color: navy;">]));
</span> <span style="color: navy;">}
</span><span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
}
</span>
</pre>
チャート上で確認すると,このようになります。<br />
<a href="http://lh6.ggpht.com/-2f0cW6Y3SwA/UIvR3fK5aiI/AAAAAAAAAvk/PlTfjQJ0swE/s1600-h/soukan%25255B3%25255D.png"><img alt="soukan" border="0" height="244" src="http://lh6.ggpht.com/-pEU_3DqHldQ/UIvR4bjJ_0I/AAAAAAAAAvs/MTKCRzYDD7E/soukan_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="soukan" width="374" /></a> <br />
※チャート上のMAは、それそれの適用期間に合わせたSMAとEMAです。
<br />※上記のサンプルを<a href="https://docs.google.com/open?id=0B42sh1xkCfgtcHJqN0NXejNfVE0">ココ</a>に置いておきますので確認してみてください。<br />
<br />
<h2>
まとめ</h2>
本来、EMAは、忘却性能と逐次性能が有り、逐次型とか指数平均型とかのネーミングが良いのでしょうが、忘却という響きが好きで、忘却型としました。また、今回は、わかりやすいようにバッファを多用しましたが、1つ前の値しか使用しないので変数(static)で十分対応できます。<br />
ChangeFinder、SDARモデルなどで検索すると、この手法の発展系を見ることが出来ます。<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com7tag:blogger.com,1999:blog-6027720561701794729.post-3823285681475786782012-10-13T23:37:00.001+09:002012-10-13T23:39:19.221+09:00Notepad++ de MQL5<a href="http://notepad-plus-plus.org/news/notepad-6.2-release-udl2.html">Notepad++ v6.2が登場</a>したことでハイライト機能が充実しました。と言うことで今回は、MQL5の実装をしてみました。<br />
<a href="http://lh4.ggpht.com/-dCXPnPVuyZk/UHl8j9bz9RI/AAAAAAAAAtU/nwarw9RMmVo/s1600-h/main%25255B3%25255D.png"><img alt="main" border="0" height="484" src="http://lh3.ggpht.com/-DvGgbfrQoLo/UHl8lABJEoI/AAAAAAAAAtc/BwsbTa3LmQQ/main_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="main" width="499" /></a> <br />
<br />
<br />
<h2>
初めに</h2>
自動補完用の設定ファイル(MQL5.xml)とハイライト用の設定ファイル(MQL5hl.xml)を<a href="https://docs.google.com/open?id=0B42sh1xkCfgtWTBaUDZnWXJnbDg">ココ</a>からDLしてくだしい。<br />
<br />
<br />
<h2>
自動補完の設定</h2>
MQL5.xmlを前回と同様の場所[Notepad++]‐[plugins]‐[\APIs]にコピペします。<br />
※今回の自動補完用ファイルには、関数の引数表示は、設定していません。<br />
<br />
<br />
<h2>
ハイライトの設定</h2>
Notepad++のバージョンアップに伴い[ユーザー定義ダイアログ]がなくなりました。<br />
設定場所は、【言語】‐【Define-your language…】です。<br />
後は、前回同様です。<br />
<br />
<br />
<h2>
ヘルプ(chm)の設定</h2>
プラグイン【<a href="http://sites.google.com/site/fstellari/nppplugins/LanguageHelp_dll_1v40.zip">LanguageHelp</a>】を<a href="https://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=Plugin_Central">ココ</a>からDLします。※plugin manager からは、DLできませんでした。<br />
解凍後、[Notepad++]‐[plugins]にLanguageHelpA.dllとLanguageHelpU.dllをコピペします。<br />
Notepad++を再起動すると、注意表示されますが無視ししてください。<br />
【プラグイン】‐【Language Help】‐【option】と進み【Add】をクリックします。設定は、以下のとおりです。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1XquR4zE3eLm1OOXHd3OeIHzgbFPVehQwtpW2_hjWq5r57iXSKI2jqVh17F7_pvEOiRsO8Rwn0jbFbzPJws5HePeX7QfAMaL9YhM6SuJGv4dCkQiTSYw6ncPx5tAAwlTgIYu7rMiRf2k/s1600-h/help%25255B8%25255D.png"><img alt="help" border="0" height="254" src="http://lh3.ggpht.com/-RcXM0R1Nx2s/UHl8m0eOzKI/AAAAAAAAAts/rCN1lsDNNX8/help_thumb%25255B6%25255D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="help" width="535" /></a> <br />
検索したい文字を指定しCTRL+F1で実行できます。<br />
<br />
<br />
<h2>
コンパイラーの設定</h2>
MetaTrader5は、MQL5.DLLでコンパイルを行いますが、コマンドプロンプトでコンパイル作業が行えるようにMQL5.EXEが用意されています。引数などは、MetaEditor Help → Creating Programs → <a href="http://www.metatrader5.com/en/metaeditor/help/development/compile">Compiling</a>に記載されていますので確認してください。あとは、MQL4の時と同じです。<br />
<a href="http://lh3.ggpht.com/-CfwY0Dygwz8/UHl8pBTZwTI/AAAAAAAAAt0/5bBtOgpA7bo/s1600-h/comp%25255B3%25255D.png"><img alt="comp" border="0" height="250" src="http://lh4.ggpht.com/-bYmX8mx3DLs/UHl8qD-irdI/AAAAAAAAAt8/uEPD64sk1Lo/comp_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="comp" width="466" /></a><br />
<br />
<br />
<h2>
その他</h2>
MQL5のエディタで作成されるファイルのフォーマットは、UNICODEです。MQL5を新規に作成する場合は、UT-8のフォーマットにした方が良いとは思いますが、SJISのフォーマットでもコンパイルできました。(※作動確認はしていません)<br />
また、MQL5のMetaEditorで行えるデバッグ機能をNotepad++で行う方法がわかりませんでした。もし可能ならコメント頂けると幸いです。<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com0tag:blogger.com,1999:blog-6027720561701794729.post-36433076410502801302012-10-04T22:33:00.001+09:002012-10-04T22:38:29.912+09:00Notepad++ de MQL4『<a href="http://winnerlife.blog35.fc2.com/blog-entry-1039.html">秀丸エディタをMQL4エディタ(MetaEditor)にする方法</a>』と言う記事を読んで、面白そうだったのでNotepad++でやってみました。実施範囲は、自動補完・ハイライト・コンパイル作業です。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilFPUT6TU0fTJGAXFo6p5SUMdC9tGeQyCuvIA37Wp137y0duxaaEIw147hqBiQZR2KzsnITkG-hz4cgVKc-Zp1qb70R4AxR93UCKz2TUE862cdDGlMs5ffXyk_l3IjTEY9cuEy8ZBMX2c/s1600-h/open%25255B3%25255D.png"><img alt="open" border="0" height="484" src="http://lh3.ggpht.com/-D3bo2svuiIs/UG2PzyiKIwI/AAAAAAAAAqg/Q7eBaRidjUM/open_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="open" width="565" /></a> <br />
<br />
<br />
<h2>
初めに</h2>
<a href="http://ja.wikipedia.org/wiki/Notepad%2B%2B">Notepad++とは</a><br />
notepad++の導入方法などは、<a href="http://news.mynavi.jp/articles/2011/05/18/notepadplapla/index.html">コチラ</a>の記事を参考してください。<br />
※日本語入力及び表記に多少問題があるようです。気になるかたは、<a href="http://www.geocities.jp/npp_euc_jp/">Notepad++ EUC-JP 対応版</a>の方がよいかもしれません。ただし、今回、確認したのは、Notepad++v6.18(UNICODE)版です。<br />
インストールと初期設定が修了したら<a href="https://docs.google.com/open?id=0B42sh1xkCfgtNXluYmlwc2Jqd2c">ココ</a>からMQL4_bag.zipをDLし解凍してください。<br />
<br />
<br />
<h2>
自動補完の設定</h2>
DLしたファイル(mql4.xml)を[Notepad++]‐[plugins]‐[\APIs]にコピペします。<br />
標準インストールした場合はココです。[C:\Program Files\Notepad++\plugins\APIs]<br />
Notepad++を機動させ[設定(T)]‐[環境設定]‐[自動保存/入力補完]と進み以下のように設定します。<br />
<a href="http://lh4.ggpht.com/-GBHdZoSsrwg/UG2P0067JnI/AAAAAAAAAqs/_3lrnIraLUw/s1600-h/para%25255B3%25255D.png"><img align="left" alt="para" border="0" height="141" src="http://lh5.ggpht.com/-jDZTHiWzY4I/UG2P148kjAI/AAAAAAAAAq0/DpTkAN1fSD0/para_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; margin-left: 0px; margin-right: 0px;" title="para" width="244" /></a> <br />
[入力補完フォーム] <br />
┣入力の毎に補完を行うにチェック <br />
┣関数名補完にチェック <br />
┗入力の直後関数パラメーターヒントを表示にチェック<br />
※お好みによって◎文字目から補完するか設定。<br />
以上で完成です。<br />
<br />
<br />
テスト:拡張子が.mq4のファイルを作成し、[言語(L)]からMQL4を指定すれば確認できます。<br />
また、引数を伴う関数を指定し(かっこ)をつけるとパラメーターのヒントが表示されます。<br />
<a href="http://lh5.ggpht.com/-Twy9MNqCVC0/UG2P24eYhxI/AAAAAAAAAq8/P7HrnEL2DIE/s1600-h/sort%25255B9%25255D.png"><img alt="sort" border="0" height="94" src="http://lh3.ggpht.com/-r4Pc9L-cHnM/UG2P340-DBI/AAAAAAAAArA/U4H1k3b2rww/sort_thumb%25255B7%25255D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="sort" width="643" /></a>※関数の引数で()で囲まれた部分がデフォルトです。<br />
<br />
<br />
<h2>
ハイライトの設定</h2>
Notepad++を機動させ[表示(V)]‐[ユーザー定義ダイアログ]‐[Import...]と進みDLしたファイル(mql4hr.mxl)を指定します。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5wRVRa7Qz45r4N24qtdT4Y80kzDJ0gN6ChbW6Pn3YCC1vZEUTGn9jdNS4U6mk1Z9TVyBDVU1-rBXAJ8YVUc2feGQbZxZbM67hk8XBW1wAF_Xva_Ofs7IOTzurVuHd30WeNQCvBrt5On8/s1600-h/yuza%25255B2%25255D.png"><img alt="yuza" border="0" height="244" src="http://lh4.ggpht.com/-Cu9iCfCm-Zs/UG2P6ZJlMNI/AAAAAAAAArU/TxnLtKn9Uhg/yuza_thumb.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="yuza" width="166" /></a><br />
<a href="http://lh4.ggpht.com/-KWKoi75oLSE/UG2P648XFCI/AAAAAAAAArc/JNxdLu8V6JQ/s1600-h/yuzaoo%25255B2%25255D.png"><img alt="yuzaoo" border="0" height="224" src="http://lh4.ggpht.com/-pryqIPXdG40/UG2P7w7vPQI/AAAAAAAAArg/CXitdWhcKPU/yuzaoo_thumb.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="yuzaoo" width="244" /></a> <br />
お好きな色を設定して、Notepad++を再起動してください。 <br />
※演算子に*と/を追加するとコメントが色抜けします。(原因不明です。) <br />
再起動後MQL4ファイルを開いてもハイライト機能が現れなかったら、[言語(L)]のmql4をクリックしてください。<br />
<br />
<br />
<h2>
コンパイラーの設定</h2>
Notepad++を機動させ[プラグイン]-[Plugin Manager]-[Show Plugin Manager]と進み[NppExec]をインストールします。<br />
<a href="http://lh6.ggpht.com/-vS5nzWccotI/UG2P9QtjkFI/AAAAAAAAArs/aDYS2_8lvw4/s1600-h/NPPE%25255B2%25255D.png"><img alt="NPPE" border="0" height="169" src="http://lh4.ggpht.com/-5h0l_vjhv8k/UG2P-Z_l8wI/AAAAAAAAAr0/H0aDQ81yRlk/NPPE_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="NPPE" width="244" /></a><br />
再起動後[プラグイン]‐[NppExec]-[Execute(F6)]を表示させ画面の様に入力します。<br />
<a href="http://lh5.ggpht.com/-s6wN1zyet4A/UG2P_aNq1cI/AAAAAAAAAr8/wC4y2ItyXzI/s1600-h/NPPE3%25255B4%25255D.png"><img alt="NPPE3" border="0" height="127" src="http://lh3.ggpht.com/-xPwTIMdYSiw/UG2QAkvLkHI/AAAAAAAAAsE/rHG8LJekwLM/NPPE3_thumb%25255B2%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; margin-left: 0px; margin-right: 0px;" title="NPPE3" width="244" /></a> <br />
<br />
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1478fd95-648f-45f6-afb8-5aae913dcd75" style="display: inline; float: none; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<pre class="c" name="code">// save current file
NPP_SAVE
//compile
C:/Program Files\MetaTrader 4/metalang.exe "$(FULL_CURRENT_PATH)"
</pre>
</div>
<br />
<span style="color: red;">※C:/Program Files\MetaTrader 4/metalang.exe は、コンパイル先のmetalang.exe のpathです。</span><br />
入力後[OK]で作動確認をし、問題がなければ名前を付けて[save]します。<br />
<br />
次にショートカットの割り当てをします。<br />
[プラグイン]‐[NppExec]‐[Advanced Option]-[Addociated script]にて先ほど保存したファイルを指定し[Add/Modify]をクリックし[OK]で終了します。<br />
<a href="http://lh4.ggpht.com/-uXpXenob0eY/UG2QBs6AxFI/AAAAAAAAAsI/eQX2VSEPdNo/s1600-h/NPPE5%25255B2%25255D.png"><img alt="NPPE5" border="0" height="203" src="http://lh6.ggpht.com/-jSaB0OmtQyQ/UG2QCleObgI/AAAAAAAAAsQ/nytRYTfKbZs/NPPE5_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="NPPE5" width="244" /></a> <br />
<br />
[設定(T)]‐[ショートカット管理]‐[Plugin Commands]からファイル名を探しショートカットの設定をします。<br />
<a href="http://lh3.ggpht.com/-BN9YZ_B5ow4/UG2QDxK6nqI/AAAAAAAAAsc/dtHA82JYOgM/s1600-h/NPPE6%25255B2%25255D.png"><img alt="NPPE6" border="0" height="243" src="http://lh4.ggpht.com/-l2mEup8Bofg/UG2QFPEiM_I/AAAAAAAAAsk/1blRt5wV_AA/NPPE6_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="NPPE6" width="244" /></a> <br />
<a href="http://lh5.ggpht.com/-QTPZNKNINeU/UG2QGGk_czI/AAAAAAAAAso/ZIqMZ7bqfOc/s1600-h/NPPE7%25255B2%25255D.png"><img alt="NPPE7" border="0" height="169" src="http://lh3.ggpht.com/-vRNJf84Flxs/UG2QG9oqK6I/AAAAAAAAAs0/R5QwOpvjolg/NPPE7_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="NPPE7" width="244" /></a> <br />
<br />
これで設定完了です。<br />
<br />
<br />
<h2>
まとめ</h2>
私自身ほとんどnotepad++を使用していないので何らかのトラブルが生じる可能性がありますのでご了承ください。notepad++のおすすめ機能は、折り畳みと[ctrl]+スクロールでの文字拡大縮小機能です。目が疲れてきたときに助かります。やはり、日本語表記及び記入に問題があるようで、日本語記入後のEnterで補完ログが発生したりします。
<br />
また、本来ならHelpの表示もしたかったのですが解りませんでした。<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com3tag:blogger.com,1999:blog-6027720561701794729.post-20275326844922418092012-09-29T23:28:00.001+09:002012-09-29T23:29:55.620+09:00ATC2012開催前夜今年で3回目の出場になるATC2012が来週から始まります。<br />
ということで、今回は、3回の大会出場のコンセプト(自分なりの。。)をまとめます。<br />
<br />
<h2>
ATC2010</h2>
<a href="http://expertadviser-bighope.blogspot.jp/2010/09/atc2010.html">初出場</a>となったこの年は、MT5をMT4の様に扱う方法にこだわりました。MT5とMT4で大きく異なる点は、ポジション管理です。MT4では、オーダーごとの情報になっているのに対し、MT5では、通貨ごとにポジションがまとめられます。そこで仮想ポジション(オーダー単位)の履歴を把握しMT4の様に作動させることにしました。結果は、思う様に作動しませんでした。<br />
参考:<a href="http://system-trading.jp/toyoshima/index.php?ID=226">豊嶋先生のブログ</a>に仮想ポジションについての記事があります。非常に参考になります。<br />
<br />
<h2>
ATC2011</h2>
<a href="http://expertadviser-bighope.blogspot.jp/2011/09/atc20115.html">2回目の出場</a>となったこの年は、複数ペアの取引に挑戦してみました。同一のシステムを複数ペアに取り組むものです。また、メモリの使用量削減にも挑戦しました。が結果は、散々なものとなりました。<br />
<br />
<h2>
ATC2012</h2>
3年目となる今回は、資金管理(ロット調整)にこだわって作成してみました。システムの内容は、以下のとおりです。<br />
<ul>
<li>対象通貨:EURUSD(単一ペア)</li>
<li>対象時間軸:1H</li>
<li>システム概要:ブレイクアウト</li>
<li>特徴:必ずBUYorSELLのポジションを持ち続ける。</li>
</ul>
資金管理なしの場合の成績(0.01lot固定)<br />
<ul>
<li>期間:2012.01.01~2012.08.01</li>
<li>取引数:326</li>
<li>PF:1.11</li>
<li>総損益:631.54</li>
</ul>
<br />
このような、EAに資金調整(ロット調整)を行った結果以下の様になった。<br />
<ul>
<li>期間:2012.01.01~2012.08.01</li>
<li>取引数:466(ロット調整しかしていないのに取引数が上がっている@@;</li>
<li>PF:1.62</li>
<li>総損益:118282.73</li>
</ul>
<br />
※資金調整(ロット調整)の方法は、利益が上がった時間帯には、多くのロットを賭け、利益の上がらない時間帯は、少ないロットで、と言う感じです。本来なら、仮想ポジションを設けて、取引をしないという選択肢もありますが、今回の大会から0.01lotが採用されたのでポジションを持ち続ける事にしました。(単なる手抜き・・<br />
<br />
<h2>
まとめ</h2>
今年も何とか、ATC2012に出場することが出来ました。あとは、変なバグや資金が吹っ飛ぶことなく大会終了時まで楽しませてもらえることを祈るばかりです。<br />
<br />
<br />
<h2>
おまけ</h2>
MQL5リファレンスの機械翻訳(今回は、埋め込み系)を作ってみましたが、9割程度完成したところで心が折れました。。orz 不完全なものですが<a href="https://docs.google.com/open?id=0B42sh1xkCfgtSG1zU3ZqTWRwVDA">ココ</a>に置いておきます。※CHMファイルを見る場合は、ブロックの解除が必要です。<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com2tag:blogger.com,1999:blog-6027720561701794729.post-69502560197360843102012-09-08T23:47:00.001+09:002012-09-29T23:30:14.457+09:00ヒストリカルデータからエクスポートしたCSVファイルのカスタマイズ今回は、MT4からヒストリカルデータをエクスポートしたCSVファイルをExcelで加工しやすいようにするVBスクリプトを作ってみました。<br />
<br />
<h2>
【問題点】</h2>
MT4からエクスポートしたCSVファイルは、日付のフォーマットがExcelに対応していないため、日付が文字列として認識されます。その為、Excelのありがたい関数郡(例:月別計算or曜日計算or時間の抽出)がそのまま使えません。<br />
<a href="http://lh4.ggpht.com/-uPeyv1cTEN0/UEtaQrym8NI/AAAAAAAAAo8/xTFTEDnicBo/s1600-h/histmae%25255B2%25255D.png"><img alt="histmae" border="0" height="234" src="http://lh3.ggpht.com/--A251aaiYDw/UEtaRVpO8EI/AAAAAAAAApA/V8bqVc6NFZw/histmae_thumb.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="histmae" width="244" /></a> <br />
<br />
【対応】<br />
そこで、MT4の時間フォーマットをExcelで認識できるフォーマットに変更するスクリプトを作りました。<br />
MT4の時間フォーマット【年.月.日,時間】をExcelフォーマット【年/月/日 時間】に変更します。<br />
スクリプトのDLは、こちら【<a href="https://docs.google.com/open?id=0B42sh1xkCfgtTFJvdzB0c1hoUFU">Time_format_conversion.vbs</a>】<br />
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:8f231675-8c52-4a1e-ab64-de54d55e0456" style="display: inline; float: none; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<pre class="vb" name="code">Option Explicit
Dim datename,ob,reader,writer,text
Dim re,maches,name,ctext
'ファイル名を取得
If WScript.Arguments.Count = 0 Then
WScript.Echo "ファイルをドラッグ&ドロップしてください。"
WScript.Quit
Else
datename = WScript.Arguments(0)
End If
'オブジェクトの設定
Set ob = CreateObject("Scripting.FileSystemObject")
Set re = New RegExp
'ファイルの読み込み
Set reader = ob.OpenTextFile(datename,1,false)
'新しいファイル名の作成
re.Pattern = "\.csv"
name = re.Replace(datename, "c.csv")
'書き込み用のファイル作成
Set writer = ob.OpenTextFile(name,2,true)
'正規表現のパターン設定
re.Pattern = "(\d{4})\.(\d{2})\.(\d{2})\,"
'書き換え
Do Until reader.AtEndOfStream
text = reader.ReadLine
ctext = re.Replace(text,"$1/$2/$3 ")
writer.WriteLine ctext
Loop
'ファイルを閉じる
reader.Close()
writer.Close()
'完了メッセージ
WScript.Echo name &"を出力しました。"
</pre>
</div>
<br />
【使い方】<br />
スクリプトをDL後、ヒストリカルデータからエクスポートしたCSVファイルをスクリプトファイルの上にドラッグ&ドロップしてください。エクスポートしたCSVファイルのあるフォルダにCSVファイル名c.csvというファイルが作成されます。作成されたファイルを開くと以下の様に表示され、Execlで日付が認識されるようになります。<br />
<a href="http://lh6.ggpht.com/-atI9XzENmdY/UEtaSRYF6-I/AAAAAAAAApI/HrD84BW1U6Q/s1600-h/histato%25255B2%25255D.png"><img alt="histato" border="0" height="244" src="http://lh6.ggpht.com/-6qQFRuhJ2V8/UEtaTdDlpRI/AAAAAAAAApQ/VJRwhHtW9_Y/histato_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="histato" width="213" /></a> <br />
さて、ここまで来たら完成ですが少し遊んでみます。例えば、月別に見た時間別のボラリティの計算をしてみます。<br />
各列にラベルを付けて、月関数【MONTH(シリアル数値)】、時間関数【HOUR(シリアル値)】を追加し、高値と安値の差をHi-Lw(pips)に入れたものです。<br />
<a href="http://lh6.ggpht.com/-M_uciqI7Z30/UEtaUbCFxAI/AAAAAAAAApY/BL8matpct-8/s1600-h/hiskakou%25255B5%25255D.png"><img alt="hiskakou" border="0" height="238" src="http://lh3.ggpht.com/-a_bigdy3OqE/UEtaVBNTg2I/AAAAAAAAApk/h4piDxYCAAI/hiskakou_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="hiskakou" width="244" /></a> <br />
<br />
これをピボットテーブルで表すと以下の様になり月間別に見た時間ボラリティの平均が出来ます。<br />
<a href="http://lh5.ggpht.com/-H14XsD31E_w/UEtaWTAU1GI/AAAAAAAAApo/msqvVuZRnPQ/s1600-h/pibo%25255B2%25255D.png"><img alt="pibo" border="0" height="118" src="http://lh3.ggpht.com/-GgL7v3EAYWE/UEtaXNoHVuI/AAAAAAAAApw/QP7ZM9fWQqs/pibo_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="pibo" width="244" /></a> <br />
※横軸:月 縦軸:時間です。<br />
グラフ化すると以下の様になります。<br />
<a href="http://lh6.ggpht.com/-IbBWZs9pjcA/UEtaYOsu93I/AAAAAAAAAp8/pYRnhH0iu7I/s1600-h/burafu%25255B2%25255D.png"><img alt="burafu" border="0" height="112" src="http://lh5.ggpht.com/-a6-Pc_3M7DI/UEtaZX_cO5I/AAAAAAAAAqA/p6ERcfZPzHU/burafu_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="burafu" width="244" /></a> <br />
サマータイムの影響が出ているかな(・・?<br />
<br />
【まとめ】<br />
VBスクリプトの勉強もかねて作成してみました。<br />
<br />
<br />
<br />
それと。。。今年もATC2012に出場できそうです^^;<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com2tag:blogger.com,1999:blog-6027720561701794729.post-33650807461666627702012-05-31T02:19:00.001+09:002012-05-31T02:21:07.266+09:00GSLの乱数と確率密度関数を使ってみる。GSLの乱数と確率密度関数は、条件を付ければラッパーを使わなくてもそのまま使えそうなので試してみました。<br />
※条件とは、GSLには、多くの乱数器がありますが、初期設定の乱数器を使用するという条件です。<br />
<br />
<h2>
ヘッダーの作成</h2>
代表的なものだけピックアップし、ヘッダーファイルを作成しました。<br />
<div style="background-color: whitesmoke;">
<pre><code>
<span style="color: grey;">//+------------------------------------------------------------------+
//| gsl_rand.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
</span><span style="color: blue;">#property</span> <span style="color: blue;">copyright</span> <span style="color: teal;">"Copyright 2012, MetaQuotes Software Corp."
</span><span style="color: blue;">#property</span> <span style="color: blue;">link</span> <span style="color: teal;">"http://www.metaquotes.net"
</span><span style="color: blue;">#property</span> <span style="color: blue;">show_inputs
#import</span> <span style="color: teal;">"gsl.dll"
</span><span style="color: grey;">//乱数の基本設定
</span> <span style="color: grey;">//環境設定の取得
</span> <span style="color: blue;">int</span> gsl_rng_env_setup <span style="color: navy;">();
</span> <span style="color: grey;">//型T の乱数発生器のインスタンスを生成して、そのハンドルを返す。
</span> <span style="color: grey;">//T:gsl_rng_env_setupで取得したハンドル。
</span> <span style="color: blue;">int</span> gsl_rng_alloc <span style="color: navy;">(</span><span style="color: blue;">int</span> T<span style="color: navy;">);
</span> <span style="color: grey;">//乱数発生器を初期化
</span> <span style="color: grey;">//r:gsl_rng_allocで取得したハンドル
</span> <span style="color: grey;">//s:初期化種
</span> <span style="color: blue;">void</span> gsl_rng_set <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">,</span> <span style="color: blue;">datetime</span> s<span style="color: navy;">);
</span> <span style="color: grey;">//乱数発生器のインスタンス r に割り当てられているメモリを解放する。
</span> <span style="color: blue;">void</span> gsl_rng_free <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">);
</span><span style="color: grey;">//以下 r:gsl_rng_allocで取得したハンドル
//乱数
</span> <span style="color: grey;">//0<=x<1の乱数を返す。
</span> <span style="color: blue;">double</span> gsl_rng_uniform <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">);
</span> <span style="color: grey;">//0<x<1の乱数を返す。
</span> <span style="color: blue;">double</span> gsl_rng_uniform_pos <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">);
</span><span style="color: grey;">//分布に従う乱数と確率密度関数
</span>
<span style="color: grey;">//正規分布乱数
</span> <span style="color: blue;">double</span> gsl_ran_gaussian <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">,</span> <span style="color: blue;">double</span> sigma<span style="color: navy;">);
</span> <span style="color: grey;">//正規分布の確率密度関数
</span> <span style="color: blue;">double</span> gsl_ran_gaussian_pdf <span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span> <span style="color: blue;">double</span> sigma<span style="color: navy;">);
</span>
<span style="color: grey;">//平均値mu の指数分布にしたがう乱数を返す。
</span> <span style="color: blue;">double</span> gsl_ran_exponential <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">,</span> <span style="color: blue;">double</span> mu<span style="color: navy;">);
</span> <span style="color: grey;">//x における平均値mu の指数分布の確率密度関数
</span> <span style="color: blue;">double</span> gsl_ran_exponential_pdf <span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span> <span style="color: blue;">double</span> mu<span style="color: navy;">);
</span>
<span style="color: grey;">//幅a のラプラス分布にしたがう乱数を返す。
</span> <span style="color: blue;">double</span> gsl_ran_laplace <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">,</span> <span style="color: blue;">double</span> a<span style="color: navy;">);
</span> <span style="color: grey;">//x における幅a のラプラス分布の確率密度関数
</span> <span style="color: blue;">double</span> gsl_ran_laplace_pdf <span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span> <span style="color: blue;">double</span> a<span style="color: navy;">);
</span>
<span style="color: grey;">//底がa、指数がb のべき指数分布にしたがう乱数を返す。
</span> <span style="color: blue;">double</span> gsl_ran_exppow <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">,</span> <span style="color: blue;">double</span> a<span style="color: navy;">,</span> <span style="color: blue;">double</span> b<span style="color: navy;">);
</span> <span style="color: grey;">//x における底がa、指数がb のべき指数分布の確率密度関数
</span> <span style="color: blue;">double</span> gsl_ran_exppow_pdf <span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span> <span style="color: blue;">double</span> a<span style="color: navy;">,</span> <span style="color: blue;">double</span> b<span style="color: navy;">);
</span>
<span style="color: grey;">//係数a のコーシー分布にしたがう乱数を返す。
</span> <span style="color: blue;">double</span> gsl_ran_cauchy <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">,</span> <span style="color: blue;">double</span> a<span style="color: navy;">);
</span> <span style="color: grey;">//x における係数a のコーシー分布の確率密度関数
</span> <span style="color: blue;">double</span> gsl_ran_cauchy_pdf <span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span> <span style="color: blue;">double</span> a<span style="color: navy;">);
</span>
<span style="color: grey;">//ガンマ分布にしたがう乱数を返す。
</span> <span style="color: blue;">double</span> gsl_ran_gamma <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">,</span> <span style="color: blue;">double</span> a<span style="color: navy;">,</span> <span style="color: blue;">double</span> b<span style="color: navy;">);
</span> <span style="color: grey;">//引数がa とb のときの、x におけるガンマ分布の確率密度関数
</span> <span style="color: blue;">double</span> gsl_ran_gamma_pdf <span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span> <span style="color: blue;">double</span> a<span style="color: navy;">,</span> <span style="color: blue;">double</span> b<span style="color: navy;">);
</span>
<span style="color: grey;">//a からb の間に一様に分布する乱数を返す。
</span> <span style="color: blue;">double</span> gsl_ran_flat <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">,</span> <span style="color: blue;">double</span> a<span style="color: navy;">,</span> <span style="color: blue;">double</span> b<span style="color: navy;">);
</span> <span style="color: grey;">//a からb の間の一様分布の確率密度関数
</span> <span style="color: blue;">double</span> gsl_ran_flat_pdf <span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span> <span style="color: blue;">double</span> a<span style="color: navy;">,</span> <span style="color: blue;">double</span> b<span style="color: navy;">);
</span>
<span style="color: grey;">//対数正規分布にしたがう乱数を返す。
</span> <span style="color: blue;">double</span> gsl_ran_lognormal <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">,</span> <span style="color: blue;">double</span> zeta<span style="color: navy;">,</span> <span style="color: blue;">double</span> sigma<span style="color: navy;">);
</span> <span style="color: grey;">//パラメータ値がzeta とsigma で与えられたときの、対数正規分布の確率密度関数
</span> <span style="color: blue;">double</span> gsl_ran_lognormal_pdf <span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span> <span style="color: blue;">double</span> zeta<span style="color: navy;">,</span> <span style="color: blue;">double</span> sigma<span style="color: navy;">);
</span>
<span style="color: grey;">//自由度n のカイ二乗分布にしたがう乱数を返す。
</span> <span style="color: blue;">double</span> gsl_ran_chisq <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">,</span> <span style="color: blue;">double</span> nu<span style="color: navy;">);
</span> <span style="color: grey;">//自由度n のカイ二乗分布の確率密度関数
</span> <span style="color: blue;">double</span> gsl_ran_chisq_pdf <span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span> <span style="color: blue;">double</span> nu<span style="color: navy;">);
</span>
<span style="color: grey;">//自由度nu1、nu2 のF 分布にしたがう乱数を返す。
</span> <span style="color: blue;">double</span> gsl_ran_fdist <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">,</span> <span style="color: blue;">double</span> nu<span style="color: navy;">);
</span> <span style="color: grey;">//自由度nu1、nu2 のF 分布の確率密度関数
</span> <span style="color: blue;">double</span> gsl_ran_fdist_pdf <span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span> <span style="color: blue;">double</span> nu<span style="color: navy;">);
</span>
<span style="color: grey;">//t 分布にしたがう乱数を返す。
</span> <span style="color: blue;">double</span> gsl_ran_tdist <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">,</span> <span style="color: blue;">double</span> nu<span style="color: navy;">);
</span> <span style="color: grey;">//自由度nu のt 分布の確率密度関数
</span> <span style="color: blue;">double</span> gsl_ran_tdist_pdf <span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span> <span style="color: blue;">double</span> nu <span style="color: navy;">);
</span>
<span style="color: grey;">//ベータ分布にしたがう乱数を返す。
</span> <span style="color: blue;">double</span> gsl_ran_beta <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">,</span> <span style="color: blue;">double</span> a<span style="color: navy;">,</span> <span style="color: blue;">double</span> b <span style="color: navy;">);
</span> <span style="color: grey;">//パラメータ値がa とb で与えられたとき、ベータ分布の確率密度関数
</span> <span style="color: blue;">double</span> gsl_ran_beta_pdf <span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span> <span style="color: blue;">double</span> a<span style="color: navy;">,</span> <span style="color: blue;">double</span> b<span style="color: navy;">);
</span>
<span style="color: grey;">//ロジスティック分布にしたがう乱数を返す。
</span> <span style="color: blue;">double</span> gsl_ran_logistic <span style="color: navy;">(</span><span style="color: blue;">int</span> r<span style="color: navy;">,</span> <span style="color: blue;">double</span> a<span style="color: navy;">);
</span> <span style="color: grey;">//係数a が与えられたとき<鴻Wスティック分布の確率密度関数
</span> <span style="color: blue;">double</span> gsl_ran_logistic_pdf <span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span> <span style="color: blue;">double</span> a<span style="color: navy;">);
</span><span style="color: blue;">#import
</span>
</code></pre>
</div>
<br />
<h2>
使い方</h2>
先回のコードに移植してみました。※変更ヶ所は、<span style="color: red;">赤字部分</span>です。
<br /> gsl.dllとgslcblas.dllをterminal.exeと同じ位置に置いています。<br />
<div style="background-color: whitesmoke;">
<pre><code>
<span style="color: grey;">//+------------------------------------------------------------------+
//| SMCFilter_gsl.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
</span><span style="color: blue;">#property</span> <span style="color: blue;">copyright</span> <span style="color: teal;">"Copyright 2012, MetaQuotes Software Corp."
</span><span style="color: blue;">#property</span> <span style="color: blue;">link</span> <span style="color: teal;">"http://www.metaquotes.net"
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_separate_window
</span><span style="color: grey;">//#property indicator_chart_window
</span><span style="color: red;">#include <gsl_rand.mqh></span><span style="color: navy;">
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_buffers</span> <span style="color: green;">2
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_color1</span> <span style="color: #333399;">Yellow
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_width1</span> <span style="color: green;">1
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_color2</span> <span style="color: #333399;">Red
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_width2</span> <span style="color: green;">1
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> Particles_vol <span style="color: navy;">=</span> <span style="color: green;">1000</span><span style="color: navy;">;</span><span style="color: grey;">//粒子の数
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> Range <span style="color: navy;">=</span> <span style="color: green;">100</span><span style="color: navy;">;</span><span style="color: grey;">//試行範囲
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> sigmaperiod <span style="color: navy;">=</span> <span style="color: green;">100</span><span style="color: navy;">;</span><span style="color: grey;">//偏差取得期間
</span><span style="color: blue;">extern</span> <span style="color: blue;">double</span> Set <span style="color: navy;">=</span> <span style="color: green;">3000.0</span><span style="color: navy;">;</span><span style="color: grey;">//初期化範囲(pips)
</span><span style="color: blue;">double</span> Linebuf<span style="color: navy;">[];
</span><span style="color: blue;">double</span> Particles<span style="color: navy;">[][</span><span style="color: green;">2</span><span style="color: navy;">];
</span><span style="color: blue;">double</span> ans<span style="color: navy;">[];
</span><span style="color: red;">int r;</span><span style="color: navy;">
</span><span style="color: grey;">//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> init<span style="color: navy;">()
</span> <span style="color: navy;">{
</span><span style="color: grey;">//---- indicators
</span> <span style="color: blueviolet;">SetIndexStyle</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">,</span> <span style="color: #333399;">DRAW_LINE</span><span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexBuffer</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">,</span>Linebuf<span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexEmptyValue</span><span style="color: navy;">(</span> <span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">);
</span>
<span style="color: blueviolet;">SetIndexStyle</span><span style="color: navy;">(</span><span style="color: green;">1</span><span style="color: navy;">,</span> <span style="color: #333399;">DRAW_LINE</span><span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexBuffer</span><span style="color: navy;">(</span><span style="color: green;">1</span><span style="color: navy;">,</span>ans<span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexEmptyValue</span><span style="color: navy;">(</span> <span style="color: green;">1</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">);
</span>
<span style="color: blueviolet;">ArrayResize</span><span style="color: navy;">(</span>Particles<span style="color: navy;">,</span>Particles_vol<span style="color: navy;">);
</span>
<span style="color: red;"> //乱数の初期化
int T=gsl_rng_env_setup();
r = gsl_rng_alloc(T);
gsl_rng_set (r,TimeLocal());</span><span style="color: navy;">
</span><span style="color: grey;">//----
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> deinit<span style="color: navy;">()
</span> <span style="color: navy;">{
</span><span style="color: grey;">//----
</span> <span style="color: red;">gsl_rng_free (r);</span><span style="color: navy;">
</span><span style="color: grey;">//----
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|粒子の初期化 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">void</span> setparticles<span style="color: navy;">(</span><span style="color: blue;">double</span> <span style="color: navy;">&</span> pobj<span style="color: navy;">[][],</span><span style="color: blue;">int</span> range<span style="color: navy;">,</span><span style="color: blue;">double</span> set<span style="color: navy;">){
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span><span style="color: blue;">int</span> i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>Particles_vol<span style="color: navy;">;</span>i<span style="color: navy;">++){
</span> Particles<span style="color: navy;">[</span>i<span style="color: navy;">][</span><span style="color: green;">0</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> data<span style="color: navy;">(</span>range<span style="color: navy;">)+(((</span>set<span style="color: navy;">*</span><span style="color: green;">2</span><span style="color: navy;">)/</span>Particles_vol<span style="color: navy;">)*</span>i<span style="color: navy;">-</span>set<span style="color: navy;">)*</span><span style="color: magenta;">Point</span><span style="color: navy;">;
</span> Particles<span style="color: navy;">[</span>i<span style="color: navy;">][</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> <span style="color: green;">0</span><span style="color: navy;">;</span>
<span style="color: navy;">}
</span> <span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|乱数の成形 0<=random<1 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">double</span> random<span style="color: navy;">(){
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: red;">gsl_rng_uniform (r)</span><span style="color: navy;">);
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|正規分布を計算 mu:平均 sigma:偏差 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">double</span> normal<span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span><span style="color: blue;">double</span> sigma<span style="color: navy;">){
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: red;">gsl_ran_gaussian_pdf(x,sigma)</span><span style="color: navy;">);
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|正規分布となる乱数の成形 mu:平均 sigma:偏差 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">double</span> normalrand<span style="color: navy;">(</span><span style="color: blue;">double</span> sigma<span style="color: navy;">){</span>
<span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: red;">gsl_ran_gaussian (r,sigma)</span><span style="color: navy;">);
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|リサンプリング q:粒子数 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">void</span> resample<span style="color: navy;">(</span><span style="color: blue;">int</span> q<span style="color: navy;">,</span><span style="color: blue;">double</span> <span style="color: navy;">&</span>pobj<span style="color: navy;">[][]</span> <span style="color: navy;">){
</span>
<span style="color: blue;">double</span> wt<span style="color: navy;">[];
</span> <span style="color: blue;">double</span> rd<span style="color: navy;">;
</span> <span style="color: blue;">int</span> i<span style="color: navy;">,</span>j<span style="color: navy;">;
</span>
<span style="color: grey;">//粒子のコピー
</span> <span style="color: blue;">double</span> copyp<span style="color: navy;">[][</span><span style="color: green;">2</span><span style="color: navy;">];
</span> <span style="color: blueviolet;">ArrayResize</span><span style="color: navy;">(</span>copyp<span style="color: navy;">,</span>q<span style="color: navy;">);
</span> <span style="color: blueviolet;">ArrayCopy</span><span style="color: navy;">(</span>copyp<span style="color: navy;">,</span>pobj<span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span>q<span style="color: navy;">*</span><span style="color: green;">2</span><span style="color: navy;">);
</span>
<span style="color: grey;">//累計重み
</span> <span style="color: blueviolet;">ArrayResize</span><span style="color: navy;">(</span>wt<span style="color: navy;">,</span>q<span style="color: navy;">);
</span> wt<span style="color: navy;">[</span><span style="color: green;">0</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> pobj<span style="color: navy;">[</span><span style="color: green;">0</span><span style="color: navy;">][</span><span style="color: green;">2</span><span style="color: navy;">];
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">1</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>q<span style="color: navy;">;</span>i<span style="color: navy;">++)</span> wt<span style="color: navy;">[</span>i<span style="color: navy;">]=</span>wt<span style="color: navy;">[</span>i<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">]+</span>pobj<span style="color: navy;">[</span>i<span style="color: navy;">][</span><span style="color: green;">2</span><span style="color: navy;">];
</span>
<span style="color: grey;">//リサンプリング(ルーレット法)
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>q<span style="color: navy;">;</span>i<span style="color: navy;">++){
</span> rd <span style="color: navy;">=</span> random<span style="color: navy;">()/</span>Particles_vol<span style="color: navy;">;
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>j<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>j<span style="color: navy;"><</span>q<span style="color: navy;">;</span>j<span style="color: navy;">++){
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>rd <span style="color: navy;">></span> wt<span style="color: navy;">[</span>j<span style="color: navy;">]){
</span> <span style="color: blue;">continue</span><span style="color: navy;">;
</span> <span style="color: navy;">}</span><span style="color: blue;">else</span><span style="color: navy;">{
</span> pobj<span style="color: navy;">[</span>i<span style="color: navy;">][</span><span style="color: green;">0</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> copyp<span style="color: navy;">[</span>j<span style="color: navy;">][</span><span style="color: green;">0</span><span style="color: navy;">];
</span> pobj<span style="color: navy;">[</span>i<span style="color: navy;">][</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> <span style="color: green;">0</span><span style="color: navy;">;</span>
<span style="color: blue;">break</span><span style="color: navy;">;
</span> <span style="color: navy;">}
</span> <span style="color: navy;">}</span>
<span style="color: navy;">}
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|尤度計算および重み付け |
//+------------------------------------------------------------------+
</span><span style="color: blue;">void</span> wlikelihood<span style="color: navy;">(</span><span style="color: blue;">double</span> price<span style="color: navy;">,</span><span style="color: blue;">int</span> p<span style="color: navy;">,</span><span style="color: blue;">double</span> sigma<span style="color: navy;">,</span><span style="color: blue;">double</span> <span style="color: navy;">&</span>pobj<span style="color: navy;">[][]){
</span> <span style="color: blue;">double</span> alfa<span style="color: navy;">[];
</span> <span style="color: blue;">double</span> wsum<span style="color: navy;">;
</span> <span style="color: blue;">double</span> g <span style="color: navy;">=</span> <span style="color: green;">1</span><span style="color: navy;">;</span> <span style="color: grey;">//Gの偏微分の値
</span> <span style="color: blue;">int</span> i<span style="color: navy;">;
</span> <span style="color: blueviolet;">ArrayResize</span><span style="color: navy;">(</span>alfa<span style="color: navy;">,</span>p<span style="color: navy;">);
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>p<span style="color: navy;">;</span>i<span style="color: navy;">++){
</span> alfa<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> normal<span style="color: navy;">((</span>price<span style="color: navy;">-</span>pobj<span style="color: navy;">[</span>i<span style="color: navy;">][</span><span style="color: green;">0</span><span style="color: navy;">]),</span>sigma<span style="color: navy;">)*</span>g<span style="color: navy;">;</span><span style="color: grey;">//(尤度)
</span> wsum <span style="color: navy;">+=</span> alfa<span style="color: navy;">[</span>i<span style="color: navy;">];
</span> <span style="color: navy;">}
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>wsum<span style="color: navy;"><</span><span style="color: green;">1</span><span style="color: navy;">)</span>wsum<span style="color: navy;">=</span><span style="color: green;">1</span><span style="color: navy;">;
</span> <span style="color: grey;">//正規化
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>p<span style="color: navy;">;</span>i<span style="color: navy;">++)</span>pobj<span style="color: navy;">[</span>i<span style="color: navy;">][</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> alfa<span style="color: navy;">[</span>i<span style="color: navy;">]/</span>wsum<span style="color: navy;">;
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|対象データ |
//+------------------------------------------------------------------+
</span><span style="color: blue;">double</span> data<span style="color: navy;">(</span><span style="color: blue;">int</span> index<span style="color: navy;">){
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: magenta;">Close</span><span style="color: navy;">[</span>index<span style="color: navy;">]);
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|偏差の取得 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">double</span> setsigma<span style="color: navy;">(</span><span style="color: blue;">int</span> range<span style="color: navy;">,</span><span style="color: blue;">int</span> index<span style="color: navy;">){
</span> <span style="color: blue;">int</span> i<span style="color: navy;">;
</span> <span style="color: blue;">double</span> sum<span style="color: navy;">,</span>av<span style="color: navy;">;
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>range<span style="color: navy;">;</span>i<span style="color: navy;">++)</span>av <span style="color: navy;">+=</span> data<span style="color: navy;">(</span>index<span style="color: navy;">+</span>i<span style="color: navy;">);
</span> av <span style="color: navy;">/=</span> range<span style="color: navy;">;</span>
<span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>range<span style="color: navy;">;</span>i<span style="color: navy;">++)</span>sum <span style="color: navy;">+=</span> <span style="color: blueviolet;">MathPow</span><span style="color: navy;">((</span>data<span style="color: navy;">(</span>index<span style="color: navy;">+</span>i<span style="color: navy;">)-</span>av<span style="color: navy;">),</span><span style="color: green;">2</span><span style="color: navy;">);
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: blueviolet;">MathSqrt</span><span style="color: navy;">(</span>sum<span style="color: navy;">/</span>range<span style="color: navy;">));</span>
<span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> start<span style="color: navy;">(){
</span> <span style="color: blue;">double</span> v<span style="color: navy;">;</span><span style="color: grey;">//乱数
</span> <span style="color: blue;">double</span> sum<span style="color: navy;">,</span>sigma<span style="color: navy;">,</span>limit<span style="color: navy;">;
</span> <span style="color: blue;">int</span> i<span style="color: navy;">,</span>j<span style="color: navy;">;
</span> <span style="color: blue;">static</span> <span style="color: blue;">datetime</span> now <span style="color: navy;">=</span> <span style="color: green;">0</span><span style="color: navy;">;
</span> <span style="color: blue;">int</span> counted_bars<span style="color: navy;">=</span><span style="color: blueviolet;">IndicatorCounted</span><span style="color: navy;">();
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>counted_bars<span style="color: navy;"><</span><span style="color: green;">1</span><span style="color: navy;">)</span>i<span style="color: navy;">=</span>Range<span style="color: navy;">;</span> <span style="color: blue;">else</span> i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;
</span>
<span style="color: blue;">if</span><span style="color: navy;">(</span>now<span style="color: navy;">==</span><span style="color: green;">0</span><span style="color: navy;">)</span>setparticles<span style="color: navy;">(</span>Particles<span style="color: navy;">,</span>Range<span style="color: navy;">,</span>Set<span style="color: navy;">);
</span> <span style="color: blue;">while</span><span style="color: navy;">(</span>i<span style="color: navy;">>=</span><span style="color: green;">0</span><span style="color: navy;">){
</span> <span style="color: grey;">//各bar一回のみ実行
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>now<span style="color: navy;">!=</span><span style="color: magenta;">Time</span><span style="color: navy;">[</span>i<span style="color: navy;">]){
</span> now<span style="color: navy;">=</span><span style="color: magenta;">Time</span><span style="color: navy;">[</span>i<span style="color: navy;">];
</span> sigma<span style="color: navy;">=</span>setsigma<span style="color: navy;">(</span>sigmaperiod<span style="color: navy;">,</span>i<span style="color: navy;">);
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>j<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>j<span style="color: navy;"><</span>Particles_vol<span style="color: navy;">;</span>j<span style="color: navy;">++){
</span> Particles<span style="color: navy;">[</span>j<span style="color: navy;">][</span><span style="color: green;">0</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> Particles<span style="color: navy;">[</span>j<span style="color: navy;">][</span><span style="color: green;">0</span><span style="color: navy;">]</span> <span style="color: navy;">+</span> normalrand<span style="color: navy;">(</span>sigma<span style="color: navy;">);</span> <span style="color: grey;">
</span> <span style="color: navy;">}
</span> <span style="color: grey;">//尤度推定
</span> wlikelihood<span style="color: navy;">(</span>data<span style="color: navy;">(</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">),</span>Particles_vol<span style="color: navy;">,</span>sigma<span style="color: navy;">,</span>Particles<span style="color: navy;">);
</span> <span style="color: grey;">//リサンプリング
</span> resample<span style="color: navy;">(</span>Particles_vol<span style="color: navy;">,</span>Particles<span style="color: navy;">);</span>
<span style="color: grey;">//加重付平均
</span> sum<span style="color: navy;">=</span><span style="color: green;">0.0</span><span style="color: navy;">;</span>
<span style="color: blue;">for</span><span style="color: navy;">(</span>j<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>j<span style="color: navy;"><</span>Particles_vol<span style="color: navy;">;</span>j<span style="color: navy;">++)</span>sum <span style="color: navy;">+=</span> <span style="color: navy;">(</span>Particles<span style="color: navy;">[</span>j<span style="color: navy;">][</span><span style="color: green;">0</span><span style="color: navy;">])*</span>Particles<span style="color: navy;">[</span>j<span style="color: navy;">][</span><span style="color: green;">1</span><span style="color: navy;">];
</span>
Linebuf<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> sum<span style="color: navy;">;
</span> <span style="color: navy;">}
</span> ans<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> data<span style="color: navy;">(</span>i<span style="color: navy;">);</span><span style="color: grey;">//答え
</span> i<span style="color: navy;">--;
</span> <span style="color: navy;">}
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
</span>
</code></pre>
</div>
<br />
<h2>
まとめ</h2>
とりあえず乱数と密度関数で時間を取られることはなくなりそうです。<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com0tag:blogger.com,1999:blog-6027720561701794729.post-82874022700676959072012-05-27T23:12:00.001+09:002012-05-27T23:14:54.044+09:00モンテカルロフィルタのサンプルを作ってみた。TwitterのTLに粒子フィルタと言う言葉が出てきたので調べてみました。呼び方がいろいろある様で、モンテカルロフィルタとか、パーティクルフィルタなどと呼ばれているようです。今回は、粒子をベクトル化させない(変化量を与えていない)のでモンテカルロフィルタとしました。<br />
<br />
<h2>
どんなもの?</h2>
解りやすくまとめてあるサイトが数多くありますので、参照してください。<br />
<ul>
<li><a href="http://www23.atwiki.jp/yahirohumpty/pages/8.html">おべんきょうwikiーパーティクルフィルタ</a> </li>
<li><a href="http://tensor.jpn.com/wp/?p=40">パーティクルフィルタの理解(Tensor.jp.com)</a> </li>
<li><a href="http://www.is.kochi-u.ac.jp/%7Ehonda/studentarc/06_komatsu.pdf">モンテカルロフィルタと時系列データマイニング</a> </li>
</ul>
手順は、以下の様になります。<br />
<ol>
<li>モデルの決定 </li>
<li>粒子の初期化(散布) </li>
<li>予測 </li>
<li>尤度の計算、重み付 </li>
<li>リサンプリング </li>
<li>重み付平均 </li>
<li>3に戻る </li>
</ol>
<br />
<h2>
作成</h2>
今回作成したプログラムの基本設計は、以下のとおりです。また、直前の値からほとんど動かない予測値を想定しています。<br />
<br />
【モデル】<br />
<table border="1" cellpadding="1" cellspacing="0" style="width: 608px;"><tbody>
<tr> <td valign="top" width="113">システムモデル</td> <td valign="top" width="493">x[t]=x[-t1]+v (※vは標準正規分布のノイズ)</td> </tr>
<tr> <td valign="top" width="113">観測モデル</td> <td valign="top" width="493">y[t]=x[t]+w (※w=0と設定)</td> </tr>
<tr> <td valign="top" width="113">粒子設計</td> <td valign="top" width="493">Particles[粒子数][構造] (構造[0:位置情報,1:重み情報])</td> </tr>
<tr> <td valign="top" width="113">尤度の計算</td> <td valign="top" width="493">標準正規分布を使用</td> </tr>
<tr> <td valign="top" width="113">正規分布の偏差</td> <td valign="top" width="493">直近データより取得</td> </tr>
<tr> <td valign="top" width="113">リターン値</td> <td valign="top" width="493">直近の終値を基準にした予測値(黄線)と答えとなる終値(赤線)</td> </tr>
</tbody></table>
<br />
【パラメータ】<br />
<table border="1" cellpadding="1" cellspacing="0" style="width: 609px;"><tbody>
<tr> <td valign="top" width="154">int Particles_vol =1000;</td> <td valign="top" width="453">粒子数量を設定するパラメータ </td> </tr>
<tr> <td valign="top" width="154">int Range = 100;</td> <td valign="top" width="453">試行範囲(粒子数量×試行回数で計算量が増えるので注意)</td> </tr>
<tr> <td valign="top" width="154">int sigmaperiod =100;</td> <td valign="top" width="453">標準正規分布のパラメター(偏差)を取得するための計算範囲</td> </tr>
<tr> <td valign="top" width="154">double Set = 3000.0;</td> <td valign="top" width="453">粒子の初期設定の一様分布の範囲(pipsで記載) -Set<= Particles[][0] <=Set </td> </tr>
</tbody></table>
<br />
【コード】<br />
<div style="background-color: whitesmoke;">
<pre><code>
<span style="color: grey;">//+------------------------------------------------------------------+
//| SMCFilter.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
</span><span style="color: blue;">#property</span> <span style="color: blue;">copyright</span> <span style="color: teal;">"Copyright 2012, MetaQuotes Software Corp."
</span><span style="color: blue;">#property</span> <span style="color: blue;">link</span> <span style="color: teal;">"http://www.metaquotes.net"
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_separate_window
</span><span style="color: grey;">//#property indicator_chart_window
</span><span style="color: blue;">#define</span> PI <span style="color: green;">3.1415926
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_buffers</span> <span style="color: green;">2
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_color1</span> <span style="color: #333399;">Yellow
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_width1</span> <span style="color: green;">1
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_color2</span> <span style="color: #333399;">Red
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_width2</span> <span style="color: green;">1
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> Particles_vol <span style="color: navy;">=</span> <span style="color: green;">1000</span><span style="color: navy;">;</span><span style="color: grey;">//粒子の数
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> Range <span style="color: navy;">=</span> <span style="color: green;">100</span><span style="color: navy;">;</span><span style="color: grey;">//試行範囲
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> sigmaperiod <span style="color: navy;">=</span> <span style="color: green;">100</span><span style="color: navy;">;</span><span style="color: grey;">//偏差取得期間
</span><span style="color: blue;">extern</span> <span style="color: blue;">double</span> Set <span style="color: navy;">=</span> <span style="color: green;">3000.0</span><span style="color: navy;">;</span><span style="color: grey;">//初期化範囲(pips)
</span><span style="color: blue;">double</span> Linebuf<span style="color: navy;">[];
</span></code><code bgcolor="#ccffcc" text="#000000"><span style="color: blue;"><span style="color: blue;">double</span> ans<span style="color: navy;">[];</span></span><span style="color: navy;">
</span><span style="color: navy;"><code bgcolor="#ccffcc" text="#000000"><span style="color: blue;">double</span> Particles<span style="color: navy;">[][</span><span style="color: green;">2</span><span style="color: navy;">]; </span></code>
</span><span style="color: grey;">//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> init<span style="color: navy;">()
</span> <span style="color: navy;">{
</span><span style="color: grey;">//---- indicators
</span> <span style="color: blueviolet;">SetIndexStyle</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">,</span> <span style="color: #333399;">DRAW_LINE</span><span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexBuffer</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">,</span>Linebuf<span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexEmptyValue</span><span style="color: navy;">(</span> <span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">);</span>
<span style="color: blueviolet;">SetIndexStyle</span><span style="color: navy;">(</span><span style="color: green;">1</span><span style="color: navy;">,</span> <span style="color: #333399;">DRAW_LINE</span><span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexBuffer</span><span style="color: navy;">(</span><span style="color: green;">1</span><span style="color: navy;">,</span>ans<span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexEmptyValue</span><span style="color: navy;">(</span> <span style="color: green;">1</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: grey;">//乱数の初期化
</span> <span style="color: blueviolet;">MathSrand</span><span style="color: navy;">(</span><span style="color: blueviolet;">TimeLocal</span><span style="color: navy;">());
</span> <span style="color: blueviolet;">ArrayResize</span><span style="color: navy;">(</span>Particles<span style="color: navy;">,</span>Particles_vol<span style="color: navy;">);</span>
<span style="color: grey;">//----
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|粒子の初期化 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">void</span> setparticles<span style="color: navy;">(</span><span style="color: blue;">double</span> <span style="color: navy;">&</span> pobj<span style="color: navy;">[][],</span><span style="color: blue;">int</span> range<span style="color: navy;">,</span><span style="color: blue;">double</span> set<span style="color: navy;">){
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span><span style="color: blue;">int</span> i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>Particles_vol<span style="color: navy;">;</span>i<span style="color: navy;">++){
</span> Particles<span style="color: navy;">[</span>i<span style="color: navy;">][</span><span style="color: green;">0</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> data<span style="color: navy;">(</span>range<span style="color: navy;">)+(((</span>set<span style="color: navy;">*</span><span style="color: green;">2</span><span style="color: navy;">)/</span>Particles_vol<span style="color: navy;">)*</span>i<span style="color: navy;">-</span>set<span style="color: navy;">)*</span><span style="color: magenta;">Point</span><span style="color: navy;">;
</span> Particles<span style="color: navy;">[</span>i<span style="color: navy;">][</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> <span style="color: green;">0</span><span style="color: navy;">;</span>
<span style="color: navy;">}
</span> <span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|乱数の成形 0<=random<1 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">double</span> random<span style="color: navy;">(){
</span> <span style="color: blue;">double</span> rd <span style="color: navy;">=</span> <span style="color: blueviolet;">MathRand</span><span style="color: navy;">();
</span> rd<span style="color: navy;">/=</span> <span style="color: green;">32768</span><span style="color: navy;">;
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span>rd<span style="color: navy;">);
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|正規分布を計算 mu:平均 sigma:偏差 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">double</span> normal<span style="color: navy;">(</span><span style="color: blue;">double</span> x<span style="color: navy;">,</span><span style="color: blue;">double</span> sigma<span style="color: navy;">){
</span> <span style="color: blue;">double</span> mu <span style="color: navy;">=</span> <span style="color: green;">0</span><span style="color: navy;">;
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: blueviolet;">MathExp</span><span style="color: navy;">(-</span><span style="color: blueviolet;">MathPow</span><span style="color: navy;">((</span>x<span style="color: navy;">-</span>mu<span style="color: navy;">),</span><span style="color: green;">2</span><span style="color: navy;">)/(</span><span style="color: green;">2</span><span style="color: navy;">*</span>sigma<span style="color: navy;">*</span>sigma<span style="color: navy;">))/(</span><span style="color: blueviolet;">MathSqrt</span><span style="color: navy;">(</span><span style="color: green;">2</span><span style="color: navy;">*</span>PI<span style="color: navy;">)*</span>sigma<span style="color: navy;">));
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|正規分布となる乱数の成形 mu:平均 sigma:偏差 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">double</span> normalrand<span style="color: navy;">(</span><span style="color: blue;">double</span> sigma<span style="color: navy;">){
</span> <span style="color: blue;">double</span> mu <span style="color: navy;">=</span> <span style="color: green;">0</span><span style="color: navy;">;
</span> <span style="color: blue;">double</span> t<span style="color: navy;">,</span>u<span style="color: navy;">,</span>r1<span style="color: navy;">,</span>r2<span style="color: navy;">;
</span> sigma <span style="color: navy;">=</span> <span style="color: blueviolet;">MathSqrt</span><span style="color: navy;">(</span>sigma<span style="color: navy;">);
</span> t<span style="color: navy;">=</span><span style="color: blueviolet;">MathSqrt</span><span style="color: navy;">(-</span><span style="color: green;">2.0</span><span style="color: navy;">*</span><span style="color: blueviolet;">MathLog</span><span style="color: navy;">(</span><span style="color: green;">1</span><span style="color: navy;">-</span>random<span style="color: navy;">()));
</span> u<span style="color: navy;">=</span><span style="color: green;">2</span><span style="color: navy;">*</span>PI<span style="color: navy;">*</span>random<span style="color: navy;">();
</span> r1<span style="color: navy;">=</span>t<span style="color: navy;">*</span><span style="color: blueviolet;">MathCos</span><span style="color: navy;">(</span>u<span style="color: navy;">);
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span>r1<span style="color: navy;">*</span>sigma<span style="color: navy;">+</span>mu<span style="color: navy;">);
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|リサンプリング q:粒子数 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">void</span> resample<span style="color: navy;">(</span><span style="color: blue;">int</span> q<span style="color: navy;">,</span><span style="color: blue;">double</span> <span style="color: navy;">&</span>pobj<span style="color: navy;">[][]</span> <span style="color: navy;">){
</span> <span style="color: blue;">double</span> wt<span style="color: navy;">[];
</span> <span style="color: blue;">double</span> rd<span style="color: navy;">;
</span> <span style="color: blue;">int</span> i<span style="color: navy;">,</span>j<span style="color: navy;">;
</span>
<span style="color: grey;">//粒子のコピー
</span> <span style="color: blue;">double</span> copyp<span style="color: navy;">[][</span><span style="color: green;">2</span><span style="color: navy;">];
</span> <span style="color: blueviolet;">ArrayResize</span><span style="color: navy;">(</span>copyp<span style="color: navy;">,</span>q<span style="color: navy;">);
</span> <span style="color: blueviolet;">ArrayCopy</span><span style="color: navy;">(</span>copyp<span style="color: navy;">,</span>pobj<span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: green;">0</span><span style="color: navy;">,</span>q<span style="color: navy;">*</span><span style="color: green;">2</span><span style="color: navy;">);
</span>
<span style="color: grey;">//累計重み
</span> <span style="color: blueviolet;">ArrayResize</span><span style="color: navy;">(</span>wt<span style="color: navy;">,</span>q<span style="color: navy;">);
</span> wt<span style="color: navy;">[</span><span style="color: green;">0</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> pobj<span style="color: navy;">[</span><span style="color: green;">0</span><span style="color: navy;">][</span><span style="color: green;">2</span><span style="color: navy;">];
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">1</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>q<span style="color: navy;">;</span>i<span style="color: navy;">++)</span> wt<span style="color: navy;">[</span>i<span style="color: navy;">]=</span>wt<span style="color: navy;">[</span>i<span style="color: navy;">-</span><span style="color: green;">1</span><span style="color: navy;">]+</span>pobj<span style="color: navy;">[</span>i<span style="color: navy;">][</span><span style="color: green;">2</span><span style="color: navy;">];
</span>
<span style="color: grey;">//リサンプリング(ルーレット法)
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>q<span style="color: navy;">;</span>i<span style="color: navy;">++){
</span> rd <span style="color: navy;">=</span> random<span style="color: navy;">()/</span>Particles_vol<span style="color: navy;">;
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>j<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>j<span style="color: navy;"><</span>q<span style="color: navy;">;</span>j<span style="color: navy;">++){
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>rd <span style="color: navy;">></span> wt<span style="color: navy;">[</span>j<span style="color: navy;">]){
</span> <span style="color: blue;">continue</span><span style="color: navy;">;
</span> <span style="color: navy;">}</span><span style="color: blue;">else</span><span style="color: navy;">{
</span> pobj<span style="color: navy;">[</span>i<span style="color: navy;">][</span><span style="color: green;">0</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> copyp<span style="color: navy;">[</span>j<span style="color: navy;">][</span><span style="color: green;">0</span><span style="color: navy;">];
</span> pobj<span style="color: navy;">[</span>i<span style="color: navy;">][</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> <span style="color: green;">0</span><span style="color: navy;">;</span>
<span style="color: blue;">break</span><span style="color: navy;">;
</span> <span style="color: navy;">}
</span> <span style="color: navy;">}</span>
<span style="color: navy;">}
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|尤度計算および重み付け |
//+------------------------------------------------------------------+
</span><span style="color: blue;">void</span> wlikelihood<span style="color: navy;">(</span><span style="color: blue;">double</span> price<span style="color: navy;">,</span><span style="color: blue;">int</span> p<span style="color: navy;">,</span><span style="color: blue;">double</span> sigma<span style="color: navy;">,</span><span style="color: blue;">double</span> <span style="color: navy;">&</span>pobj<span style="color: navy;">[][]){
</span> <span style="color: blue;">double</span> alfa<span style="color: navy;">[];
</span> <span style="color: blue;">double</span> wsum<span style="color: navy;">;
</span> <span style="color: blue;">double</span> g <span style="color: navy;">=</span> <span style="color: green;">1</span><span style="color: navy;">;</span> <span style="color: grey;">//Gの偏微分の値
</span> <span style="color: blue;">int</span> i<span style="color: navy;">;
</span> <span style="color: blueviolet;">ArrayResize</span><span style="color: navy;">(</span>alfa<span style="color: navy;">,</span>p<span style="color: navy;">);
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>p<span style="color: navy;">;</span>i<span style="color: navy;">++){
</span> alfa<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> normal<span style="color: navy;">((</span>price<span style="color: navy;">-</span>pobj<span style="color: navy;">[</span>i<span style="color: navy;">][</span><span style="color: green;">0</span><span style="color: navy;">]),</span>sigma<span style="color: navy;">)*</span>g<span style="color: navy;">;</span><span style="color: grey;">//(尤度)
</span> wsum <span style="color: navy;">+=</span> alfa<span style="color: navy;">[</span>i<span style="color: navy;">];
</span> <span style="color: navy;">}
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>wsum<span style="color: navy;"><</span><span style="color: green;">1</span><span style="color: navy;">)</span>wsum<span style="color: navy;">=</span><span style="color: green;">1</span><span style="color: navy;">;
</span> <span style="color: grey;">//正規化
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>p<span style="color: navy;">;</span>i<span style="color: navy;">++)</span>pobj<span style="color: navy;">[</span>i<span style="color: navy;">][</span><span style="color: green;">1</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> alfa<span style="color: navy;">[</span>i<span style="color: navy;">]/</span>wsum<span style="color: navy;">;
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|対象データ |
//+------------------------------------------------------------------+
</span><span style="color: blue;">double</span> data<span style="color: navy;">(</span><span style="color: blue;">int</span> index<span style="color: navy;">){
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: magenta;">Close</span><span style="color: navy;">[</span>index<span style="color: navy;">]);
}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//|偏差の取得 |
//+------------------------------------------------------------------+
</span><span style="color: blue;">double</span> setsigma<span style="color: navy;">(</span><span style="color: blue;">int</span> range<span style="color: navy;">,</span><span style="color: blue;">int</span> index<span style="color: navy;">){
</span> <span style="color: blue;">int</span> i<span style="color: navy;">;
</span> <span style="color: blue;">double</span> sum<span style="color: navy;">,</span>av<span style="color: navy;">;
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>range<span style="color: navy;">;</span>i<span style="color: navy;">++)</span>av <span style="color: navy;">+=</span> data<span style="color: navy;">(</span>index<span style="color: navy;">+</span>i<span style="color: navy;">);
</span> av <span style="color: navy;">/=</span> range<span style="color: navy;">;</span>
<span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>i<span style="color: navy;"><</span>range<span style="color: navy;">;</span>i<span style="color: navy;">++)</span>sum <span style="color: navy;">+=</span> <span style="color: blueviolet;">MathPow</span><span style="color: navy;">((</span>data<span style="color: navy;">(</span>index<span style="color: navy;">+</span>i<span style="color: navy;">)-</span>av<span style="color: navy;">),</span><span style="color: green;">2</span><span style="color: navy;">);
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: blueviolet;">MathSqrt</span><span style="color: navy;">(</span>sum<span style="color: navy;">/</span>range<span style="color: navy;">));</span>
<span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> start<span style="color: navy;">(){
</span> <span style="color: blue;">double</span> v<span style="color: navy;">;</span><span style="color: grey;">//乱数
</span> <span style="color: blue;">double</span> sum<span style="color: navy;">,</span>sigma<span style="color: navy;">,</span>limit<span style="color: navy;">;
</span> <span style="color: blue;">int</span> i<span style="color: navy;">,</span>j<span style="color: navy;">;
</span> <span style="color: blue;">static</span> <span style="color: blue;">datetime</span> now <span style="color: navy;">=</span> <span style="color: green;">0</span><span style="color: navy;">;
</span> <span style="color: blue;">int</span> counted_bars<span style="color: navy;">=</span><span style="color: blueviolet;">IndicatorCounted</span><span style="color: navy;">();
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>counted_bars<span style="color: navy;"><</span><span style="color: green;">1</span><span style="color: navy;">)</span>i<span style="color: navy;">=</span>Range<span style="color: navy;">;</span> <span style="color: blue;">else</span> i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;
</span>
<span style="color: blue;">if</span><span style="color: navy;">(</span>now<span style="color: navy;">==</span><span style="color: green;">0</span><span style="color: navy;">)</span>setparticles<span style="color: navy;">(</span>Particles<span style="color: navy;">,</span>Range<span style="color: navy;">,</span>Set<span style="color: navy;">);
</span> <span style="color: grey;">//limit =Set*Point;
</span> <span style="color: blue;">while</span><span style="color: navy;">(</span>i<span style="color: navy;">>=</span><span style="color: green;">0</span><span style="color: navy;">){
</span> <span style="color: grey;">//各bar一回のみ実行
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>now<span style="color: navy;">!=</span><span style="color: magenta;">Time</span><span style="color: navy;">[</span>i<span style="color: navy;">]){
</span> now<span style="color: navy;">=</span><span style="color: magenta;">Time</span><span style="color: navy;">[</span>i<span style="color: navy;">];
</span> sigma<span style="color: navy;">=</span>setsigma<span style="color: navy;">(</span>sigmaperiod<span style="color: navy;">,</span>i<span style="color: navy;">);
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span>j<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>j<span style="color: navy;"><</span>Particles_vol<span style="color: navy;">;</span>j<span style="color: navy;">++){
</span> Particles<span style="color: navy;">[</span>j<span style="color: navy;">][</span><span style="color: green;">0</span><span style="color: navy;">]</span> <span style="color: navy;">=</span> Particles<span style="color: navy;">[</span>j<span style="color: navy;">][</span><span style="color: green;">0</span><span style="color: navy;">]</span> <span style="color: navy;">+</span> normalrand<span style="color: navy;">(</span>sigma<span style="color: navy;">);</span>
<span style="color: navy;">}
</span>
<span style="color: grey;">//尤度推定
</span> wlikelihood<span style="color: navy;">(</span>data<span style="color: navy;">(</span>i<span style="color: navy;">+</span><span style="color: green;">1</span><span style="color: navy;">),</span>Particles_vol<span style="color: navy;">,</span>sigma<span style="color: navy;">,</span>Particles<span style="color: navy;">);
</span> <span style="color: grey;">//リサンプリング
</span> resample<span style="color: navy;">(</span>Particles_vol<span style="color: navy;">,</span>Particles<span style="color: navy;">);</span>
<span style="color: grey;">//加重付平均
</span> sum<span style="color: navy;">=</span><span style="color: green;">0.0</span><span style="color: navy;">;</span>
<span style="color: blue;">for</span><span style="color: navy;">(</span>j<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>j<span style="color: navy;"><</span>Particles_vol<span style="color: navy;">;</span>j<span style="color: navy;">++)</span>sum <span style="color: navy;">+=</span> <span style="color: navy;">(</span>Particles<span style="color: navy;">[</span>j<span style="color: navy;">][</span><span style="color: green;">0</span><span style="color: navy;">])*</span>Particles<span style="color: navy;">[</span>j<span style="color: navy;">][</span><span style="color: green;">1</span><span style="color: navy;">];
</span>
Linebuf<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> sum<span style="color: navy;">;
</span> <span style="color: navy;">}
</span> ans<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> data<span style="color: navy;">(</span>i<span style="color: navy;">);</span><span style="color: grey;">//答え
</span> i<span style="color: navy;">--;
</span> <span style="color: navy;">}
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+</span>
</code></pre>
</div>
<br />
<h2>
テスト</h2>
稼働させると以下の様になります。<br />
<a href="http://lh5.ggpht.com/-YhmgQVjV3sM/T8I2ParhjiI/AAAAAAAAAog/qygf7Y7OniY/s1600-h/5598%25255B10%25255D.png"><img alt="5598" border="0" height="405" src="http://lh4.ggpht.com/-QIXqOSzn4Es/T8I2SJRpKoI/AAAAAAAAAoo/hhJrel5h69g/5598_thumb%25255B8%25255D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="5598" width="614" /></a> <br />
今回のテストでは、直前の終値から次の終値は、ほとんど変化しないという条件で作成したため、このような結果となりました。<br />
<br />
<h2>
まとめ</h2>
今回は、線形・ガウス(正規分布)のモデルを使用しましたが、この手法は、非線形・非ガウスへ対応ができる手法の様です。(<a href="http://www.ieice.org/jpn/books/kaishikiji/2005/200512.pdf">参考</a>)(・・? 参考までに。。<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com0tag:blogger.com,1999:blog-6027720561701794729.post-48658296965359680452012-04-15T02:20:00.001+09:002012-04-15T02:24:47.751+09:00検証してみました。対数正規分布のネタを拡張して検証してみることにしました。また、今回調べた内容は、すべてUSDJPYのみです。他通貨で調べていないので、別の結果になるかもしれませんので注意してください。<br />
<br />
<h2>
対数正規分布を正規分布で見みる。</h2>
<a href="http://expertadviser-bighope.blogspot.jp/2012/03/blog-post.html">「対数正規分布を調べてみた。」</a>では、対数正規分布で表示していましたが、正規分布で見てみると、以下の様になります。※タイムフレームは、M30です。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ_hTjkeA03nnTZSGLnBcS50IVz6tggBo0K0BclTP5C0eqxhW7M7PifdH3nCQYDh0nuiYhszdLEsimBb6j-OrNdh5Pm9SjPJiMdpnoDGE9S931Y0r3sVHzOkn7E1ue4mxihsD66kNtzzc/s1600-h/seikiM30%25255B4%25255D.png"><img alt="seikiM30" border="0" height="318" src="http://lh6.ggpht.com/-4gdOGa84tqk/T4mxwUDP0uI/AAAAAAAAAm0/2q3a42B0LG0/seikiM30_thumb%25255B2%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="seikiM30" width="640" /></a> <br />
※この図の横軸は、対数化されています。<br />
次の図は、上図の縦軸を対数化したものです。テールの部分に多少ズレはありますがうまくフィットしているように見えます。<br />
<a href="http://lh3.ggpht.com/-Y3g9b4SIHh0/T4mxxaw0XFI/AAAAAAAAAm8/zsIzqziFG-8/s1600-h/sam30taisu%25255B8%25255D.png"><img alt="sam30taisu" border="0" height="318" src="http://lh5.ggpht.com/-VgD_ay-Z2UM/T4mxyKn31OI/AAAAAAAAAnE/Vq5JjpZJx74/sam30taisu_thumb%25255B6%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="sam30taisu" width="640" /></a> <br />
<h2>
<br /></h2>
<h2>
ln(open[n-1]/open[n])*1000を試してみる。</h2>
本来は、ln(close[n-1]/close[n])*10000で行うそうですが、癖?自分の決まり?でopenを採用しました。 <br />※LN=lnです。ブログの性質上大文字になっています。<br />
上記の図と同条件で表示させてみると、以下の様になりました。<br />
<a href="http://lh5.ggpht.com/-34yU4llxUyw/T4mxzGbDy-I/AAAAAAAAAnM/tgxzzf6XK7g/s1600-h/sdopenm30%25255B4%25255D.png"><img alt="sdopenm30" border="0" height="370" src="http://lh6.ggpht.com/-7GW2SBpCN_k/T4mx0BNsSvI/AAAAAAAAAnU/PhYHUsivONw/sdopenm30_thumb%25255B2%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="sdopenm30" width="640" /></a> <br />
<br />
また、同様に、縦軸も対数化下のが以下の図です。<br />
<a href="http://lh5.ggpht.com/-OZTrfGXabfw/T4mx1T3--lI/AAAAAAAAAnY/8sLyCY6BjHw/s1600-h/sdm30lg%25255B4%25255D.png"><img alt="sdm30lg" border="0" height="382" src="http://lh6.ggpht.com/-QB_XEZR4K_8/T4mx2TuX6sI/AAAAAAAAAnk/_m0w7sKobE4/sdm30lg_thumb%25255B2%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="sdm30lg" width="640" /></a> <br />
全体的にフィットしていない様に見えます。また、特にテール部分が、フィットしていないのが気になります。もっとわかりやすくするために、正規分布(赤色)のデータを省いて表示させると、以下の様になります。<br />
<a href="http://lh6.ggpht.com/-TF94tGWwjks/T4mx3A20NMI/AAAAAAAAAns/Z1eO1fuMg6U/s1600-h/sdm30pin%25255B4%25255D.png"><img alt="sdm30pin" border="0" height="382" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjERnFd4Gybh51r0M86yNcNi4h-ddbVPmO4XEhwMhrJ9al9hKOKaWnUogAG1jUqaRiwGXd4NQ3qi2mwZsexFhlr1DF3DQ-Fb8KmQ4Ttkcnh5B0-Dp2jXaczI4aq1nNeTi-2mHxy4NGGRJw/?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="sdm30pin" width="640" /></a> <br />
青色の線が2本の直線でできているように見えます。縦軸と横軸の両軸が対数化され、直線に見える分布と言えば、べき分布です。べき分布に関しては、以前にネタにしていますので<a href="http://expertadviser-bighope.blogspot.jp/2010/01/blog-post.html">ココ</a>を参考にしてください。前回は、絶対値を用いて検証したので、一本の線になっています。<br />
<br />
タイムフレームを1Dにして同様に行ったのが以下の図です。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLvZqCG1ZEj7Z5TQkfzGSQYSXSpQXedC6c6AeElVAeg2o-PpU3z4qGZZioVLJfBSb6QF2e7zn0SBalPVtBsITVX8GM9wDQ5stOXDeBodcJHhTZPbJsvkY_yOukAzN3LRNVAonlb-xAu8Q/s1600-h/sd24ss%25255B4%25255D.png"><img alt="sd24ss" border="0" height="386" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYUzk9MXvLj3qYz8k1zGCv8qkVkMoIjohwM1s1qv28ppq7nuz_qWDfCZpkYTDLvioNGVYQk2xubhv2FYqtxYXxwJoeIc-CMOwzcUT8DOHHMvTGpmP1v2qnwLQj3pKCtDJejsf_vyVV9MQ/?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="sd24ss" width="640" /></a> <br />
タイムフレームを上げると正規分布(横軸が対数化されたもの)に近づいた様に見えます。同様に縦軸を対数化し、青色の線のみ表示させると、青線が丸みを帯びてきていることが解ると思います。<br />
<a href="http://lh6.ggpht.com/-nd8-j3jKUiM/T4mx6uJKcDI/AAAAAAAAAoM/YMOT8W49EdA/s1600-h/sd24sing%25255B4%25255D.png"><img alt="sd24sing" border="0" height="386" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxq_rp8-VvmVZa6Guov1FxxHg2xJiKo0sWAGE_jjdQGojYJc5QHmR5tYUV3G6oSIVm_7zPgzjn1SJOmzXb1BBPllzKdjQ8vNeo2TAgoTb5EeppnEcWJ7REf5S7o2MabP__9yHzMEdpVkE/?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="sd24sing" width="640" /></a> <br />
<br />
べき分布を調べた時と同じ現象です。<br />
以下の図は、タイムフレームごとにまとめた図です。(以前作成した物)<br />
<br />
<img height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6tPAAPNN2olA8maE6Gf5zl3RFq2JT8W2XXpMSpDAmI0C_PAw5Ss1pznaH-JcKLthobWeTyOf_kc7-LKdzahSGMpoxDgQFOjB1RDx5iqN2XOIJtrrvaC_blyOvlztG8MintNUH0U0UN_A/s1600/%E3%83%99%E3%82%AD%E3%82%B0%E3%83%A9%E3%83%95%EF%BC%92.bmp" width="624" /> <br />
<h2>
</h2>
<h2>
その他</h2>
ln(高値/安値)*1000も試してみましたが、正規分布とは、ほど遠い結果となりました。 <br />図は、削除してしまいました。。orz 気になる方は、自作してみてください。<br />
<h2>
</h2>
<h2>
まとめ</h2>
便宜上ln(高値-安値)を使用していますが、窓が開いた時にうまく反映されない問題があります。その為、ATRのTRUE RANGEを使用したほうが良いと思います。 <br />上記の内容からリスクを見積る場合、低いタイムフレームで、ln(open[n-1]/open[n])*1000を使用するのは避けたほうがよさそうという結果になりました。<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com1tag:blogger.com,1999:blog-6027720561701794729.post-77944694448807318822012-03-29T22:40:00.001+09:002012-04-07T23:27:20.035+09:00Sqlite3を使って相互のデータを確認できるか試してみた。<div style="color: red;">
※
<span dir="ltr">kartzさんにご指摘頂いた内容を訂正しました。2012/3/30</span><br />
<span dir="ltr">※2012/4/5作成したコードを変更しました。【<a href="https://docs.google.com/file/d/0B42sh1xkCfgtSHdPUUNiSzBScFNtNG14QWdGbnVIUQ/edit">sqlite3_wrapper_2.0.zip</a>】</span><br />
<span dir="ltr">※2012/4/7に追記しました。 </span></div>
テストの内容は、以下のとおりです。また、作成したコードは、<a href="https://docs.google.com/open?id=0B42sh1xkCfgtSHdPUUNiSzBScFNtNG14QWdGbnVIUQ">ココ</a>にあります。<br />
<ol>
<li>MT4(A)のデータをコピーし、データベースに保存する。 </li>
<li>データベースからMT4(B)へデータを送る。 <br />※イメージ的にはこんな感じになります。 </li>
</ol>
<blockquote>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNQeiTMqkmUPNOLFWjW_y83IHE5J_VvpadBeTHT-QvC6q5ZunBQghNJ8iF_-1z_93jU0jcdvZDg_Zv3mWo-Dnb0QrYlT_59d3NsOOcUKOVSMzzqWeTi2oBxDR-A0jrEM3SwFXrIf1AMHo/s1600-h/334%25255B6%25255D.png"><img alt="334" border="0" height="257" src="http://lh4.ggpht.com/-QPgkGeu4w7Q/T3RmOTb2SZI/AAAAAAAAAmE/ugS-IiIY-KM/334_thumb%25255B3%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="334" width="349" /></a> </blockquote>
<br />
<h2>
DLLの追記</h2>
<a href="http://expertadviser-bighope.blogspot.jp/2011/03/mt4.html">前に紹介したSqlite3のwrapper</a>にSqlite3関数を直接操作する関数を追加しました。 <br />
※追加作成した関数には、_nを追記しています。なお、以下は抜粋したものです。<br />
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:13390326-12d3-4df3-a26f-3bf27e6a9314" style="display: inline; float: none; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<pre class="c" name="code">////////////////////////////////////////////////////////////////////////////
//int sqlite_query_n (int handle_db, string sql, int& cols[]);
// handle : sqlite_open_n にて取得
// sql : クエリ
// cols[ ] : int cols[1];と設定。列数の合計を受け取る。
// ※戻りデータのあるクリエを発行し、ハンドルを返す。
// ※反復処理は、(sqlite_next_n,sqlite_get_*_n)を使用。
// ※(sqlite_free_query_n)を使用しリセットをおこなう。
// ※戻り値は、実行用のハンドルhandel_qr
////////////////////////////////////////////////////////////////////////////
__declspec(dllexport) int __stdcall sqlite_query_n (int handle_db, const char *sql, int* cols){
sqlite3 *s= (sqlite3 *)handle_db;
sqlite3_stmt *stmt;
int res;
res = sqlite3_prepare (s, sql, strlen (sql), &stmt, NULL);
if (res != SQLITE_OK) return -1;
*cols = sqlite3_column_count (stmt);
return (int)stmt;
}
////////////////////////////////////////////////////////////////////////////
//int sqlite_next_row_n (int handle_qr);
// ※次の行を取得する 。
// ※戻り値(1:あり 0:なし)
////////////////////////////////////////////////////////////////////////////
__declspec(dllexport) int __stdcall sqlite_next_row_n (int handle_qr){
sqlite3_stmt *stmt = (sqlite3_stmt*)handle_qr;
int ret;
ret = sqlite3_step (stmt);
return ret == SQLITE_ROW ? 1 : 0;
//return ret;
}
///////////////////////////////////////////////////////////////////////////
//string sqlite_bind_*_n (int handle_qr,int index,* data);
// ※データの入力
// ※int index 列番号 (1,2,3,4.....)
// ※* data 入力データ
// ※戻り値 エラーコード
///////////////////////////////////////////////////////////////////////////
//文字
__declspec(dllexport) int __stdcall sqlite_bind_text_n (int handle_qr,int index,const char *text){
sqlite3_stmt *stmt = (sqlite3_stmt*)handle_qr;
int ret;
ret = sqlite3_bind_text(stmt,index,text,(int)strlen(text),SQLITE_STATIC);
return ret;
}</pre>
</div>
<br />
<br />
<h2>
MQL4の作成</h2>
【sqlite3.mqh】 Sqlite3wrapper.dllを使用するためのヘッダー<br />
【Import_sqlite.mq4】 データベースにコピーするためのインジケータ<br />
【export_sqlite.mq4】 データベースから値を取得する(今回は、HiとLowのみ)インジケータ<br />
パラメータの説明<br />
<ul>
<li><span style="color: blue;">extern</span> <span style="color: blue;">string</span> Symb <span style="color: navy;">=</span> <span style="color: teal;">"USDJPY"</span>;//通貨ペア名 </li>
<li><span style="color: blue;">extern</span> <span style="color: blue;">int</span> Tframe <span style="color: navy;">=</span> <span style="color: green;">5</span> ;//タイムフレーム(1,5,15,30…) </li>
<li><span style="color: blue;">extern</span> <span style="color: blue;">string</span> DB <span style="color: navy;">=</span> <span style="color: teal;">"C:\\HistData.db"</span> //DB名(絶対パス)
<br />※ 通貨ペア名+タイムフレームでテーブル名を作成します。 </li>
</ul>
<br />
<br />
<h2>
セット</h2>
<ol>
<li>以下の様にセットしてください。
<br />【terminal.exe】と同じ位置にSqlite3.dll
<br />【expertsフォルダ】
<br /> ┣【librariesフォルダ】にSqlite3wrapper.dll <br /> ┣【include】にsqlite3.mqh
<br /> ┗【indicators】にImport_sqlite.mq4、export_sqlite.mq4 </li>
<li>2種類のMT4に同じようにセットします。 </li>
<li>データを抽出する側のMT4を起動させ、チャートを開き新規のデータを取得させます。 </li>
<li>Import_sqlite作動させ、指定した場所にDBが作成されたことを確認します。 </li>
<li>データを取得する側のMT4を起動させて、export_sqliteを作動させます。 <br /> </li>
</ol>
<br />
<br />
<h2>
Build418への対応</h2>
現在、最新版の<a href="http://forum.mql4.com/47037">Build418は、DLLからの戻り値がdoubleの場合にエラーが発生するとの報告が上がっています</a>。そこで、Build418で使用する場合は、double型で取得している部分のコードを文字型で取得する様に変更してやる必要があります。以下がその変更部分です。
<br />
export_sqlite.mq4 コメント化されているコードと変更する。
<br />
<span style="color: grey;">//取得
</span><span style="color: blue;">for</span><span style="color: navy;">(</span>i<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span> i<span style="color: navy;"><</span>limit<span style="color: navy;">;</span> i<span style="color: navy;">++){
</span><span style="color: blue;"> if</span><span style="color: navy;">(</span>sqlite_next_row_n <span style="color: navy;">(</span>handle_qr<span style="color: navy;">)==</span><span style="color: green;">1</span><span style="color: navy;">){
<br /> </span><span style="color: navy;"></span><span style="color: grey;">// Hi[i] = StrToDouble(sqlite_get_col_n(handle_qr, 0));//Build418用
<br /> </span><span style="color: grey;"></span><span style="color: grey;">// Lw[i] = StrToDouble(sqlite_get_col_n(handle_qr, 1));//Build418用
<br /> </span>Hi<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> sqlite_get_col_double_n<span style="color: navy;">(</span>handle_qr<span style="color: navy;">,</span> <span style="color: green;">0</span><span style="color: navy;">);
<br /> </span>Lw<span style="color: navy;">[</span>i<span style="color: navy;">]</span> <span style="color: navy;">=</span> sqlite_get_col_double_n<span style="color: navy;">(</span>handle_qr<span style="color: navy;">,</span> <span style="color: green;">1</span><span style="color: navy;">);
<br /> </span><span style="color: navy;">}</span><br />
<br />
<br />
<span style="color: navy;"><br /></span>
<br />
<h2>
挙動不安定</h2>
<strike>データをDBに送るImport_sqliteは、安定しているのですが、DBからデータを取得するexport_sqliteが、Buildのバージョンによって挙動が不安定になるようです。作動確認したBuildは、409、416、418です。(OS:XP)(・・?</strike><br />
<ul>
<li><strike>409:ヒストリカルデータは取得は出来るが、更新時にDLLエラーが発生しexport_sqliteが停止する。 </strike></li>
<li><strike>416:更新時に挙動が不安定になる。(データ抜けが発生する。) </strike></li>
<li><strike>418:文字型で取得すれば416よりも挙動が安定する。 </strike></li>
</ul>
<div style="color: black;">
<strike>※再確認します。(2012/3/30追記)</strike></div>
<div style="color: black;">
<strike> 確認した内容を記載します。 </strike></div>
<div style="color: black;">
<strike> ※418:ヒストリカルデータは取得できるが、更新時にDLLエラーが発生し停止する。<br /> ※409:更新時に挙動が不安定となった。不安定の原因は、足の作成タイミングのズレが原因?</strike></div>
<div style="color: black;">
<strike> ※416:今回は、テストしていません。。orz</strike></div>
<br />
<div style="color: red;">
(2012/4/7追記)</div>
<div style="color: red;">
現在添付してあるコードでの作動状況を動画で添付しておきます。</div>
<div style="color: red;">
左側:データを取得しDBへ保存及びDBから自データを取得しチャートに表示したものです。</div>
<div style="color: red;">
右側:左側のデータをDBから取得しチャートに表示したものです。</div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/w2cQjV4cuQs?feature=player_embedded' frameborder='0'></iframe></div>
<div style="color: red;">
動画より以下の点が確認できます。</div>
<ul style="color: red;">
<li>左側のチャートは、問題なく作動している。</li>
<li>右側のチャートの指標も新規のBarが確立していれば問題なく作動する。</li>
<li>左側のチャートのBarが確立後に右側のBarが確立すれば問題は起こらない。</li>
<li>指標に問題が発生するのは、右側のチャートのBarが左側のBarよりも早く表示された時。</li>
<li>誤作動が起こった箇所のデータは、Bar[2]のデータを表示している。</li>
</ul>
<div style="color: red;">
となっています。新規Barの発生タイミングのズレが何らかのバグを発生させているのは解りましたが、その後の対応策は現在のところ思いついていません。。。orz</div>
<br />
<br />
<h2>
まとめ</h2>
どんな目的でこれを使用するか?を考えてみると。<br />
<ul>
<li>データの抜け確認用に使用すれば簡単に抜けが確認できそうです。
<br /><a href="http://lh3.ggpht.com/-jqegLzH062Q/T3RmPd_xTuI/AAAAAAAAAmQ/VjocSexLBDI/s1600-h/rrt%25255B3%25255D.png"><img alt="rrt" border="0" height="172" src="http://lh6.ggpht.com/-7qLMJ1YzSGo/T3RmQZpYZfI/AAAAAAAAAmY/0pWDMSNSnCI/rrt_thumb%25255B1%25255D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="rrt" width="341" /></a> <br />上記は、週末・週初の取引時間が違うためにデータ抜けを起こした部分です。 </li>
</ul>
<br />
export_sqliteの挙動を安定させようと試行錯誤してみましたが良い成果を上げることができませんでした。。orz<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com14tag:blogger.com,1999:blog-6027720561701794729.post-65042383853612843122012-03-11T00:31:00.002+09:002012-03-17T21:34:51.294+09:00対数正規分布を調べてみた。母数(x)に対数(今回の基底は、e)をとると正規分布の形となる分布です。<br />
<a href="http://www9.ocn.ne.jp/%7Ethcl/s21.htm">ココ</a>に解りやすくまとめてあります。<br />
<br />
<h2>確立密度関数</h2>パラメータA、B(B>0)と変数xで表すと以下の様になる。<br />
<a href="http://lh6.ggpht.com/-K0J6h6LNhnQ/T1tzlVvBQfI/AAAAAAAAAks/IOwEiiGqSCA/s1600-h/logsd%25255B5%25255D.png"><img alt="logsd" border="0" height="76" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWSftvywCOWpwg3vYRU4wz47Np8nAv5wrYCQJNsLxB-ShqJAunGA7y0e3QNl7q7_dRL67lNtUgqilmeApfb6Ja6G5mqA9ATsFPcDB_MljVcrt4WF1Iq9tFcYyJx_pr-qdmT4CU2cmLnI0/?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="logsd" width="422" /></a> <br />
ただし、0<x<∞,B>0とする。また、一般的な形から加工してあります。<br />
<br />
<br />
<h2>平均と標準偏差</h2>一般的に対数正規分布の平均と言うと以下で挙げる期待値をさす様です。<br />
また、<a href="http://aoki2.si.gunma-u.ac.jp/lecture/mb-arc/wrong-sd.html">ココ</a>で、対数正規分布の標準偏差を解りやすく説明されています。<br />
※参照サイトのTopページは、<a href="http://aoki2.si.gunma-u.ac.jp/">こちら</a>。<br />
<a href="http://lh3.ggpht.com/-ce3CEq9e8ao/T1tznPlzFtI/AAAAAAAAAk4/BOUF0oRoyEU/s1600-h/logsdss%25255B4%25255D.png"><img alt="logsdss" border="0" height="168" src="http://lh3.ggpht.com/-FDc2NJZ9mV4/T1tznwnET1I/AAAAAAAAAlA/WgvcYWzm0qw/logsdss_thumb%25255B2%25255D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="logsdss" width="270" /></a> <br />
<br />
<br />
<h2>最尤度推定によるパラメータ推定</h2>上記に挙げたパラメータA、Bを推定する方法に最尤度推定を使用する。しかし、対数正規分布は、正規分布の特徴により、標本平均と標本分散が同値となるので今回は、、、、。<a href="http://e-sunagawa.net/tei/wp-content/uploads/2010/01/bw_uploadsglKBRI3Flt6WQILJguaC6YNwg4mDgYFbg16QhJLoLnBkZg.pdf">ココ</a>を参考した。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaYtRBWP5cdjdJSEmwIafGaTypQRHv__SMOt_5jGcrN7LCRfUeLoU1JA_G9JIwRRHNYGJM8cBl8DvCt1EPPxNCbbKz4b6AWrue0c89AgIYKePb232INqVjfHVNIdDnjl92bjQNi8fNhbo/s1600-h/AB%25255B4%25255D.png"><img alt="AB" border="0" height="110" src="http://lh4.ggpht.com/-yfc0SCu69wM/T1tzp29BB_I/AAAAAAAAAlU/mxhc20keSOw/AB_thumb%25255B2%25255D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="AB" width="460" /></a> <br />
<br />
<h2>試行</h2>今回試行用に作成したコードを<a href="https://docs.google.com/open?id=0B42sh1xkCfgtamRQb2dGVUtTbkc2cnVvb2RhYXFpUQ">ココ</a>に上げて置きます。<br />
作動させると以下の様になります。<br />
白線:ヒストグラム 緑線:対数正規分布 各縦線は、期待値、中央値、最頻値、標準偏差値(1.96倍してあります。)とし、コメントの色と同色です。<br />
<a href="http://lh4.ggpht.com/-4zih4CuCi2E/T1tzqgV22BI/AAAAAAAAAlc/Eg7QRxhKvnM/s1600-h/2000%25255B14%25255D.png"><img alt="2000" border="0" height="432" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX8p-toQU1amzuMFYhncq_zCpLb3dAU_AtEM5YEFNqjm3QTDl8McjunHp6ioDppk0-ZbMvDCYF8pF2VMJN_3OOJ1MYx5M9qJSxnDTHUPijdwi7cTLH0NZ2CU6qLnBVaFgK1r4hlqRaWto/?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="2000" width="587" /></a> <br />
※標準偏差を1.96倍した範囲内に、95%のデータが入る。<br />
<br />
また、対象データ数を少なくした場合は、以下の様になります。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvV7CwSwJ0bsBx-D4ipKwcMThzhljmF8yV7j65mM_Tbg9GKsRaEijnjdgJMwFWDgLYVLgvAPLrVMeW6kfI_RP5Ezh6cRbhkOGpo2aFR79QMUpNDBTvGm3n1iJCdfIhQk0Q10ONTpIT5HY/s1600-h/100%25255B9%25255D.png"><img alt="100" border="0" height="439" src="http://lh4.ggpht.com/-_9O-WYy4mus/T1tztoQ6API/AAAAAAAAAl0/f3GIbljMeQU/100_thumb%25255B7%25255D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="100" width="593" /></a> <br />
<br />
<br />
<br />
<h2>まとめ</h2>なかなか面白いものが出来たと自画自賛しております。w<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com3tag:blogger.com,1999:blog-6027720561701794729.post-43668061139624775462012-02-19T00:14:00.002+09:002012-03-27T23:52:19.547+09:00GSLでヒストグラム■■■<p>前回の内容に、ヒストグラムを追加しました。ファイルは<a href="https://docs.google.com/open?id=0B42sh1xkCfgtZjZmNWE2MWItMTA4NC00NWYyLWFhN2YtNWNmMmQxOTU1OWMw">ココ</a>にまとめてあります。</p> <h2>DLL追加コード</h2> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:36150445-d277-41f1-95c9-84bedd0f0edc" class="wlWriterEditableSmartContent"><pre name="code" class="c">#include ".\include\gsl\gsl_histogram.h"//ヒストグラム
//+-------------------------------------------------------------------+
//|ヒストグラム (Histgram)
//|input[inp_N] 入力用バッファ
//|out[N] 出力用バッファ
//|inp_N 入力データ数
//|N 階級数
//|min 最小値(含む)
//|max 最大値(含まない)
//+-------------------------------------------------------------------+
__declspec(dllexport) void __stdcall Histgram(double *input,double *out,int inp_N,int N,double min,double max){
int i;
//メモリの確保
gsl_histogram * h = gsl_histogram_alloc(N);
if(h==NULL)exit(0);
//階級のセット
gsl_histogram_set_ranges_uniform(h,min,max);
//実行
for(i=0;i<inp_N;i++)gsl_histogram_increment(h,input[i]);
//出力
for(i=0;i<N;i++)out[i]=gsl_histogram_get(h,i);
//メモリの解放
gsl_histogram_free(h);
}</pre></div>
<h2>MQLコード</h2>
<pre><span style="color: #808080">//+------------------------------------------------------------------+
//| ヒストグラム.mq4 |
//| Copyright ゥ 2012, bighope |
//| http://expertadviser-bighope.blogspot.com/ |
//+------------------------------------------------------------------+
</span><span style="color: #0000ff">#property</span> <span style="color: #0000ff">copyright</span> <span style="color: #008080">"Copyright ゥ 2012, bighope"
</span><span style="color: #0000ff">#property</span> <span style="color: #0000ff">link</span> <span style="color: #008080">"http://expertadviser-bighope.blogspot.com/"
</span><span style="color: #0000ff">#property</span> <span style="color: #0000ff">indicator_separate_window
#property</span> <span style="color: #0000ff">indicator_minimum</span> <span style="color: #008000">0
</span><span style="color: #0000ff">#include</span> <span style="color: #000080"><</span>GSL.mqh<span style="color: #000080">>
</span><span style="color: #0000ff">#property</span> <span style="color: #0000ff">indicator_buffers</span> <span style="color: #008000">3
</span><span style="color: #0000ff">#property</span> <span style="color: #0000ff">indicator_color1</span> <span style="color: #333399">Snow
</span><span style="color: #0000ff">#property</span> <span style="color: #0000ff">indicator_color2</span> <span style="color: #333399">Yellow
</span><span style="color: #0000ff">#property</span> <span style="color: #0000ff">indicator_color3</span> <span style="color: #333399">Red
</span><span style="color: #0000ff">extern</span> <span style="color: #0000ff">string</span> SymbA <span style="color: #000080">=</span> <span style="color: #008080">"USDJPY"</span><span style="color: #000080">;
</span><span style="color: #0000ff">extern</span> <span style="color: #0000ff">int</span> TframeA <span style="color: #000080">=</span> <span style="color: #333399">PERIOD_H1</span><span style="color: #000080">;
</span><span style="color: #0000ff">extern</span> <span style="color: #0000ff">string</span> SymbB <span style="color: #000080">=</span> <span style="color: #008080">"EURUSD"</span><span style="color: #000080">;
</span><span style="color: #0000ff">extern</span> <span style="color: #0000ff">int</span> TframeB <span style="color: #000080">=</span> <span style="color: #333399">PERIOD_H1</span><span style="color: #000080">;
</span><span style="color: #0000ff">extern</span> <span style="color: #0000ff">string</span> SymbC <span style="color: #000080">=</span> <span style="color: #008080">"AUDUSD"</span><span style="color: #000080">;
</span><span style="color: #0000ff">extern</span> <span style="color: #0000ff">int</span> TframeC <span style="color: #000080">=</span> <span style="color: #333399">PERIOD_H1</span><span style="color: #000080">;
</span><span style="color: #0000ff">extern</span> <span style="color: #0000ff">int</span> Range <span style="color: #000080">=</span> <span style="color: #008000">2000</span><span style="color: #000080">;</span><span style="color: #808080">//データ数
</span><span style="color: #0000ff">extern</span> <span style="color: #0000ff">int</span> N <span style="color: #000080">=</span> <span style="color: #008000">100</span><span style="color: #000080">;</span><span style="color: #808080">//階級数
</span><span style="color: #0000ff">extern</span> <span style="color: #0000ff">double</span> min <span style="color: #000080">=</span> <span style="color: #008000">0.0</span><span style="color: #000080">;</span><span style="color: #808080">//階級最小値(pips)
</span><span style="color: #0000ff">extern</span> <span style="color: #0000ff">double</span> max <span style="color: #000080">=</span> <span style="color: #008000">2000.0</span><span style="color: #000080">;</span><span style="color: #808080">//階級最大値(pips)
</span><span style="color: #0000ff">double</span> Ap<span style="color: #000080">[];
</span><span style="color: #0000ff">double</span> Bp<span style="color: #000080">[];
</span><span style="color: #0000ff">double</span> Cp<span style="color: #000080">[];
</span><span style="color: #808080">//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
</span><span style="color: #0000ff">int</span> init<span style="color: #000080">()
</span> <span style="color: #000080">{
</span><span style="color: #808080">//---- indicators
</span> <span style="color: #8a2be2">SetIndexStyle</span><span style="color: #000080">(</span><span style="color: #008000">0</span><span style="color: #000080">,</span><span style="color: #333399">DRAW_LINE</span><span style="color: #000080">);
</span> <span style="color: #8a2be2">SetIndexStyle</span><span style="color: #000080">(</span><span style="color: #008000">1</span><span style="color: #000080">,</span><span style="color: #333399">DRAW_LINE</span><span style="color: #000080">);
</span> <span style="color: #8a2be2">SetIndexStyle</span><span style="color: #000080">(</span><span style="color: #008000">2</span><span style="color: #000080">,</span><span style="color: #333399">DRAW_LINE</span><span style="color: #000080">);
</span>
<span style="color: #8a2be2">SetIndexBuffer</span><span style="color: #000080">(</span><span style="color: #008000">0</span><span style="color: #000080">,</span>Ap<span style="color: #000080">);
</span> <span style="color: #8a2be2">SetIndexBuffer</span><span style="color: #000080">(</span><span style="color: #008000">1</span><span style="color: #000080">,</span>Bp<span style="color: #000080">);
</span> <span style="color: #8a2be2">SetIndexBuffer</span><span style="color: #000080">(</span><span style="color: #008000">2</span><span style="color: #000080">,</span>Cp<span style="color: #000080">);
</span>
<span style="color: #808080">//----
</span> <span style="color: #0000ff">return</span><span style="color: #000080">(</span><span style="color: #008000">0</span><span style="color: #000080">);
</span> <span style="color: #000080">}
</span><span style="color: #808080">//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
</span><span style="color: #0000ff">int</span> deinit<span style="color: #000080">()
</span> <span style="color: #000080">{
</span><span style="color: #808080">//----
</span>
<span style="color: #808080">//----
</span> <span style="color: #0000ff">return</span><span style="color: #000080">(</span><span style="color: #008000">0</span><span style="color: #000080">);
</span> <span style="color: #000080">}
</span><span style="color: #808080">//+------------------------------------------------------------------+
//|GetVal
//|symb 通貨ペア名
//|timeframe タイムフレーム
//|shift Barの位置
//+------------------------------------------------------------------+
</span><span style="color: #0000ff">double</span> GetVal<span style="color: #000080">(</span><span style="color: #0000ff">string</span> symb<span style="color: #000080">,</span><span style="color: #0000ff">int</span> timeframe<span style="color: #000080">,</span><span style="color: #0000ff">int</span> shift<span style="color: #000080">){
</span> <span style="color: #0000ff">double</span> Hi<span style="color: #000080">,</span>Lw<span style="color: #000080">;
</span>
Hi <span style="color: #000080">=</span> <span style="color: #008000">iHigh</span><span style="color: #000080">(</span>symb<span style="color: #000080">,</span>timeframe<span style="color: #000080">,</span>shift<span style="color: #000080">);
</span> Lw <span style="color: #000080">=</span> <span style="color: #008000">iLow</span><span style="color: #000080">(</span>symb<span style="color: #000080">,</span>timeframe<span style="color: #000080">,</span>shift<span style="color: #000080">);
</span>
<span style="color: #0000ff">return</span><span style="color: #000080">(</span>Hi<span style="color: #000080">-</span>Lw<span style="color: #000080">);
}
</span><span style="color: #808080">//+------------------------------------------------------------------+
//|GetData
//|symb 通貨ペア名
//|timeframe タイムフレーム
//|out[Ns] データの取得配列
//|Ns データの取得数
//+------------------------------------------------------------------+
</span><span style="color: #0000ff">void</span> GetData<span style="color: #000080">(</span><span style="color: #0000ff">string</span> symb<span style="color: #000080">,</span><span style="color: #0000ff">int</span> timeframe<span style="color: #000080">,</span><span style="color: #0000ff">double</span> <span style="color: #000080">&</span>out<span style="color: #000080">[],</span><span style="color: #0000ff">int</span> Ns<span style="color: #000080">){
</span> <span style="color: #0000ff">for</span><span style="color: #000080">(</span><span style="color: #0000ff">int</span> i<span style="color: #000080">=</span><span style="color: #008000">0</span><span style="color: #000080">;</span>i<span style="color: #000080"><</span>Ns<span style="color: #000080">;</span>i<span style="color: #000080">++)</span>out<span style="color: #000080">[</span>i<span style="color: #000080">]=</span>GetVal<span style="color: #000080">(</span>symb<span style="color: #000080">,</span>timeframe<span style="color: #000080">,</span>i<span style="color: #000080">);
}
</span><span style="color: #808080">//+------------------------------------------------------------------+
//|GetHist
//|symb 通貨ペア名
//|timeframe タイムフレーム
//|out[Ns] データの取得配列
//|Ns データの取得数
//+------------------------------------------------------------------+
</span><span style="color: #0000ff">void</span> GetHist<span style="color: #000080">(</span><span style="color: #0000ff">string</span> symb<span style="color: #000080">,</span><span style="color: #0000ff">int</span> timeframe<span style="color: #000080">,</span><span style="color: #0000ff">int</span> Ns<span style="color: #000080">,</span><span style="color: #0000ff">double</span> <span style="color: #000080">&</span>data<span style="color: #000080">[]){
</span> <span style="color: #0000ff">int</span> i<span style="color: #000080">;
</span> <span style="color: #0000ff">double</span> count<span style="color: #000080">,</span>minpt<span style="color: #000080">,</span>maxpt<span style="color: #000080">,</span>pt<span style="color: #000080">;
</span> <span style="color: #0000ff">double</span> input<span style="color: #000080">[];
</span> <span style="color: #0000ff">double</span> output<span style="color: #000080">[];
</span> <span style="color: #8a2be2">ArrayResize</span><span style="color: #000080">(</span>input<span style="color: #000080">,</span>Ns<span style="color: #000080">);
</span> <span style="color: #8a2be2">ArrayResize</span><span style="color: #000080">(</span>output<span style="color: #000080">,</span>N<span style="color: #000080">);
</span> <span style="color: #8a2be2">ArrayInitialize</span><span style="color: #000080">(</span>data<span style="color: #000080">,</span><span style="color: #333399">EMPTY_VALUE</span><span style="color: #000080">);
</span>
GetData<span style="color: #000080">(</span>symb<span style="color: #000080">,</span>timeframe<span style="color: #000080">,</span>input<span style="color: #000080">,</span>Ns<span style="color: #000080">);
</span> pt <span style="color: #000080">=</span> <span style="color: #8a2be2">MarketInfo</span><span style="color: #000080">(</span>symb<span style="color: #000080">,</span><span style="color: #333399">MODE_POINT</span><span style="color: #000080">);
</span> minpt <span style="color: #000080">=</span> min<span style="color: #000080">*</span>pt<span style="color: #000080">;
</span> maxpt <span style="color: #000080">=</span> max<span style="color: #000080">*</span>pt<span style="color: #000080">;
</span> Histgram<span style="color: #000080">(</span>input<span style="color: #000080">,</span>output<span style="color: #000080">,</span>Ns<span style="color: #000080">,</span>N<span style="color: #000080">,</span>minpt<span style="color: #000080">,</span>maxpt<span style="color: #000080">);
</span> <span style="color: #0000ff">for</span><span style="color: #000080">(</span>i<span style="color: #000080">=</span><span style="color: #008000">0</span><span style="color: #000080">;</span>i<span style="color: #000080"><</span>N<span style="color: #000080">;</span>i<span style="color: #000080">++)</span>count <span style="color: #000080">+=</span> output<span style="color: #000080">[</span>i<span style="color: #000080">];
</span> <span style="color: #0000ff">if</span><span style="color: #000080">(</span>count<span style="color: #000080">==</span><span style="color: #008000">0</span><span style="color: #000080">)</span>count<span style="color: #000080">=</span><span style="color: #008000">1.0</span><span style="color: #000080">;
</span> <span style="color: #0000ff">for</span><span style="color: #000080">(</span>i<span style="color: #000080">=</span><span style="color: #008000">0</span><span style="color: #000080">;</span>i<span style="color: #000080"><</span>N<span style="color: #000080">;</span>i<span style="color: #000080">++)</span>data<span style="color: #000080">[</span>i<span style="color: #000080">]=</span>output<span style="color: #000080">[</span>i<span style="color: #000080">]/</span>count<span style="color: #000080">;
}
</span><span style="color: #808080">//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
</span><span style="color: #0000ff">int</span> start<span style="color: #000080">()
</span> <span style="color: #000080">{
</span> <span style="color: #0000ff">int</span> counted_bars<span style="color: #000080">=</span><span style="color: #8a2be2">IndicatorCounted</span><span style="color: #000080">();
</span><span style="color: #808080">//----
</span> <span style="color: #0000ff">if</span><span style="color: #000080">(</span>counted_bars<span style="color: #000080"><</span><span style="color: #008000">1</span><span style="color: #000080">){
</span> GetHist<span style="color: #000080">(</span>SymbA<span style="color: #000080">,</span>TframeA<span style="color: #000080">,</span>Range<span style="color: #000080">,</span>Ap<span style="color: #000080">);
</span> GetHist<span style="color: #000080">(</span>SymbB<span style="color: #000080">,</span>TframeB<span style="color: #000080">,</span>Range<span style="color: #000080">,</span>Bp<span style="color: #000080">);
</span> GetHist<span style="color: #000080">(</span>SymbC<span style="color: #000080">,</span>TframeC<span style="color: #000080">,</span>Range<span style="color: #000080">,</span>Cp<span style="color: #000080">);
</span> <span style="color: #000080">}
</span>
<span style="color: #808080">//----
</span> <span style="color: #0000ff">return</span><span style="color: #000080">(</span><span style="color: #008000">0</span><span style="color: #000080">);
</span> <span style="color: #000080">}
</span><span style="color: #808080">//+------------------------------------------------------------------+
</span></pre>
<h2>作動・確認</h2>
<p>デフォルトで作動させると以下の様になります。
<br />※縦軸が、発生確率で横軸が階級です。(チャート右が最少数)(白:USDJPY 1H 黄:EURUSD 1H 赤:AUDUSD 1H)
<br /><span style="font-family: terminal; font-size: x-small"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiCAzExNLTQIhZe84VnIuwTOGs2xWZ3GS58SmAqUIOfzu9BBXCROgg7ghTIQ3wdjC2pNss5jkZSliJQKwmYJWrQaiF1AfYo0xbQhfDgXWiCllFI-Qz_vB0duKJJKj69TMHNgUbm4rcfbo/s1600-h/defo%25255B2%25255D.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="defo" border="0" alt="defo" src="http://lh3.ggpht.com/-c1UQrjo_gsI/Tz_AT1UMsCI/AAAAAAAAAj0/Vep8E-wn_e4/defo_thumb.png?imgmax=800" width="244" height="144" /></a></span>
<br />※お化粧が全くなされていないので見苦しいかもしれませんがご了承ください。^^;</p>
<h2>USDJPYが特異な特徴と示す?</h2>
<p>いろいろ試してみるとUSDJPYだけがなんだか特異な形状を示します。なぜ?
<br />例えば、(白:EURJPY 1H 黄:EURUSD 1H 赤:USDCHF 1H)だと
<br /><a href="http://lh5.ggpht.com/-h9rz94F3L_A/Tz_AUlD_neI/AAAAAAAAAj8/6yBqnBB0CzU/s1600-h/defo2%25255B2%25255D.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="defo2" border="0" alt="defo2" src="http://lh6.ggpht.com/-n30wtk6tfuc/Tz_AVnRAI-I/AAAAAAAAAkA/kLOT090C2Ww/defo2_thumb.png?imgmax=800" width="244" height="144" /></a>
<br />の様に似たような形になります。
<br />他のペアも試してみましたが、試したペアの中でUSDJPYだけが極端に形状が異なっています。</p>
<p>また、(白:USDJPY 4H 黄:EURUSD 1H 赤:GBPJPY 1H)とした場合は、
<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibZIY07yiIdHW2P5bH1QOdNUkly9vbQW60YdTp0vyo2k5ju8x29wU7EagTRaC-R065aBUBOrADVg3OwHvs9Thk0GJcFGMFgzrSZD2jD0prxFsNUhzXQ3gm5hFefmz8b7fQyrsnLtGn660/s1600-h/defo3%25255B2%25255D.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="defo3" border="0" alt="defo3" src="http://lh5.ggpht.com/--u1HMXXh79g/Tz_AXpnD_nI/AAAAAAAAAkU/C2fIuxxfg4M/defo3_thumb.png?imgmax=800" width="244" height="144" /></a>
<br />となり、似たような形が出現します。</p>
<p>しかし、(白:USDJPY 1D 黄:EURUSD 1D 赤:AUDUSD 1D)となると、
<br /><a href="http://lh6.ggpht.com/-fLGMO9Lk70U/Tz_AYry0ydI/AAAAAAAAAkc/ajnDQjY2RTM/s1600-h/defo4%25255B2%25255D.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="defo4" border="0" alt="defo4" src="http://lh6.ggpht.com/-rsJuCdHVRoY/Tz_AZkFYB9I/AAAAAAAAAkk/1e28HVL186A/defo4_thumb.png?imgmax=800" width="244" height="144" /></a>
<br />特異な形状が解消されたように見えます。(ちなみに、max=5000で表示)</p>
<p> </p>
<h2>まとめ</h2>
<p>全てのペア及びタイムフレームを確認したわけでありませんが、ドル円だけがなぜ特異な形となるのか疑問です。他ペアに比べて突発的事情(イベントやニュース)に敏感に反応(突発的なボラ)し、その他のボラは、低い事を示しているのでしょうか?疑問が残るところです。</p> <div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com0tag:blogger.com,1999:blog-6027720561701794729.post-60046136675730520962012-02-01T00:34:00.004+09:002012-02-02T23:11:39.562+09:00GSLで多項式回帰を試してみた■■■今回は、前回の続きとして、多項式回帰を試してみました。<br />
<br />
<h2>まえがき</h2>今回試してみたのは、Y=C0+Cn×X^Cnの多項式回帰です。<br />
n値を変えることで以下の様に変化します。<br />
n=2の時<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB-jx3p7MsAAVFFHAIXPm8QsAsRXygt4xd_V1yMhE305RzRy90EKuqd-1qMA9sHI825YspOAo6GYRaDkbLIHXjYOLD_fU7mYZ3PjwzxePFijAdytJ7GCM14aJaq_QkqK4FWHaVYsrmaW0/s1600-h/1m%25255B2%25255D.png"><img alt="1m" border="0" height="141" src="http://lh4.ggpht.com/-YI8T3406vhE/TygJ1unVoGI/AAAAAAAAAis/XctnW_fYCg8/1m_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="1m" width="244" /></a> <br />
n=3の時<br />
<a href="http://lh4.ggpht.com/-M3-xwgrCnKo/TygJ2WEePjI/AAAAAAAAAi0/sv96FURYlE4/s1600-h/3m%25255B2%25255D.png"><img alt="3m" border="0" height="141" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhT3XLZc1BOWpXKy4iyLaynWiLQU5NekUVKNa-F3k-ikBDvn2ws_tlLvTw39hi1UH2Gu4DFb_mO147qVWorQlbTpzCFbmKUBgXlnfHHXkOSAJTK0LnvRW21-G0J1glDi_DIlEutCXpzm54/?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="3m" width="244" /></a> <br />
<br />
n=4の時<br />
<a href="http://lh4.ggpht.com/-QDZv6twf9bk/TygJ3kxFzlI/AAAAAAAAAjE/mgVcrAQTbN0/s1600-h/4m%25255B2%25255D.png"><img alt="4m" border="0" height="141" src="http://lh6.ggpht.com/-KxNflP-3-B4/TygJ4siTtDI/AAAAAAAAAjQ/WAsBAUsbUGw/4m_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="4m" width="244" /></a> <br />
<br />
n=10の時<br />
<a href="http://lh5.ggpht.com/-oFIeVsCsn3A/TygJ5mSeOlI/AAAAAAAAAjY/nQs85fMYCuc/s1600-h/10m%25255B2%25255D.png"><img alt="10m" border="0" height="141" src="http://lh4.ggpht.com/-b6JdoDSvoE0/TygJ6S8mlFI/AAAAAAAAAjc/0FSef6R0e0w/10m_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="10m" width="244" /></a> <br />
<br />
<h2>サンプル</h2>サンプルコードは、<a href="https://docs.google.com/open?id=0B42sh1xkCfgtMjM3NjhjMmYtZWJlNC00NWJlLTk5OWEtYjcwYTNkZTBhMmMx">ここ</a>です。<br />
※上記n値は、変数名Pwです。<br />
<br />
<h2>DLLコード</h2>※前回のコードをそのまま残し、修正しました。<br />
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:be2a1c80-4141-47d5-b595-2e252645887d" style="display: inline; float: none; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><pre class="c" name="code">#pragma once
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>//数学用
#include ".\include\gsl\gsl_sort.h"//配列並び替え用
#include ".\include\gsl\gsl_wavelet.h"//ウェーブレット用
#include ".\include\gsl\gsl_multifit.h"//重回帰
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
//----
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
//----
return(TRUE);
}
//+-------------------------------------------------------------------+
//|重回帰(Multifit_liner)Y=c0+c1X+c2X^2+c3X^3...cpwX^pw
//|input[] 入力用バッファ
//|pw 変数量
//|out[pw+1] 出力用バッファ[c0,c1,c2,c3,....cpw.chisq]
//|Ns 対象データ数
//+-------------------------------------------------------------------+
__declspec(dllexport) void __stdcall Multifit_liner(double *input,int pw,double *out,int Ns){
int i,ipw;
double ix,chisq;
gsl_matrix *X, *cov;
gsl_vector *y, *w, *c;
//配列(ベクトル配列)の確保
X = gsl_matrix_alloc(Ns, pw);
y = gsl_vector_alloc(Ns);
c = gsl_vector_alloc(pw);
cov = gsl_matrix_alloc(pw, pw);
//配列(ベクトル配列)入力
for(i=0;i<Ns;i++){
ix = i*0.001;
gsl_matrix_set (X, i, 0, 1.0);
for(ipw=1;ipw<pw;ipw++)gsl_matrix_set (X, i, ipw, pow(ix,ipw));
gsl_vector_set (y, i, input[i]);
}
//処理
gsl_multifit_linear_workspace *work = gsl_multifit_linear_alloc (Ns, pw);
gsl_multifit_linear(X,y,c,cov,&chisq,work);
gsl_multifit_linear_free (work);
//抽出
for(i=0;i<pw;i++)out[i]=gsl_vector_get(c,(i));
out[pw]=chisq;
//メモリ解放
gsl_matrix_free(X);
gsl_matrix_free(cov);
gsl_vector_free(y);
gsl_vector_free(c);
}
//+-------------------------------------------------------------------+
//|ウェーブレット変換(DWT)
//|input[] 入力用バッファ
//|out[] 出力用バッファ
//|Ns 対象データ数(2のNs乗)
//|D ウェーブレット係数(2:Harr 4~daubechies
//|fs フィルタ
//+-------------------------------------------------------------------+
__declspec(dllexport) void __stdcall DWT(double *input,double *out,int Ns,int D,int fs){
int i;
int siz = (int)pow(2.0,Ns);
if(D%2==1)D++;
if(D>20)D=20;
//配列のコピー
memcpy(out,input,sizeof(double)*siz);
//ウェーブレットの初期設定(ウェーブレット名,D値)
gsl_wavelet *w;
if(D==2){
w = gsl_wavelet_alloc(gsl_wavelet_haar,D);
}else{
w = gsl_wavelet_alloc(gsl_wavelet_daubechies, D);
}
//作業領域の確保(数量)
gsl_wavelet_workspace *work;
work = gsl_wavelet_workspace_alloc(siz);
size_t *p = (size_t *)malloc(siz * sizeof(size_t));
double *abs = (double *)malloc(siz * sizeof (double));
if (abs == NULL || p== NULL){printf("メモリを確保できません"); exit(0);}
//変換(初期設定,データ,進み幅,作業エリア)
gsl_wavelet_transform_forward(w, out, 1, siz,work);
//フィルタ作業
for(i = 0; i < siz; i++) abs[i] = fabs(out[i]);
gsl_sort_index(p, abs, 1, siz);
for(i = 0; (i + fs) < siz; i++) out[p[i]] = 0;
//逆変換
gsl_wavelet_transform_inverse(w, out, 1, siz, work);
//メモリ解放
free(abs);
free(p);
gsl_wavelet_workspace_free(work);
gsl_wavelet_free(w);
}
//----------------------------------------------------------------------------
</pre></div><h2>まとめ</h2>適用範囲を広くとりすぎたり、n値を大きくしすぎるとバグが発生する可能性がありますので注意してください。<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com0tag:blogger.com,1999:blog-6027720561701794729.post-78260212404818536952012-01-12T23:23:00.005+09:002012-02-02T23:11:17.107+09:00GSLをMT4で使う■■■<span style="color: red;">再修正しました。2012/1/13 </span><br />
R以外で計算ライブラリーをMT4に導入する方法がないか調べてる内に、GSL(GNU Scientific Library)と言うものを発見しました。と言うことで今回は、GSLをMT4で使うことに挑戦してみました。<br />
<br />
<h2>何はともあれまずこちらを・・</h2>まずは、このサイトをご確認ください。 慣れた人ならこれでほぼ完了します。<br />
1.<a href="http://gonzaburou.cocolog-nifty.com/blog/2006/11/gslvisual_cc_8716.html">GSLをWindowsのVisual C++で使う(ごんざぶログ)</a>を熟読<br />
2.<a href="http://www.cbrc.jp/%7Etominaga/translations/index.php">産業技術総合研究所 富永氏によるマニュアルの和訳</a>の<a href="http://www.blogger.com/post-edit.g?blogID=6027720561701794729&postID=7826021240481853695" name="gsl">GSL リファレンス・マニュアルの日本語訳</a>を確認<br />
3.<a href="http://amenbo3rd.blog.fc2.com/blog-entry-1.html">MQL4(MT4):DLLの作り方を公開しています</a>(<a href="http://amenbo3rd.blog.fc2.com/">アメンボのブログ2</a>)内の記事および<br />
記事の置き場所アメンボのWEB―記事:・MT4(MQL4)用DLLの作り方.pdf<br />
4.<a href="http://d.hatena.ne.jp/fai_fx/20100614/1276443053" name="1276443053">初めてのDLL(2)/関数作成篇</a>(ご存じfaiさんの備忘秘録)<br />
<br />
<h2>組込方法</h2>上記の記事を参考(ほぼそのまま^^;)に中継用のDLLを作成し、GSLをMT4から使用する事にしました。<br />
<br />
<h2>手順1</h2>今回は、VC++2010を使用してみたので、まずは、<a href="http://www.microsoft.com/japan/msdn/vstudio/express/">Visual C++ 2010 Express</a>(無料)をDL+インストールします。<br />
そして、<a href="http://service-spi.web.cern.ch/service-spi/external/distribution/">VC++向けにコンパイルされたGSL</a>をDLします。今回は、<a href="http://service-spi.web.cern.ch/service-spi/external/distribution/GSL_1.8__LCG_win32_vc71.tar.gz">GSL_1.8__LCG_win32_vc71.tar.gz</a>をDLしました。<br />
<br />
<h2>手順2</h2>まずは、<a href="http://www.blogger.com/post-edit.g?blogID=6027720561701794729&postID=7826021240481853695" name="gsl">GSL リファレンス・マニュアルの日本語訳</a>を参考に取り込む関数を選択します。<br />
今回は、第31章ウェーブレット変換P461~ を選択しました。<br />
※参考コードも記載されていますので、導入しやすいと思います。<br />
<span style="color: red;">※注意:</span><a href="http://www.blogger.com/post-edit.g?blogID=6027720561701794729&postID=7826021240481853695" name="gsl"><span style="color: red;">GSL リファレンス・マニュアルの日本語訳</span></a><span style="color: red;">に記載されているサンプルコードは、C語で記載されていますが、VC++用のコードではありません。その為、VC++で使用する場合は、一部変更する必要があります。</span><br />
例)<br />
double *abs = malloc(10* sizeof (double));//というコードは、エラーが出ます。<br />
double *abs =<span style="color: red;"> (double *)</span>malloc(10 * sizeof (double));//という型宣言を追加する必要があります。<br />
<br />
<h2>手順3</h2> <span style="color: red;">※ここに記載してあるのは、あくまでもDLL作成の最低設定です。詳細については、上記参照サイトを確認してください。</span><br />
<h5>新規プロジェクトの作成</h5>VC++2010を起動し【ファイル(F)】―【新規作成(N)】-【プロジェクト(P)】<br />
Win32プロジェクトを選択後、名前(N)欄にプロジェクト名を記入-【OK】-【次へ】 <br />
※必要に応じ保存場所を変更。保存場所を覚えておく。<br />
<a href="http://lh6.ggpht.com/-4BGf8-Zov5A/Tw7sZPU3y-I/AAAAAAAAAf0/QD3CT95Llzo/s1600-h/15.png"><img alt="1" border="0" height="170" src="http://lh5.ggpht.com/-CMGWzvSuN8E/Tw7sZ5x_ryI/AAAAAAAAAf8/y8QTSMiVPj4/1_thumb1.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="1" width="244" /></a> <br />
<a href="http://lh5.ggpht.com/-ezyMceA3wz8/Tw7sa4F3EQI/AAAAAAAAAgA/ybBOHqFBVF4/s1600-h/22.png"><img alt="2" border="0" height="159" src="http://lh5.ggpht.com/-AvIxFZ-P8UA/Tw7sba89c2I/AAAAAAAAAgI/THCNDUvDIPU/2_thumb.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="2" width="244" /></a> <br />
Win32アプリケーションウィザードにて(DLL)(空のプロジェクト)を選択-【OK】<br />
<a href="http://lh5.ggpht.com/-4Ej9DxvtKIY/Tw7scIgiw1I/AAAAAAAAAgU/dCM3QqPWGLA/s1600-h/32.png"><img alt="3" border="0" height="159" src="http://lh6.ggpht.com/-wmTcdJ_N-Q4/Tw7sc5BMA1I/AAAAAAAAAgY/bGqir6DKfgI/3_thumb.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="3" width="244" /></a> <br />
プロジェクトが、立上ったらソリューションエクスプロラー内ソースファイルを右クリック-【追加】-【新しい項目】を選択。<br />
【C++ファイル(.cpp)】-名前欄にファイル名を記入<br />
※本来は、ヘッダーファイルなどに分割するが、今回はcppファイルのみを使用する。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8DvCMMZ6Um8paUuO3aAuchvH6GGUNASgzmvxk-MRscPb5eXju_Em2WGe-sZKz8XdyMHqcaRl_aVNwULEzFhPd4na0bWLTmaFcovZcFDClTw2c40NbWRHASGQVpXzQfUHPAp_csCl9vio/s1600-h/42.png"><img alt="4" border="0" height="170" src="http://lh6.ggpht.com/-ymaMJmlLQZc/Tw7sfmINkWI/AAAAAAAAAgs/B0muSCSrx40/4_thumb.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="4" width="244" /></a> <br />
<br />
<h5>GSLのインクルード</h5>ここで一度VC++2010を終了後、先ほどDLしてきた、GSLファイルに移動し、解凍後最下層にある《includeフォルダ》及び《libフォルダ》をコピーし、VC++2010で作成したプロジェクトフォルダのC++ファイル(.ccp)があるフォルダ内にペーストする。<br />
<a href="http://lh4.ggpht.com/-Hxu3tM7qoMg/Tw7smPTB27I/AAAAAAAAAg0/YXINiOd_lr8/s1600-h/132.png"><img alt="13" border="0" height="137" src="http://lh3.ggpht.com/-4G4CbsOCIxw/Tw7smr8uuvI/AAAAAAAAAg8/SSj_hvLs-Sg/13_thumb.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="13" width="244" /></a> <br />
<br />
<h5>DEFファイルの作成</h5>とりあえず、テキストエディタで空のファイルをプロジェクト名.defとし、C++ファイルがあるフォルダに作成する。<br />
<a href="http://lh5.ggpht.com/-Phmg0H0eHTw/Tw7snpxgDjI/AAAAAAAAAhE/Ppn_E4UjEf8/s1600-h/152.png"><img alt="15" border="0" height="161" src="http://lh4.ggpht.com/-O7nwfrTg3ps/Tw7so9-GHoI/AAAAAAAAAhM/_-wfV6MNuMc/15_thumb.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="15" width="244" /></a> <br />
<br />
<h5>プロパティページの設定</h5>※本来は、Debugモードで作成していくが、今回は説明短縮のため初めからReleaseで設定する。<br />
ソリューション構成をReleaseに設定し、【プロジェクト(P)】-【プロパティ】を選択する。<br />
【構成プロパティ】 <br />
【全般】━【文字セット】━(マルチバイド文字セットを使用する) <br />
【C/C++】┳【プリプロセッサ】━【プリプロセッサの定義】━【(編集)】(GSL_DLL)を追加 <br />
┗【コード生成】━(マルチスレッド(/MT)に設定<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMpkV5RN8FJudHzUKdmrJBTj8SHVdb1UdnWaMNgT1iTOxNtsVEY_C6gP3y2pfGOUUpeKfmkDB6x18R_g9TV-XTmUR12MlXYIS55Alx9owCTbyerhBLKsOf3iweTIJwjPAmQ4Udmk0ChPY/s1600-h/62.png"><img alt="6" border="0" height="145" src="http://lh6.ggpht.com/-gdeqML95yAc/Tw7sqjhpqUI/AAAAAAAAAhc/06TinSPm_hM/6_thumb.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="6" width="244" /></a><br />
【リンカー】┳【追加依存ファイル】━【(編集)】(.\lib\gsl.lib:.\lib\gslcblas.lib)を追加 <br />
┗【モジュール定義ファイル】━【(編集)】(先ほど作成したdefファイル名)を追加<br />
<a href="http://lh4.ggpht.com/-ATk00fiWtWs/Tw7srti_7BI/AAAAAAAAAhk/56uBudgiPIk/s1600-h/7.65.png"><img alt="7.6" border="0" height="145" src="http://lh4.ggpht.com/-Gbcv2s4fQLk/Tw7ssd9k8dI/AAAAAAAAAho/IhCKUDDeIXQ/7.6_thumb1.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="7.6" width="244" /></a> <br />
<a href="http://lh4.ggpht.com/-ItBYPuBB9BQ/Tw7ss5_CG_I/AAAAAAAAAh0/Nw5c60dk25Q/s1600-h/7.32.png"><img alt="7.3" border="0" height="145" src="http://lh3.ggpht.com/-gQj5nAi1J1E/Tw7st0_5NwI/AAAAAAAAAh8/Q2V2sop-PSo/7.3_thumb.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="7.3" width="244" /></a> <br />
<br />
<h5>コード記入</h5>今回テスト用に記入したコードは、以下のとおりです。<br />
※サンプルコードを少しいじっています。<br />
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2ab0959d-a82e-44f7-ba40-a1db8c8fd344" style="display: inline; float: none; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><pre class="c" name="code">#pragma once
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include ".\include\gsl\gsl_sort.h"
#include ".\include\gsl\gsl_wavelet.h"
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
//----
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
//----
return(TRUE);
}
//-----------------------------------------------------------------------------
__declspec(dllexport) void __stdcall DWT(double *input,double *out,int Ns,int D,int fs){
int i;
int siz = (int)pow(2.0,Ns);
if(D%2==1)D++;
if(D>20)D=20;
//配列のコピー
memcpy(out,input,sizeof(double)*siz);
//ウェーブレットの初期設定(ウェーブレット名,D値)
gsl_wavelet *w;
if(D==2){
w = gsl_wavelet_alloc(gsl_wavelet_haar,D);
}else{
w = gsl_wavelet_alloc(gsl_wavelet_daubechies, D);
}
//作業領域の確保(数量)
gsl_wavelet_workspace *work;
work = gsl_wavelet_workspace_alloc(siz);
size_t *p = (size_t *)malloc(siz * sizeof(size_t));
double *abs = (double *)malloc(siz * sizeof (double));
if (abs == NULL || p== NULL){printf("メモリを確保できません"); exit(0);}
//変換(初期設定,データ,進み幅,作業エリア)
gsl_wavelet_transform_forward(w, out, 1, siz,work);
//フィルタ作業
for(i = 0; i < siz; i++) abs[i] = fabs(out[i]);
gsl_sort_index(p, abs, 1, siz);
for(i = 0; (i + fs) < siz; i++) out[p[i]] = 0;
//逆変換
gsl_wavelet_transform_inverse(w, out, 1, siz, work);
}
//----------------------------------------------------------------------------</pre></div><br />
<h5>DEFファイルの内容を記入</h5>以下の様に作成しました。<br />
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:df2eb4d9-6e7a-4306-bd16-cb9fb29d3390" style="display: inline; float: none; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><pre class="c" name="code">LIBRARY GSLwrapper
EXPORTS
DWT</pre></div><h5> </h5><h5>ビルドと配置</h5>ビルドに成功したら、Releaseフォルダ内のプロジェクト名.dllとlibuフォルダ内のgel.dllおよびgslcblas.dllをコピーし、<span style="color: red;">MT4のlibrariesフォルダにプロジェクト.dllをペースト</span>し<span style="color: red;">terminal.exe と同じフォルダ内にgel.dllおよびgslcblas.dllをペースト</span>します。(<span style="color: red;">追記</span>)※教えて頂いた方ありがとうございます。<br />
<br />
<br />
<div style="color: red;">※再追記</div><div style="color: red;">上記コードをそのまま作動させるとメモリリークが発生するそうです。</div><div style="color: red;">修正方法は、コメント欄をご覧ください。</div><br />
<br />
<h5><span style="font-family: Terminal; font-size: x-small;">呼び出し側のMQL4のコードを作成</span></h5>以下の様なサンプルコードを作成しました。<br />
<pre><span style="color: grey;">//+------------------------------------------------------------------+
//| DWT_GSL.mq4 |
//| Copyright ゥ 2012, bighope |
//| http://expertadviser-bighope.blogspot.com/ |
//+------------------------------------------------------------------+
<span style="color: blue;">#property</span> <span style="color: blue;">copyright</span> <span style="color: teal;">"Copyright ゥ 2012, bighope"
</span><span style="color: blue;">#property</span> <span style="color: blue;">link</span> <span style="color: teal;">"http://expertadviser-bighope.blogspot.com/"
</span><span style="color: blue;">#import</span> <span style="color: teal;">"GSLwrapper.dll"
</span> <span style="color: blue;">void</span> DWT<span style="color: navy;">(</span><span style="color: blue;">double</span><span style="color: navy;">&</span> input<span style="color: navy;">[],</span><span style="color: blue;">double</span><span style="color: navy;">&</span> out<span style="color: navy;">[],</span><span style="color: blue;">int</span> Ns<span style="color: navy;">,</span><span style="color: blue;">int</span> k<span style="color: navy;">,</span><span style="color: blue;">int</span> fs<span style="color: navy;">);
</span><span style="color: blue;">#import
#property</span> <span style="color: blue;">indicator_chart_window
#property</span> <span style="color: blue;">indicator_buffers</span> <span style="color: green;">1
</span><span style="color: blue;">#property</span> <span style="color: blue;">indicator_color1</span> <span style="color: #333399;">Yellow
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> N <span style="color: navy;">=</span> <span style="color: green;">10</span><span style="color: navy;">;</span><span style="color: grey;">//対象データ数(2のN乗)
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> D <span style="color: navy;">=</span> <span style="color: green;">4</span><span style="color: navy;">;</span><span style="color: grey;">//ウェーブレットD数※2は、Harr
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> max <span style="color: navy;">=</span> <span style="color: green;">50</span><span style="color: navy;">;</span><span style="color: grey;">//最大値からどれだけ残すか
</span><span style="color: blue;">extern</span> <span style="color: blue;">int</span> Shift <span style="color: navy;">=</span> <span style="color: green;">0</span><span style="color: navy;">;</span><span style="color: grey;">//データのシフト
</span><span style="color: blue;">double</span> IDWT<span style="color: navy;">[];
</span><span style="color: blue;">double</span> in<span style="color: navy;">[];
</span><span style="color: blue;">double</span> out<span style="color: navy;">[];
</span><span style="color: blue;">int</span> DWTPeriod <span style="color: navy;">;
</span><span style="color: grey;">//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> init<span style="color: navy;">()
</span> <span style="color: navy;">{
</span><span style="color: grey;">//---- indicators
</span> <span style="color: blueviolet;">SetIndexStyle</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">,</span><span style="color: #333399;">DRAW_LINE</span><span style="color: navy;">);
</span> <span style="color: blueviolet;">SetIndexBuffer</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">,</span>IDWT<span style="color: navy;">);
</span>
DWTPeriod <span style="color: navy;">=</span> <span style="color: blueviolet;">MathPow</span><span style="color: navy;">(</span><span style="color: green;">2</span><span style="color: navy;">,</span>N<span style="color: navy;">);
</span>
<span style="color: blueviolet;">ArrayResize</span><span style="color: navy;">(</span>in<span style="color: navy;">,</span>DWTPeriod<span style="color: navy;">);
</span> <span style="color: blueviolet;">ArrayResize</span><span style="color: navy;">(</span>out<span style="color: navy;">,</span>DWTPeriod<span style="color: navy;">);
</span><span style="color: grey;">//----
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> deinit<span style="color: navy;">()
</span> <span style="color: navy;">{
</span><span style="color: grey;">//----
//----
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
</span><span style="color: blue;">int</span> start<span style="color: navy;">()
</span> <span style="color: navy;">{
</span> <span style="color: blue;">int</span> counted_bars<span style="color: navy;">=</span><span style="color: blueviolet;">IndicatorCounted</span><span style="color: navy;">();
</span> <span style="color: blue;">if</span><span style="color: navy;">(</span>counted_bars<span style="color: navy;">></span><span style="color: green;">0</span><span style="color: navy;">)</span><span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: blueviolet;">ArrayInitialize</span><span style="color: navy;">(</span>in<span style="color: navy;">,</span><span style="color: green;">0.0</span><span style="color: navy;">);
</span> <span style="color: blueviolet;">ArrayInitialize</span><span style="color: navy;">(</span>out<span style="color: navy;">,</span><span style="color: green;">0.0</span><span style="color: navy;">);
</span> <span style="color: blue;">for</span><span style="color: navy;">(</span><span style="color: blue;">int</span> k<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>k<span style="color: navy;"><</span>DWTPeriod<span style="color: navy;">;</span>k<span style="color: navy;">++)</span> in<span style="color: navy;">[</span>k<span style="color: navy;">]=</span><span style="color: magenta;">Open</span><span style="color: navy;">[</span>k<span style="color: navy;">+</span>Shift<span style="color: navy;">];
</span>
DWT<span style="color: navy;">(</span>in<span style="color: navy;">,</span>out<span style="color: navy;">,</span>N<span style="color: navy;">,</span>D<span style="color: navy;">,</span>max<span style="color: navy;">);
</span>
<span style="color: blue;">for</span><span style="color: navy;">(</span>k<span style="color: navy;">=</span><span style="color: green;">0</span><span style="color: navy;">;</span>k<span style="color: navy;"><</span>DWTPeriod<span style="color: navy;">;</span>k<span style="color: navy;">++)</span>IDWT<span style="color: navy;">[</span>Shift<span style="color: navy;">+</span>k<span style="color: navy;">]</span> <span style="color: navy;">=</span> out<span style="color: navy;">[</span>k<span style="color: navy;">];
</span> <span style="color: blue;">return</span><span style="color: navy;">(</span><span style="color: green;">0</span><span style="color: navy;">);
</span> <span style="color: navy;">}
</span><span style="color: grey;">//+------------------------------------------------------------------+
</span>
</span></pre><h2>手順4</h2>MT4を作動させて、DWT_GSLを作動させてみる。<br />
※インジケータのパラメータ【全般】の(ALL DLL imports) のチェックをいれること。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEoex0YuGHshSTzWkIe_DM6pnCmt2MGxd-pC_ayqebvBJfH6M6hidg_YqygkxoiqzzZlo00SWppieWN38AeqfWdovyFbQDBmplGTHZSYWG7AGnVbJHCGhspUs_wLIN7nK6ksahCDmHe68/s1600-h/162.png"><img alt="16" border="0" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikVDd5lzSESod-sEwQ-616RZ3fXxiJZR3pgp-B3htSLglSkhy6nPlGNJvvNn6mqk9ZVLy7VgvxXuYjZAUJG-FRFvc5Wwdh3OLslcDuFabXEXi-tKJcFe633JQmKeLTg9j8wX2dF-4-Kzw/?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="16" width="244" /></a> <br />
<strike>テストの結果、Experts欄に【 DWT_GSL USDJPY,M5: cannot load library 'GSLwrapper.dll' (error 126)】と表示されインジケータが作動しなかった。ちなみに、XP32bit、MT4.00 Build409 を使用しています。</strike><br />
<strike>上記のようにエラーが発生した場合は、librariesフォルダにPathを通すことで対応します。</strike><br />
<strike>【マイコンピュータ】右クリック―【プロパティ(R)】―【詳細設定】―【環境変数(N)】―【システム環境変数(S)】 <br />
【Pathを選択】―【編集】―一番最後に【;C:\Program Files\MetaTrader 4\experts\libraries】と記入</strike><br />
<strike>※デフォルト設定の場合です。各MT4によって調整が必要です。</strike><br />
<strike>※\は、¥マークの半角です。</strike><br />
<strike><span style="color: red;">※Pathを追加するだなので、既存の情報を変更しないように注意してください。</span></strike><br />
作業を終了後MT4を立ち上げると、インジケータが表示されます。<br />
<a href="http://lh4.ggpht.com/-5tjv4Ka3VPE/Tw7swLMF39I/AAAAAAAAAiU/USXrwiOV9eo/s1600-h/18%25255B2%25255D.png"><img alt="18" border="0" height="234" src="http://lh5.ggpht.com/-d5TAcNq1i6Y/Tw7swzvPpoI/AAAAAAAAAiY/-xTLpiwY4Yw/18_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="18" width="244" /></a> <br />
<br />
<h2>サンプル</h2>今回は、VC++2010で説明しましたが、汎用性を考慮してVC++2008で作成した物を添付しておきます。<br />
ご興味のある方は、<a href="https://docs.google.com/open?id=0B42sh1xkCfgtOTcwOTgyN2EtODgwYy00N2JlLWI2Y2EtMTc3YjRmYmNmNmFk">こちら</a> よりDLしてください。<br />
<br />
<h2>まとめ</h2>GSLを取り込むことで、作業の低減とバグの低減が可能になると思います。<br />
今回、一番手こずった点は、cannot load library でことごとくDLLを読み取ることが出来なかったところです。<br />
筆者自身、いろいろとOSをいじりすぎているのでもしかしたら、Pathを通す必要がないかもししれません。<br />
もし、Pathを通すことなくDLLが読み込めたとしたらコメントが頂けると幸いです。<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com3tag:blogger.com,1999:blog-6027720561701794729.post-89035583576284708222011-12-25T01:36:00.002+09:002011-12-25T01:40:26.794+09:00パターン認識の精度を向上させる。■■■今回は、前回の内容を用いて認証精度の向上を図ってみました。<br />
実は、ウェーブレットの事を調べていて、別階級のウェーブレット係数は、そのままでは比較できない事、もし比較する場合には、変換作業が必要であることがわかりました。その変換作業を用いることで認証制度の向上に取り組んだわけです。<br />
<br />
<h2>スケール係数の比較は不要</h2>スケール係数の数値を変更して確認してみました。以下がその画像です。<br />
※白線:無加工 ※黄線:スケール係数+0.05 ※赤線:スケール係数+0.1 <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC3J58ckl0sXo_FH5zaJ0WV2p44vw6udRO8Ndliemq8k-9-r8uq0LRkvJqCyfC2Epi2vNDCjLNuA18MVfiq7uGqwH5TSyJobwv1ZePVxG2I025qe994W4oLrdOX0X1kAkw8dvC7obbx18/s1600-h/%2525C2%2525B9%2525C2%2525B1%2525C3%2525BC%2525C3%2525AB%25255B2%25255D.png"><img alt="スケール" border="0" height="208" src="http://lh5.ggpht.com/-acqe4QXDzWs/TvX_h_UIAGI/AAAAAAAAAeY/NmMW082dg0I/%2525C2%2525B9%2525C2%2525B1%2525C3%2525BC%2525C3%2525AB_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="スケール" width="244" /></a> <br />
この画像でわかるとおり、波形の形状には変化がなく、位置が変化したにすぎません。その為、パターン認証では不要な要素であることがわかります。<br />
<br />
<h2>ウェーブレット係数の変換作業</h2>まず、変換作業に使用する重みを作成しました。<br />
これは、ウェーブレット変換する際に乗算されるsqr(1/√2=0.70710678)を各階級に応じて除算するものです。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpyKIVO1vfA9HvzbIileni660fTCIlPSh6JSNpQaat91_PEgsrDpHCgGL4VJT7yIjGIvKkntl6EDWe03Ee73i0VorzwUFhRMZgAnZg3CFSdNUEvTca5QRM18iSN7_BZx1By0Wmn8lR7jY/s1600-h/Image.png"><img alt="重み" border="0" height="72" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2fS0KunKfjo_hCClaBVdP-_oW7DM092VfSTJ6B3VpFqNHi-5MO8xtPlaRoz9yO0OgTeB-BNRkvjwp7_bdIGLyTGIRO8-NV4yWUHsO9_VT3o8pS_e-ytMtBCX1ZCBAAqOK7T-YsZ3gMO4/?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="重み" width="244" /></a> <br />
変換作業を画像で見てみると、以下の図のとおりとなります。<br />
<a href="http://lh6.ggpht.com/-3tILbTzi_q0/TvX_j711AWI/AAAAAAAAAe0/PaKIwaDYWS4/s1600-h/wbr%25255B2%25255D.png"><img alt="wbr" border="0" height="182" src="http://lh3.ggpht.com/-XCX8eRwaao0/TvX_lPBJdeI/AAAAAAAAAe4/JBIKDpvckx8/wbr_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="wbr" width="244" /></a> <br />
実際に使用するのは、黄線のように高周波成分を削除した形の物を使用するわけです。<br />
<br />
<h2>認識精度の確認</h2>前回のコードに上記コードを追加し、以下のコードを修正します。赤線が変更箇所です。<br />
ちなみに、y=0から1に変更したのは、g[0]に格納されているスケール係数を排除するためです。<br />
<a href="http://lh5.ggpht.com/-56vjQdHI0nA/TvX_loG9wxI/AAAAAAAAAfA/gP9EV3uLej4/s1600-h/%2525C3%2525BD%2525C2%2525A0%25255B2%25255D.png"><img alt="追加" border="0" height="116" src="http://lh4.ggpht.com/-Sz2uke9zg-A/TvX_mLMeJSI/AAAAAAAAAfI/o5Jz10d-q_c/%2525C3%2525BD%2525C2%2525A0_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="追加" width="244" /></a> <br />
結果を見ると、上図が、変更前で下図が、変更後のチャートです。<br />
※赤線:基本波形 ※黄色:一番近い過去の波形 ※白線:2・3番目に近い過去の線 です。<br />
【変更前】<br />
<a href="http://lh3.ggpht.com/-Klos3XqgDIM/TvX_m-IOSJI/AAAAAAAAAfU/Rrd78XpLPQQ/s1600-h/%2525C3%2525B4M%25255B2%25255D.png"><img alt="変更前" border="0" height="182" src="http://lh6.ggpht.com/-rSidev6h20E/TvX_ns4mEaI/AAAAAAAAAfY/5GQWtJ1_yK4/%2525C3%2525B4M_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="変更前" width="244" /></a> <br />
<br />
【変更後】<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTV5cMHbzbnbYI7OLFNEgogLRbGQF-zSjs5sQmAwGeaW18aWrBwD2qPVAbQK4kQCLIV5aOkt1aleS4dh0fCjuY3eAk0HOO_U8ssLta57B2IKSvKCRahAwMW64KH7A9-icnmtb2_UNKf68/s1600-h/%2525C3%2525B4%25255B2%25255D.png"><img alt="変更" border="0" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyfFZq5DG3emoLRZ758Dgh7E6EIMWCS58jJSemorjq3O_v3kIMa2_lSaGz6hiKQe5vhA-lqBFBachymiDpO8CDOENtTzJ_mlRSGKvOTlWmc8LlRZz6YRT2u3bVvSHB09r7xiuct0OmooA/?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="変更" width="244" /></a> <br />
使用した結果、1番近い過去の波形及び2番目と同じ波形を導いていますが、3番目の波形が異なることがわかります。(用いるデータが悪く変化がわかりづらい。。。orz)数値的には、悪くなっていますが、パターン認識の精度は、向上した、、、はずです。^^;<br />
<br />
<h2>その他</h2>3か月にわたり開催されたATC2011が修了しました。参加されたみなさん、お疲れ様でした。そして、応援して頂いた皆様、期待に応えられず申し訳ありません。今年は、第1週目にほぼ敗北宣言をするような結果になってしまいました。私の力量不足が招いた結果だと思っています。しかし、ATCへの参加は、面白いですよ^^;来年は、みなさんも参加されてはいかがでしょう?世界を相手に勝負できますよ(^o^)丿それでは、良いお年を!<div class="blogger-post-footer"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0270136270515825";
/* linkbig */
google_ad_slot = "7283446366";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>bighopehttp://www.blogger.com/profile/12010565338366501707noreply@blogger.com3