2010/12/29

MT5が更新されたが・・・・・・onz

追記しました2010/12/30
Version5.00 Build373に変更されたのでテストしてみました。
version
バックテストの結果が・・・onz
err
改善されてないみたいです。
しかもメモリリークまで出てるし・・
ちなみに、コンパイルは、すべて問題ないみたいでインジケーターの表示もEAの青信号も出ました。(取引は確認していませんが・・)
test

年内に総括しようと思ってましたが年明けになりそうです。
PC環境に問題があるのかな?

【おまけ】
MQL5のHelpが更新されたようなので更新しておきました。
mql5.chm in Google API

【追記】
原因がわかりました。
簡単に言えば、カスタムインジケーターを使用する場合は、EAに以下のコードを記入しなければ作動しないようになったようです。




【#property tester_indicator "インジケーター名.ex5"】をEAに追加する。












上記で稼働するようになりました。
また、ゲストモードでのバックテストができなくなり、ATC2010の履歴にリンクすることができなくなりました。ATCTradeWriterZも使用できません。

単なる確認不足でした。


2010/12/26

ATC2010が終了しました。

いろいろありましたATC2010が終了したので今回は、自分のEAの総括を行おうと思いました。が!、MT5で不具合が発生しているため資料を作成できませんでした。
バグ内容は、【Expert removed because indicator 43 cannot load [4802]】です。

どうもカスタムインジケーターを使用したEAで発生しているようで、再コンパイルしてもバックテストができません。
参考(修正したようですが・・・)
ということで総括は、先延ばしとして今回は、

MetaTraderのマルチプラットフォーム化とマルチプラットフォームによる自動売買
について調べてみました。

マルチプラットホームとは?
アプリケーションソフトが複数のOSに対応していること。・・・・e-word より



Windowsアプリケーションのマルチプラットフォーム化を行うプログラム群及びOS


Wine
WindowsアプリケーションとUnix系OSを結びつけるプログラム群 参考(Wine - Wikipedia)
WineのMetaTrader検証結果も掲載されています。
4.xがMT4 5.xがMT5を示しています。
各フォームを見ると多くのOSの作動確認が掲載されています。
注意:日本語の壁は考慮されていませんので日本語バージョンを使用する場合は別途対応が必要になる可能性があります。

Jaris
Open Solarisを使って日本人が開発したOSでWindowsアプリ起動ソフト”Madoris”を実装しています。
Madorisは、上記Wineをベースに作成されているようです。


動作確認ソフトウエアー覧にMT4とMT5がなかったのでインストールしてみました。
検証バージョン jaris 1.0P(試験公開終了)
MT4の結果:
①デフォルトのままではインストールできず。
②付属madoスクリプトにて【MS Visual C++ 6 sp4 ライブラリ】を導入
インストーラー作動→通常インストール完了

③MT4を作動させてみた。
アイコンの抜け+文字化けは、あったが以下の作動確認が取れた。
A:デモ口座申請 OK
B:チャート稼働 OK
C:バックテスト OK

④Meta Editorを作動させてみた。
A:コード入力 OK
B:コンパイル OK
C:コンパイル後のバックテスト OK
D:日本語入力 入力できず
※フォント数が少ないのが原因か?
E:アイコン抜け あり
F:文字化け あり

MT5の結果:
いろいろ試してみてみたかインストールできず。原因不明・・・
※Jarisは、現在開発中のOSのため今後に期待したいものです。


マルチプラットフォームを可能にするプログラム言語及び自動売買システム


【RUBY】 『jiji



【まとめ】
現在は、自動売買の手法を検討するためにWindowsにてMetaTraderを使用していますが、VPSを使用する際にWindowsサーバー限定だったり、他のソフトに比べれば多いが対応業者に制限があったり、バージョンがチェンジするたびにコードの書き換えがあったりと不自由を感じています。



【 番外】
MQL5 日本語リファレンス』が閉鎖に追い込まれています。なんでもMETAQUOTES社のアジア分社から閉鎖指示が来たようです。METAQUOTES社にメールで確認依頼をしましたがいまだに連絡がありません。(内容が通じなかったかもしれませんが・・)MQL5の日本語リファレンスができるまでのつなぎとして再度 GoogleAPIを使用したヘルプ(ターミナル・エディタ・MQL5)を作成しました。


2010/11/29

まねぶ

まねぶとは、【まなぶ(学ぶ)】と同源で、【まねる(真似る)】とも同じ語源である。
そのため、学ぶの語源は【真似ぶ(まねぶ)】とされることも多い。語源由来辞典より
今回は、ATC2010で1位を独走中のbobsley氏のMover3MkIIを真似てみました。
【Mover3MkIIの基本情報】
【Mover3MkIIの予測フローチャート】
【模索結果】 作成したEAのテスト結果にATCTradeを使用して実際の履歴を添付してみました。
※結論から言ってしまえば、完全に一致するEAではありません。 ※ATCTradeは、設定をいじらずに使用しています。
【模索したEAの設定】 ロット調整を行わず、固定0.1Lotとしました。また、注文の中止は無視しています。 その他は、Mover3MkIIの設定を使用しました。
【模索したEAのテスト結果】 期間:2007/01/01~2010/10/31
【模索したEAで別条件を試してみた①】 一度ポジションを持つと逆シグナルが発生しても無視し、現在のポジションを維持していたので、ドテンさせたらどのような結果になるか試してみました。
【模索したEAで別条件を試してみた②】 TP/SLの割合はそのままにし、値幅に応じたTPを設定してみました。 今回は、2日足の値幅(高値-底値)のEMAを基準に使用しました。
【まとめ】 今回は、Mover3MkIIを真似ることでいろいろと勉強させて頂きましが、2008/09月~2009/11月の期間の結果に違和感を感じています。(ちなみにその期間の期待値は、-3.8でした。)データの異常があるのでしょうか?どちらにしてもMover3MkIIの結果ではありません

2010/11/18

自動売買への学術的なプロセス

自動売買への学術的なプロセスをまとめた俯瞰図(見渡すチャート)が『ファイナンスにおける人工知能応用研究会(SIG-FIN)』のサイトにありましたので紹介します。
出典: 鳥海不二夫, 特集「研究会総覧」ファイナンスにおける人工知能応用研究会 (SIG-FIN), 人工知能学会誌, Vol. 25, No. 4 (2010年7月), pp. 557-558 作成: 松井藤五郎

研究対象の中に自動売買があり、それを取り囲むように並んでいます。とりわけ、自動売買に一番近いのは『ファイナンス』ということでしょうか?
また、このサイトには、論文もいくつか掲載されています。 例えば、以下のような気になる論文も・・・ 【取引所の高速化について】から抜き取り 著者:水田 孝信(スパークス・アセット・マネジメント株式会社) ////////////////////////////////////////////////////////////////// 4 高頻度取引戦略 一般にアルゴリズムトレードという言葉は、機械 で執行戦略を行うことを指す。執行戦略とは、ある 銘柄を買うこと(売ること)は外部から与えられて おり、それをなるべく有利な価格で執行する注文を 行うことである。アルゴリズムトレードはVWAP(出 来高加重平均価格)どおりに売買するなどパッシブ な戦略も多い。一方、フラッシュトレードと呼ばれ る数ms~数s の売買間隔でリターンを稼ぐ戦略は、 まさに高頻度トレードだけでリターンを稼ごうとい うものである。フラッシュトレードは取引所が高速 化していないと実現しないものが多く、日本ではま さにこれからスタートしようとしている戦略であり、 人工知能の技術に期待される分野である。もちろん、 アルゴリズムトレードも取引所の高速化により高度 化し、それが必要になってきていることも間違いな い。リターンを取りにいく高頻度取引のうち、学術 界でも公表された手法として、Stat. Arb.(Statistical Arbitrage)というものがある。(Fernholz, 2007)これ は、時間の規格化を行うと、短い期間で測定したボ ラティリティの方が長い期間で測定したそれよりも 大きいことを利用したもので、この差をリターンと して抽出するものである。具体的にはロング側は1.5 分という短期間でウエイトを元に戻し、ショート側 は一日と長い期間でウエイトを元に戻す。ウエイト を元に戻すというのは株価が上がってウエイトが上 昇した銘柄を売り、株価が下がってウエイトが少な くなったものを買うという逆張り戦略の一種である。 つまり、短い期間であるほど逆張りが有効であると いうことを使った戦略であり、リターンの見積もり をする方法も開発されている。ウエイト調整の間隔 を短くすればするほど高い効果が期待されている。 この効果は日本の株式市場でも確認されており、米 国よりも高いリターンが得られることが知られてい る。(野村證券, 2008) /////////////////////////////////////////////////// ※上記内容は株式市場をとらえた内容だが、為替の世界でも有効な話なのでしょうか?EAの作成のヒントが隠されているかもしれませんね。
『ファイナンスにおける人工知能応用研究会(SIG-FIN)』のサイトを紹介しましたが、実は、KIKKAWAさんに教えて頂いたものです。心から感謝いたします。
【私見】 素人ながら、私も以前ニューラルネットワーク(以下NN法)もどきでEAを組んだことがありましたが、過去の市場にはフィットできてもフォワードテストで散々な結果になりました。私の私見として、『もし、教師信号が間違っていたら、間違った方向にEAを作り上げてしまう。』というものでした。例えば、この前あったような事(誤発注による暴落)をそのまま、教師信号として使用してしまったら?間違った学習をさせることにならないでしょうか?教師信号なしNN法やその他の人工知能を作成する技術があると思いますが、素人が、扱える手法ではないと感じました。

2010/11/15

やっぱり存在するんですね!

  MT4に標準で格納されているMetaquotesのヒストリカルデータには、2006年9月頃より過去のデータに異常な上髭と下髭が存在することが知られています。参考
そのため、Metaquotesのヒストリカルデータを使用する場合は、2006年以前のヒストリカルデータでのテストは、避けてきました。
今回は、その問題が解決されているか?
MT5に格納されているMetaquotesのヒストリカルデータを確認してみました。
結果は、以下を確認ください。

↑EURUSD 5分足 2006年5月

↑USDJPY 5分足 2006年9月
同じデータを使用しているのでしょうか?やはり異常な髭が存在します。
スキャル系のEAのテストには使用できないようです。

2010/11/12

ATCTradeを修正しました。

ATCTradeを修正しましたので、ご使用されている方はどうぞ!
また、DWTHarrのMQL5仕様の作成を依頼されましたが、途中で心が折れてしまったのでインジケーター指標として表示することができませんでした。サンプルとしてコメント表示のコードを掲示しておきますので試してみてください。(オブジェクト表示なら可能だと思います。)
//+------------------------------------------------------------------+
//|                                                      DWTHarr.mq5 |
//|                                          Copyright 2010, bighope |
//|                       http://expertadviser-bighope.blogspot.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, bighope"
#property link      "http://expertadviser-bighope.blogspot.com/"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers    1
#property indicator_plots      1
#property indicator_color1    Red
input int N     =  7;//対象データ数(2のN乗)
input int HBs   =  3;//高周波カット位置
input int LBs   =  4;//低周波カット位置
input int Shift =  0;//データのシフト数
int DWTPeriod;
//---------buffers
double IDWT[];
double g[];
double gs[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,IDWT,INDICATOR_DATA);
   //ArraySetAsSeries(IDWT,false);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   DWTPeriod = MathPow(2,N);
   ArrayResize(g,DWTPeriod);
   ArrayResize(gs,DWTPeriod);
   ZeroMemory(g);
   ZeroMemory(gs);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,//Priceバッファ数
                const int prev_calculated,//処理バー数
                const int begin,//重要なデータが始まる所
                const double &price[])
  {
//---
//PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rates_total-DWTPeriod-1);
   string text;
   int     k;
   int     DWTf,z;
   double  sum,difference;
   for(k=0;k<DWTPeriod;k++)g[k] = price[rates_total-k-Shift-1];
   DWTf = DWTPeriod/2;
   //変換
   for(z=1;z<=N;z++)
   {
      for(k=0;k<DWTf;k++)
      {
         sum        =(g[k*2]+g[k*2+1])/2;
         difference =(g[k*2]-g[k*2+1])/2;
         gs[k]      =sum;
          if((LBs>=z)&&(z>=HBs)){gs[DWTf+k] = difference;}else{gs[DWTf+k] = 0;}//フィルタリング作業
       }
      ArrayCopy(g,gs);
      if(N>z) DWTf =DWTf/2; 
    }
      
    //逆変換
    for(z=1; z<=N ;z++)
    {
     
      for(k = 0; k < DWTf; k++) 
      {
         sum         =  g[k]+g[k+DWTf];
         difference  =  g[k]-g[k+DWTf];
         gs[2*k]       = sum;
         gs[2*k+1]     = difference;
      }
      ArrayCopy(g,gs);
      if(N>z)DWTf =2*DWTf;
     }
      for(k=0;k<DWTPeriod;k++){ IDWT[rates_total- Shift-k-1] = g[k];text += DoubleToString(g[k])+"\n";} 
     //  for(k=DWTPeriod;k>0;k--){ IDWT[rates_total- Shift-k] = g[k-1]; }
//--- return value of prev_calculated for next call
Comment(text);
   return(rates_total);
  }
//+------------------------------------------------------------------+

2010/11/10

EAの評価基準がほしい!

昨日、ATC2010に提出したEAが、全ポジションを決済しました。
初期のトラブルと『リカバリーコードの未記入』がここまで影響するとは・・・
順位は別として、作成したEAが本来の動きを見せるか?監視していきたいと思います。

さて、話は変わりますが、『やりたい事・やってみたい事』がいくつかあるのですが、その中の一つに、『EAの評価基準作成』があります。誰が見てもわかりやすEAの評価基準ができれば、EAの評価自体が上がるのではないか?と考えたからです。
例えば、バックテストのグラフできれいな右肩上がりを見せるEAが有能なEAなのか?とか、PFが高いEAが有能なEAなのか?など、一律に評価できる評価基準を作成しようと試みました。
と!いいますか、私にはそれだけの力量がなく、ある方に『EAを一律に評価する基準を作成できませんか?』とお伺いしてみました。ある方とは、『 Meta Trader (メタトレーダー)』サイトオーナーのKIKKAWAさんです。KIKKAWAさんは、『進化ゲーム理論の数理とその応用』などを研究されている研究員の方で、研究の検証用にMeta Traderを活用されています。
私は、当初、『このEAは、◎〇点です!』のような、絶対評価が良い評価(誰もがわかりやすい評価)であると考えていました。しかし、KIKKAWAさんとメールのやりとをするうちに、以下に示すような多角形グラフのほうが、わかりやすい評価ができると教えて頂きました。
image
2週間にわたり、19回のメールのやり取りと、作成して頂いたレポートが、19ページにもなりました。パラメーターをどうすか?という課題はありますが評価基準を示す方法としてはベストな方法であるという結論になりました。
【謝辞】
課題の定義もできない私の話を親身になって検討して頂いたKIKKAWAさんに感謝します。

2010/10/26

こんなメールが私のもとに・・・・

Interview for ATC 2010

//////////////////////////////////////////////////////////////////////////////
Dear Mr. 名前,
We would like to take an interview from you. For now we should discuss the time for it. How about tomorrow from 8 to 16 on GMT?
The interview will take about hour or two.
Waiting for reply.
/////////////////////////////////////////////////////////////////////////////
これって『あれ!』ですよね^^;
英語がしゃべれなし、今回の成績は、初期のトラブルが原因だよ!って丁重にお断りしました。情けないやら、うれしいやら複雑な気持ちです。
上位者になるとこんなことが起こるんですね^^;
今後の参考にしてください。
また、先週から、ロシア、ラトビア、モルドバからご覧になっる方がいらっしゃるようです。
日本人の方?なのかな?(あまり変な事を言えませんね^^;)
cntory

2010/10/23

応援ありがとうございます。

初めは、トラブルも多くバタバタ状態だったATC2010も3週間が経ちずいぶんと落ち着いた感じがします。私が提出したEAも何とか本来の動きになってきている様です。以下に今までの履歴と本来はこんな風になる予定だっだはずの履歴を貼り付けます。
seiseki 
※上:テスターの結果
  トレード数10回 利益 9724.42 保有ポジションなし
下:実際の履歴
トレード数6回 利益 15235.96 保有ポジション SELL 3.5lot
【現在のEA内部状態】
EA自体は、保有ポジションがないと認識中で、Buyオーダーの停止フィルターが作動中、フィルターの解除には、82.5以上の値上がりが必要な状態です。
【今後の展望】
保有ポジションの決済にはBuyオーダーが必要不可欠なため、今後大きな利益の減少が予想されます。テスターの結果程度に収まってくれれば良しというところです。
【謝辞】
激励ありがとうございます。【日本のホープ】とお言葉を頂いておりますが、実はbighopeとは、10年ぐらい前に初めてメアドを取得する際に、目の前にあった『ショートホープ(タバコ)』をもじったハンドルネームで、それほどたいした志があるわけもなくお恥ずかしい限りです。
今回提出したEAの名前なんて、息子のTシャツのバックプリントをそのまま付けてしまっている状態です。もう少し考えなければいけませんね^^;
T

2010/10/20

技(技術)は、観て盗むもの?

【追記事項があります】(2010/10/21)
ATC2010が始まり3週間目に入りました。 世界各国で作成されたEAがどのような動き(トレード)をしているか気になるところです。しかも、今回からマルチペア対応となり履歴を見ても非常に解りすらくなっています。そこで今回は、補助品(スクリプト)を作成しました。 しかし、今回作成した物(スクリプト)は、2番煎じのものです。alohafxさんのサイトで先週同じようなインジケーターが出されています。今回は、2番煎じということでご了承ください。
事前作業:【ATCTrade.zip】をダウンロードし、解凍後にスクリプトフォルダに保存し、コンパイル作業を行っておいてください。

①下記サイトより気になるEAを探す。
630006
※今回は、Login【630006】name【abeiks】さんを例にとって説明します。
②気になるEA作成者の名前をクリックする。
63006a
※赤枠のLoginコードと緑枠の通貨ペア名および適用期間をメモする。
③MT5を起動し【File】-【Login...】をクリック
login
※Login:に先ほどメモしたLoginコードを、Password:に【MetaTrader】と記載する。
④【File】-【New Chart】-メモした通貨ペア名、適用期間で表示させる。 ⑤【View】-【Navigator】でサイドウィンドーを表示
EURUSD
⑥【ATCTradeWiterZ】をダブルクリック
ALL
※初期設定を変更したい場合は、事前に変更してください。
⑦出現したチャートを整列させて出来上がりです。
ALL2
※トレード履歴が表示されます。
⑧表示の説明(初期設定状態) A:黄色い点が現れた場合は、リミット注文を表します。 ※点の横軸は、リミット注文時間です。 ※点の縦軸は、指値です。 B:停止マークが出た場合は、リミット注文の中止を表します。 C:上下の水平ライン(黄色点線)は、SL及びTPです。 D:約定マークの誤差は、ご勘弁くださ。
⑨確認後の削除作業 サイドウィンドの【ATCTradeDelete】をダブルクリックし、Loginコードを元に戻して終了です。お疲れ様でした。
【まとめ】 いろいろなEAがありますので見るだけでも面白いと思います。
【追記事項】 上記スクリプトを稼働させたときにエラー【Array out of range in 'ATCTradeWriterZ.mq5'】が発生した場合は、totalの数値を上げてください。 【input int total = 100;//履歴格納数(MAX)】(この数値を上げる) エラーの原因は、格納用バッファ数が足りないために起こるエラーです。
追記(2010/10/21)

2010/10/16

自分の責任でリスクを冒すのが究極のエンジョイ!

・・・・究極のエンジョイってのは、自分の責任でリスクを冒すことだと。・・・・・・これで成功した時にこんなに楽しいことはないんですよ。byカンブリア宮殿で岡田武史が言い放った22の名言より 昨日、私も『カンブリア宮殿』を見て感銘を受けた。 私の人生の中で数人『できる奴!』と認めた人がいる。 その条件が、『~だから、そんなことすることないよ!』と言える人だ! KD(カン!と度胸)からくる『~だから』ではなく、信念を持った理由付けからなるルールを破る行動に心が動かされた。『究極のエンジョイ!』は、人の心も動かす力を持っていると感じた。
ブログの内容とはかけ離れた内容はここまでとし、いつもの内容に移ります。
本日下記の内容のメールが私に届いた。 ///////////////////////////////////////////////////////////////////////// いつも楽しく読ませていただいてます 以前からmizutoriを研究させてもらってるのですが、急激な動きになると負けこみます。これを回避する工夫はありますか? あと、せっかく利益が出たのに結局負けるケースもあります。 たとえばプラス10ピプス毎にSLを変更したりできますか? ///////////////////////////////////////////////////////////////////////// この内容について考えてみたいと思います。
Q1:mizutori(逆張り系EA)は、急激な動きになると負け込みます。これを回避する工夫はあるか? A1:いろいろ考えられると思いますが、まず私が考える間違った考え方を説明します。 ①Stoplossを大きくとる。 ②敗戦処理(損切)コードを記載しない。 ③マーチンゲールを組み込む。 ④有益なトレードも削減させる、急激な動きに対応したフィルターをかける。 私が考える有益な考え方だと思われる事項 ①範囲で考える。(大きな損益~大きな損益までを一つの範囲(まとまり)とし利益を上げることを考慮する。 ②注文時条件よりも決済条件(コード)を強化する。 ③通貨ペア若しくは別EAの(逆)相関を利用する。 ④lot数を可変化する。(例:大きな負けの後は、比較的安定した利益が望める場合は、そこにlot(資金)を集中させる。) ⑤外的要因(指標発表など)による区分をつける。 ect
Q2:たとえばプラス10ピプス毎にSLを変更したりできますか? MQL4には、OrderModify。(注文内容の変更)関数があります。 一度調べてみてください。
【まとめ】大きな損益を回避するのではなく、大きな損益を小さな損益に若しくは、カバーする方法を考えたほうが有益だと思います。

2010/10/09

この道を行けばどうなるものか?

ATC2010が開始されて一週間が経ちました。 ご承知の方もいらっしゃると思いますが、私が提出したEAがエラーコードを吐き続けています。今回は、この原因について考えてみました。
【基本情報】 まずエラーの原因の検証の前に今回のEAの簡単な説明をします。 ①EA稼働チャート :USDJPY 5分足 ②対象通貨ペア :USDJPY (シングルシンボル) ③特徴 逆張りナンピン(リミット3回※順張り含む)と順張り手法を複合したEA です。 また、MT4のトレード手法をそのままMT5にさせようと試みました。 ④コードの特徴 MT5は、1シンボル(通貨ペア)1トレード(注文)を原則をしています。そのため、ナンピンしたトレードは、丸められて1トレードと認証され、逆ポジションは、相殺される仕様です。 そこで、今回の試みとして、ナンピンしたトレードの情報をグローバル領域に保存し、その情報をもとにトレードするようなEAを作りました。表面上は、SLもTPもありませんが実は、グローバル領域に存在しています。 ⑤リカバリーコード グローバル領域に保管した情報に誤りがあった時に、修正するコードを記載してあります。 A:ポジションがないにも関わらず情報が残ってしまったら情報を削除するコードがあります。 B:トレードと情報のtypeが異なったときに変更するコードがあります。 ※簡単に言ってしまえば2種類のリカバリーコードしかありません。
【現在までに分かっているエラーコード(不適切内容)】 ①ポジションがあるのに情報がない場合のリカバリーコードがない。 ②情報がポジションと不一致の場合のリカバリーコードがない。 ③上記リカバリーコードBが発令された時に、SELLポジションだった場合、即時決済されてしまう。
【現在までの取引履歴(わかっている範囲で)】(時間はサーバータイム) 2010/10/01 12:19 開始 2010/10/04 03:46:22 SELL注文(price:83.700 lot:2.0) 2010/10/04 03:46:23 failed instant buy 0.00 USDJPY at 83.※※※ [Invalid volume](ここから次回履歴までエラーコードを出し続ける。) 2010/10/05 01:頃 scanning network for access points 2010/10/05 01:頃 scanning network finished 2010/10/05 06:38:32 SELL注文(price:83.809 lot:1.5) 2010/10/05 06:38:34 failed instant buy 0.00 USDJPY at 83.※※※ [Invalid volume](ここから終了までエラーを吐き続ける) 取引時間終了 2010/10/9~10にかけてサバーメンテナンス
【エラーの原因】 履歴の検証の結果、以下のストーリーの可能性が一番高いと考えます。 ①SELL注文時に、情報取得エラーが発生し、typeは取得できたがstoplossとlotの情報取得に失敗した。(ほかの情報取得は不明) ②SELLポジションでstoploss=0ということでSTOPLOSSコードが作動した。 if((last_tick.bid >= fastOder.sl)&&(fastOder.type==SIGNAL_SELL)) stoplevel=true;(fastOder.sl:stoploss fastOder.type:type) ③lot=0(情報取得に失敗)のためSTOPLOSSオーダー(決済)にてエラーが発生。 ④scanning networkにて、グローバル変数(クラス)が初期化。(もしくは、神の手があったかもしれませんが・・・) ⑤①からの繰り返し。
【テスターの結果は?】 同期間でテストした結果、エラーは発生しませんでした。 とりあえずこんな感じです。 bluengin 来週からデモで稼働させる予定です。
【今後の展望】
こんな感じです・・・・・。
【蛇足】 ATC2010の私のフォームにこんなメールが届きました。 +-----------------------------------------+ こんにちはロシアから!キャッチ私たちを。 +-----------------------------------------+ ロシアの人らしく、たぶんロシア語を自動翻訳して頂いたようです。 ただ、意味が理解できません。わかる方いらっしゃらないでしょうか?
あと、limoさんへ応援ありがとうございます。

2010/09/30

せっかく作成したので・・・・

MQL5ナンピン用EAのテンプレートを作成しましたので最適化作業等にご使用ください。
ファイル名:MQL5テンプレート .zip ヘッダーファイル:MYTrade.mqh(保存先/MetaTrader5/MQL5/Include/Trade) テンプレート :EATemplates.mq5(保存先 ・・・・・・・・/MQL5/Experts)
テンプレートには、RSIを基準にナンピンするように作成してあります。 下図は、テンプレートをそのまま稼働させた場合の参考図です。 INPUT エラーや不明な点がありましたら連絡ください。

2010/09/27

ATC2010の参加者受付が終了しました。

申請者数1726人その内、参加資格を得た人数が284人(申請者の約16%)いったい何があったのでしょうか? 新しい言語とはいえあまりにも失格者が多いように思えます。
ATC2010 そこで今回は、私がぶち当たったエラーを紹介します。 まず以下の資料見てください。【5.Statistics】の部分がエラー内容です。 これは、ルールで最大5lotまでのオーダーしか受け付けないのに6.10lotのSELLオーダーをしたために出たエラーです。 err1
しかし、今回作成したEAは、lot計算で5lotを超えた場合、分割注文を出すようにしてあるため、こんなオーダーが起こるはずはありませんでした。 では・・なぜ?起きたのでしょうか?
その原因は、単純なものでした。 それは、ポジションの決済時に一括決済を行うコードがあり、その一括決済(ポジションの逆注文)が、規定lotを超えていたために起きたエラーだったのです。つまり、決済時も規定lotを超えてはならないという暗黙のルールを犯していたようです。 その原因を、何とか対応できたので、審査はパスしたようです。 しかし、締切間際にMT5の更新があったり、募集期間の延長があったりと何やら問題の多いATCになりそうです。
ここまで読んで頂いた方は、私に期待するかもしれませんが・・・・・・・ 今回提出したEAは、全く自身がありません(謙遜ではなく)。 また、問題を抱えたEAだったんです。 実は、今日コードのバグを思いついてしまったんです。 それは、ポジションを抱えたままEAが初期化(サーバーの電源が落とされるなど・・・)されればこのEAは、エラーを吐きまくることになると思います。 (実に情けない・・・・・) ともあれ、何とか初ATCにたどり着くことができたかな?

2010/09/22

MQL5の注意点と便利な点!

しばらく更新できませんでしたがようやく少し時間が作れたので更新します。
ここしばらく、MQL5に遊ばれて、ようやく使える?程度になってきたので今回は、『私が感じたMQL5の注意点と便利な点』を書いてみます。
【注意点】
①MQL4では行われていた『変数の暗黙の初期化』がMQL5では行われない。
//+------------------------------------------------------+
   int pos;
   if(PositionsTotal()>0) pos=1;
   if(pos==1) PositionClose(_Symbol,100,0,lot)
//+------------------------------------------------------+
上記のようなコードがある場合、MQL4では、問題なく作動しますが、MQL5ではバグを発生します。その原因は、MQL4では、変数【pos】の宣言時に勝手に(暗黙の内に)0で初期化してくれていましたが、MQL5では初期化が行われないためにゴミ(メモリの残り)が入っているためです。
≪対策≫
//+------------------------------------------------------+
   int pos=0;《宣言時に初期化する》
   if(PositionsTotal()>0) pos=1;else pos=0;《必ず設定できるコードにする》
   if(pos==1) PositionClose(_Symbol,100,0,lot)
//+------------------------------------------------------+
対策は上記の2種類あり、宣言時に初期化する方法と、必ず定数を格納できるコードを書く方法です。基本作業ではありますが、この現象が理解できるまで、かなり悩まされました。
②配列の向きがMQL4とMQL5では異なります。
※MQL4とMQL5では、インジケーターバッファの向きが逆である。
例)バッファ数がnの場合
MQL4の場合:Buf[n-1](最古バッファ)→Buf[0](最新バッファ)
MQL5の場合:Buf[0](最古バッファ)→Buf[n-1](最新バッファ)
③MQL5にはポジションの決済用関数がない。
MT5に標準で格納されているクラスにポジション決済の関数が作られていますが、実はポジションと逆の注文を出して決済する仕組みになっています。
例)BUYポジションの決済には、同数のSELLポジションの注文がなされます。 つまり、両建てが基本的にできない構造になっています。
標準で用意されているクラスを使用すれば問題はありませんが、自作する場合は、注意が必要となります。

【便利な点】
①MQL5から構造体、クラスが使えるようになりました。
基本事項ですが使用してみてその利点が十分に理解できました。
特に、構造体が使用できる点が便利です。
また、構造体配列も使用できることを確認しました。
例)
+--------------------------------------------------------+
int maxpos =3;
//ポジション用の構造体
struct Opened_Oder
{
  ulong      magic;//マジック
  int      type;//ポジションタイプ
  datetime time;//発注時間
  double   price;//発注価格
  double   pf;//利確値
  double   sl;//損切値
  double   lot;//注文数
  };
class CPosition
   {
protected:
                Opened_Oder   myoder[];//構造体配列
public:
                     CPosition();//コンストラクタ
                     *******
                     ?????????
   }

void CPosition::CPosition()//コンストラクタ
{
 ArrayResize(myoder,maxpos);//配列数の設定
 ZeroMemory(myoder);//初期化
}
+--------------------------------------------------------+
複数のPCを利用して最適化作業ができて時間の短縮が図れる。
faiさんのサイトで紹介されているので省略します。
input 変数をわかりやすい文字(日本語にも対応)にできる。
例)
+-------------------------------------------------------+
//--- input parameters
input double   pich  = 10.0;//猿
input int      mone  =  100;//犬
input double   wid   = 350.0;//キジ
+--------------------------------------------------------+
input定数の末尾にコメントを記載すると設定画面にそのコメントが表示される。
0511 
第3者にわかりやすい変数名が作成できます。
ちょっぴり感動!

【まとめ】
バグとり作業にかなりの時間を割かれましたが、新しい言語に取り組み始めた時にはつきものなので仕方がないとして!とりあえず『面白い!』の一言でまとめたいと思います。^^;

2010/06/17

基準線を作ってみました。

データの特性を踏まえて移動平均線に変わる基準線を作ってみました。
考え方
①データの特性から、単位時間当たりの変化量が少量の場合、無視してもその特性を損なうことがないことから、フィルターを掛けて変化量が少ないデータを取り込まないようにする。
②『売られすぎ・買われすぎ』などの『過ぎる!』を排除するために、変化量を一定とする。
特徴
今回考えた基準線を一言で言えば、移動平均線を『アナログ』とすると、『デジタル』的な特徴を持ちます。
EMAの亜種と考えたほうが使用しやすいと思います。
EMAと近似させると、この指標の特徴がわかりやすいと思います。
例)USDJPY 5M にて
EMA 価格:初値 期間:50 シフト:0
CLine 価格:初値 pich:1.0 more:9.0
の場合に以下の図のようになります。
※通常は、近似した値をとっているが、暴落・暴騰の際に大きな差が生じています。

CLINe
添付指標の説明
【 指 標 名 】 CLine.mq4
【パラメーター】 extern double    pich = 3.0;(変化量を設定します。)
extern double    more = 5.0;(フィルター量を設定します。)
【 ソ ー ス 】
while(i >= 0)
   {
    Line[i] = Line[i+1];
    Ne =  Open[i]-Line[i];
    if(Ne > more*Point)
     {
       Line[i] = Line[i+1] + pich*Point;
     }else{
           if(Ne < -more*Point) Line[i] = Line[i+1] - pich*Point;
           }
   i--;
   }
※このソースでは、価格は、初値に設定してあります。お好みに調整してください。
まとめ
たぶんどこかにありそうな指標ですが、見当たらなかった?ので作ってみました。
平均は、時にノイズを取り込み私達を悩ませる結果をもたらします。
基準をどのように設定するか?もう一度考えてみることが大切だと思います。
また、この指標を元に、エンペロープやモメンタムや…ect いろいろな指標を作ってみても面白いと思います。

2010/05/20

更新です。

MQL5のリファレンスが更新されていたんですね。
それと、API挿入するコードを少し変更しました。変換されてないところが減ったと思います。とりあえず更新のご連絡です。
mql5jp.chm 今回は日本語のみです。

2010/05/18

独り言・・・・

特に、今回書く内容は、私の個人的考えです。裏が取れている内容ではありませんのでご理解ください。
以前から、ベキ分布にこだわっていますが『なぜこだわっているか?』少し書いてみます。(自分の頭の中をいっしょに整理していくことにします。)
まず、『ハンイリッヒの法則』をご存じでしょうか? この法則は、労働災害の統計から生まれた法則で、『1つの重大事故・災害には、29の軽微な事故・災害と300のヒヤリ・ハットが潜んでいる!』というものです。(※ちなみに、ヒヤリハットとは、軽微な事故にはならなかったもので〈ヒヤリ!ハッ!〉とした行動のことです。)
そして、『根底となるヒヤリハットや不安全行動を低減させることが、重大災害の低減につながる』とした考え方の基となる法則です。

実は、この法則がベキ分布に近いものなんです。
ココで例題を考えてみましょう!
無知な小学生がいると仮定します。公園で友だちとキャッチボールをしていました。 ある瞬間、友だちの投げたボールが道路の向こう側まで転がって行ってしまいました。無知な小学生は、ボールを追いかけて左右の確認も怠り道路を横断しボールを拾いに行きました。その際、道路には、駐車中の車両がありました。ちょうどそこをAさんが運転する車両が通り過ぎ事故がおきました。
『なぜ?事故は起きたのでしょうか?』
・駐車中の車両がなかったら、Aさんから小学生が確認でき事故が防止出来たのかもしれません。【ヒヤリ・ハット】ですんだのかもしれません。
・小学生が左右の確認をしていれば、Aさんの車両が確認でき、なにも起こらなかったかもしれません。
・Aさんが通行する時間が遅かったり、小学生が道路を横断する時間が早ければ(両者が時間的にずれていれば)この事故はおこらなかったでしょう。
・小学生が公園でキャッチボールをしてなければ・・・
・小学生の行動を注意してくれる人がいれば・・・
『幾千もの原因・行動が全て重なった時、事故が発生します。』
言い換えれば、重要な要因が一つでも重ならなければ、軽微な事故やヒヤリハット若しくは何も起ることなく過ぎ去っていったはずです。
私は、この現象がベキ分布となる原因だと考えています。
『ある事柄のひとつひとつは、些細な(日常頻繁に起こる)現象であっても、それが重なった時に大きな事故(現象)が現れる。』と考えています。そして、この現象を低減するこはと出来るが、完全に避けることが出来ないことであることも理解する必要があると思います。
過去の為替のデータにもベキ分布が見られています。
そのベキ分布の原因(正体)が、間違いや錯覚やパニックだったとしたら、【動労災害で言う不安全行動が原因だったとしたら】ある種のチャンス!回避のすべがあるかも知れません。
上記でも言いましたが、重大な災害の防止には、ヒヤリハットの削減が有効であることに注目するべきではないでしょうか?
例えば、逆張りEAによくみられる現象に、TPを少なくし、Stoplossを大きく取りどちらかの決済ラインまでポジションを保有するとある種の利益が伸びる期間が存在することがあります。この現象を上記で述べた現象にあてはめると、『ヒヤリした時期があったがそのままポジションを保持していたら、大きな損失を抱えることなくTPに達し利益を得ることが出来た!』となります。つまり、大きな損失を与える事柄の重なりがなく、ヒヤリハットですんだ!となるのです。この一例は、有効である対策と真逆の対応であることは理解して頂けると思います。
『重大な事故が発生すれば、その要因、理由付けが、分かってきます。』また、過去の出来事から、学習することもできるでしょう。しかし、完全に事故が避けられない様にその要因の全てを事前にい把握することは不可能であると考えます。
しかし、事前に把握できる重要要因(経済指標、株価動向 ect)をEAに取り入れることが出来たら、EAの性能の向上に役立つはずです。先先回のブログの内容は、その一環であるとご理解ください。
さて、ここまではある程度納得頂けたと思いますが、ここからは、多くの方に否定される内容だと思いますのでご了承ください。
EAを作る手法の一つに、ニューラルネットワーク(以下NN法)という手法があります。この手法は、人工知能とも呼ばれるもので、脳細胞をモデル化したネットワークを用い情報を処理する構造となっています。NN法には、教師あり学習と教師なし学習という最適化の手法があります。教師あり学習とは、先に正解(教師)を上げそれに近づくように重みを付けていく方法です。ここで気になるのが、『教師が間違いだったら』というものです。先に述べたように、過去の為替のデータにはベキ分布が見られます。ベキ分布の原因が間違いや錯覚やパニックだったとしたら、教師が間違っている可能性があると考えるのが素直ではないでしょうか?
いろいろ書いてみましたが、ベキ分布がまだまだ気になるところです。

2010/05/08

MQL5 Reference 日本語化計画(Google API 編)

※Goole Language API の廃止に伴い使用できなくなりました。 2012/1/4追記
今回は、【Google AJAX Language API】を使用して【MQL5 Reference(chmファイル)】の機械翻訳に挑戦してみました。
【方法】
mql5.chmファイルをデコンパイルし、Google APIを移植し再コンパイルしました。
日本語訳を埋め込むのではなく、APIを埋め込んだのでGoogleの翻訳性能が上がれば日本語訳も向上します。(ただし、毎回読み込み時間が掛かります。)
mql5refe 

【添付ファイル】
日本語バージョン   韓国語バージョン
※APIの埋め込みのため、多言語化が容易に出来ます。
試しに、韓国語も作ってみました。(でも、さっぱり読めませんね!)

【まとめ】
今回、自分のスキル向上を目的に作成してみました。
はたして、スキルが向上したかどうかはわかりませんが、とりあえず掲載しておきます。ただ、毎回読み込み作業が必要になってくるので、サーバーに過度の負荷が掛からないか心配です。

2010/04/10

『経済指標のランク付けに対応してみました。』

今回は、経済指標のランク付け(色分け)をしてみました。
1.方法
①.経済指標名とそのランク(今回は、0から5の6種類)を記載したCSVファイルを作成する。 
          EI_bazoサンプルデータ

②.①で作成したデータを配列に格納し、経済指標名と照合し色分けする。 
    EI_gazo
2.変更内容
①『追加指標名』
Economic_Calendar_DSTv1.0.mq4

②『パラメーターの追加・変更』
A.パラメータの変更
extern color  Index_Color = White;(パラメータ変更に伴い廃止)
B.パラメータ追加事項 
      Object_Mark = 241;//表示マークの変更用
      File_Rank   ="USEI_rank";//指標ランキング用ファイル名
      Rank5_color = Red; //ランク5の表示色
      Rank4_color = OrangeRed; //ランク4の表示色
      Rank3_color = Orange; //ランク3の表示色
      Rank2_color = YellowGreen;//ランク2の表示色
      Rank1_color = SeaGreen; //ランク1の表示色
      Rank0_color = DimGray; //ランク0の表示色
※なお、ランク設定がない場合は、表示色が白に設定しています。

③ 『その他変更ヶ所』
A.表示書式の変更(以下のように変更しました。)
     syosiki 
1行目:番号+ファイル名+インジケーター名
2行目:サーバー時間
3行目:指標名
4~6行目:予想、結果、前回
7行目:高さ軸(価格軸)表示位置
B. バグ修正
①≪インジケーター終了時及び変更時に前回の表示が消えない≫ことを修正しました。
3.まとめ
サンプルファイル内の経済指標のランク付けは、あくまでもサンプルです。使われる際には、ご注意ください。
また、ランク付けファイルに無い経済指標があった場合は、白色表示となります。

2010/04/08

夏時間を調べてみました。

今回は、USAの夏時間補正方法を調べてみました。
1.USA夏時間DATE
適用期間
開 始 日
終 了 日
2007年より前
4月の第1日曜日
10月の最終日曜日
2007年以降
3月の第2日曜日
11月の第1日曜日
※夏時間中の時間は、1時間シフトする。また、変更日が、日曜日であるとから変更時間は、無視します。 各年の日付を確認してみると以下の表となります。
開始日時
終了日時
2000年4月2日
2000年10月29日
2001年4月1日
2001年10月28日
2002年4月7日
2002年10月27日
2003年4月6日
2003年10月26日
2004年4月4日
2004年10月31日
2005年4月3日
2005年10月30日
2006年4月2日
2006年10月29日
2007年3月11日
2007年11月4日
2008年3月9日
2008年11月2日
2009年3月8日
2009年11月1日
2010年3月14日
2010年1月7日
2011年3月13日
2011年11月6日
2012年3月11日
2012年11月4日
2013年3月10日
2013年11月3日
2014年3月9日
2014年11月2日
2015年3月8日
2015年11月1日
2.算出方法 2007年以降の適用期間を算出出来るようにしてみました。 (ただし、日曜日:0、月曜日:、火曜日:・・・・・とする。)※4/22修正
計算式: イベント日(DAY) = (第○週)×7日 - イベント月の前月の最終日の曜日 + 指定曜日
コード: MakeTime =Year_Now + "."+Start_Month + ".01"; //イベント月の1日を抽出 DST_Start = StrToTime(MakeTime) - 86400.0;//イベント月の前月の最終日を格納 Day_S = Start_Week*7 - TimeDayOfWeek(DST_Start) + Start_DayofWeek;//上記 MakeTime = Year_Now + "."+ Start_Month + "." + Day_S; DST_Start = StrToTime(MakeTime);
3.添付資料 ①【Daylight_Saving_Time.mq4】 説明:2000年以降の夏時間期間は、整数1を、それ以外は0を返す指標です。
②【Economic_Calendar_DST.mq4 】 説明:前回の指標【Economic_Calendar.mq4】に 【Daylight_Saving_Time.mq4】を組み込んでみました。(これが作りたかったんですが・・・)前作に、DSTの有無のパラメータを追加しました。
4.まとめ 上記掲載の開始日時及び終了日時は、計算上で求めた日付です。実際との照合は、とっていませんのでご了承ください。また、上記添付の指標は、2000年以前に対応していませんのでご了承ください。

2010/04/07

『経済指標を取り込む』

『経済指標発表時にEAを停止させて、取引を回避し・・・・』良く聞く言葉です。
今回は、この行動が正解なのかを検証する方法(今回は、視覚的に)を考えてみました。
結論から言えば、以下の図のようにチャート上に経済指標を表示させるインジケーターを作りました。
ma-ku  mt4i txt
作成方法:
①データ収集(これが最も重要になります。)
※今回は、『 為替相場過去の経済指標 』のデータベースを使用させて頂きました。
1-1:各国の為替指標データベースをクリック。
1-2:データをコピペし、テキストファイルとして保存する。
(※見出しの段落を調整しておいてください下図参照)
                  txtx
②データの加工及び保存
※①で取得したデータは、Tab区切りのテキストデータになっているので、CSVファイルに変換します。
※今回は、『 CGI制作・提供サイト CGIKON ( シージーアイコン )』のサイトを利用しました。
2-1:上記サイトの【便利ツール】⇒【ファイル変換】を選択し、【参照…】にて①で作成したテキストファイルを選択し、【TSV⇒CSV】を選択します。その後、変換されたCSVファイルを保存します。
2-2:2-1で変換されたCSVファイルを表計算ソフトで開き、以下の列以外を削除します。
≪【年】【月】【日】【時間】【指標】【予想】【結果】【前回】≫
                 excl
※今回は、検証用のため上記に絞り込みました。
2-3:対象ファイルを(……./Meta Trader/experts/files)に保存します。
③MT4への表示
   3-1:使用インジケーター名【Economic_Calendar.mq4
3-2:パラメーターの説明
A【 string File】 保存したファイル名(拡張子含む)
B【 ClientTime_GMT】サーバータイム修正(時間単位)
C【 Object_Type】    表示形態の選択(21:テキスト表示 22:マーク表示)
D【 Font_Size】 表示サイズ
E【Index_Color】 表示色
F【 start】     表示位置(初値からのシフト数)
G【 step】 同時位置に表示位置がなった場合のシフト数
H【Check】   〈 true 〉なら表示内容をファイル(Check.cvs)に保存します。
3-3:夏時間 考慮していません。
3-4:注意事項
表示がおかしい場合は、【FileSeek(handle,35,SEEK_CUR);//2行目ませシフト(バイト数)】の<<35>>を変更してみてください。
④まとめ
経済指標をMT4のチャートに取り入れることにより、経済指標がどの程度チャートに反映されるかわかると思います。 また、今回は、視覚化が目的でしたがこれを取り入れたEAの開発も面白いかもしれません。(夏時間の問題がありますが・・)そして、今回使用させて頂いたデータを公開されている『 為替相場過去の経済指標 』のサイトの作成者様に感謝申し上げます。

2010/01/31

ベキ分布?

『ベキ分布』に衝撃を受けて、半年近くが過ぎました。
今回は、初値と終値の絶対差がベキ分布になるか確かめてみました。
まず、『ベキ分布』とは、べき乗則に従うグラフ(分布)で、特徴は、ロングテール部をもち両対数グラフにおいて線形をみせるものである!とあります。 下図は、参考図です。


【作成手順】
①各時間軸の初値-終値の絶対値を求める。
②スタージェスの公式により階級数を決定する。(k:階級数 n:データ数)







③最大値/階級数でピッチ(間隔)を計算し、ヒストグラムを作成する。




















上記方法により以下の結果が出ました。 上記内容を両対数グラフにしたのが下図です。


【結果より】
予想では、すべての時間軸で線形が確認出来ると思いましたが、以外に、線形を見せたのはM1・M5 程度でM30からは、全体的に丸みのあるグラフができました。
今回の結果として、時間軸が大きくなるに連れてベキ分布からズレていく傾向があることが分かりました。 また、1DAYのグラフを見ると片対数グラフで正規分布となる対数正規分布ではなく、両対数グラフ上で正規分布を見せているようにも見えます。
ベキ分布の要因が、『人は、限定合理的に行動する。』(引用:行動経済学 著:友野典男)であれば、時間と共に限定が解除されている証かもしれません。

【雑記】
まず、以下の質問を考えてみてください。
『あなたの恋人が、奇病【感染率1万分の1・致死率100%】の検査【精度99%】を行った結果、陽性であることが分かりました。あなたはどうしますか?』 私なら、結果を受け入れることができず、恋人にかける言葉も見つからなくなるでしょう。 つまり、直観的に、恋人は、ほぼ確実に、この奇病によって永遠の眠りにつくと思いこみます。
しかし、よく考えてみると! 【100万人がこの検査を行ったとすると】 感染者数:100人(うち検査で陽性反応が出た人、99人) 非感染者のうち陽性反応があった人数:(100万-100)×0.01=9999人 陽性反応があった人数:10098人 陽性反応があった人の感染確率:約1%(0.00980) 感染確率は、約100倍になったが約1%という事は、『ほぼ確実に』とは到底言えません。 『恋人に、再検査を勧める』が、理想の答えとなります。 『合理的な行動』とは、非常に難解であります。