ラベル MetaTrader4 の投稿を表示しています。 すべての投稿を表示
ラベル MetaTrader4 の投稿を表示しています。 すべての投稿を表示

2010/10/13

矢印チャートサンプル

MetaTraderのインディケーターには、主にシグナル用に矢印が表示できます。

この矢印はWingDingsフォントの33から255番までをそのまま表示しているらしく、ヘルプに一覧があるのですが、実際に表示された物を確認したかったので、チャート上に一覧で表示するインディケーターを作りました。

左上のテーブルが33から255番までの、番号と記号の一覧です。

プライスの高値に10個おきに表示されているのが、実際に矢印インディケーターとして表示したサンプルです。

プライスの安値に10個おきに表示されているのが、CreateObjectで矢印オブジェクトを作った際のType1から6までのサンプルです。これはついでです。

パラメターについて

ExtColor
表示カラーです。一覧、サンプルインディケーター、サンプルオブジェクト全てに適用されます。
ExtFontSize
一覧のフォントサイズです。
ExtMarginLeft
一覧の表示位置です。チャートの左端からマージンです。単位はピクセル。
ExtMarginTop
一覧の表示位置です。チャートの上端からマージンです。単位はピクセル。
ExtColMargin
一覧の列間マージンです。単位は倍率(フォントサイズ*n)。
ExtRowMargin
一覧の行間マージンです。単位は倍率(フォントサイズ*n)。
ExtLineNum
一覧の表示行数です。1列に何行表示するか設定します。
ExtArrowType
サンプルインディケーターに表示する矢印の番号です。一覧の中から表示してみたい番号を設定します。

2010/09/30

ボリンジャーバンドを書き直す

BolingerBands_CI.mq4- Project Hosting on Google Code

MetaTrader4のカスタムインディケータです。なんの変哲もないボリンジャーバンドです。

標準の"Bands"が±σ2と中央の移動平均の3本しか引いてくれないので、±σ1も合わせて5本引いています。

インディケーターの計算式はちょうど忘れた頃に限って内容が気になり、その度にwikipedia行って調べたりしているので、3ヶ月毎に「標準偏差ってなんだっけ?」と調べ直さなくても良い様に、3ヶ月後の自分でもコードを読めば解る様に書いたものです。

一度、自分でコードを書くと割と頭に入るので、多分3ヶ月後には見直さないと思いますが、1年後にはまた見るかもしれません。

2010/07/20

MT4で大量のオブジェクトを消す

MetaTrader4で大量のテキストオブジェクトをループで削除する際に、必ず一定数が消えずに残る。という現象にはまったのでメモ。

オブジェクト総数が不明の場合に、総当りの処理をするには、"ObjectsTotal"を使います。ヘルプを見るとサンプルコードが載っています。これが罠ですが。

int obj_total=ObjectsTotal(); string name; for(int i=0;i<obj_total;i++) { name=ObjectName(i); Print(i,"Object name for object #",i," is " + name); }

オブジェクトはindex番号で探しますが、削除する関数"ObjectDelete"では名前で対象を指定します。なので、あわせるとこんな感じになります。

int obj_total=ObjectsTotal(); string name; for(int i=0;i<obj_total;i++) { name=ObjectName(i); ObjectDelete(name); }

これで消えるかと思ったら、消えません。index番号をログに出して見ると必ず後半半分が失敗します。600個なら300個、300個なら150個消え残ります。

どうも、ObjectDeleteは削除するたびにオブジェクト配列を一つ前にシフトするみたいです。考えて見れば当たり前ですが。

object[0] = "a" object[1] = "b" object[2] = "c" object[3] = "d" for (int i=0; i<4; i++) { name = ObjectName(i); ObjectDelete(name); }

このような配列をループで消す場合のイメージですが、

//1周目 i==0 name == "a" //削除後の配列 object[0] = "b" object[1] = "c" object[2] = "d" //2周目 i==1 name == "c" //削除後の配列 object[0] = "b" object[1] = "d" //3周目 i==2 name == "" // GetError() == 4202:ERR_OBJECT_DOES_NOT_EXIST //削除後の配列 object[0] = "b" object[1] = "d" //4周目 i==3 name == "" // GetError() == 4202:ERR_OBJECT_DOES_NOT_EXIST //削除後の配列 object[0] = "b" object[1] = "d"

ベタなオチですが、MTは配列の操作を暗黙的に行う場合が多いので気づかないとハマりますね。コードが"objects.shift()"なら気が付いたかもしれませんが。

結局、全部消す場合、後ろからデクリメントしていくか、だるま落としの様に常に0を消していくかですかね。

int obj_total=ObjectsTotal(); string name; for(int i=obj_total-1;0<=i;i--) // デクリメント { name=ObjectName(i); ObjectDelete(name); } int obj_total=ObjectsTotal(); string name; for(int i=0;i<obj_total;i++) { name=ObjectName(0); // 常に先頭の要素 ObjectDelete(name); }

試してませんが、後者の方が負荷大きそうな気がしますね。

2010/06/01

SwingLine

ZigZagというチャートがあります。値動きの山を名前通りジグザグに表示してくれるチャートです。

このチャートのジグザグ加減は画面サイズに依存するのかと思ったのですが、直近12本分(パラメータExtDepthで変更可)の最高値/最安値を更新したかどうかを見ているぽいです。

そこで現在表示してる領域(*)の24%(パラメータturningWidthで変更可)を基準にジグザグ線を引くチャートを作ってみました。
*:チャートの表示領域は表示範囲内の最高値と最安値によって変化します。

表示領域の高さが5%以上変化すると再描画します。後ろの方にスクロールしてコンテキストメニューから「更新」をすれば見ている範囲に応じて再描画されると思います。

プログラムの練習問題にあるような最大値と最小値の取得などの応用です。単純な配列内から最大値と最小値を探すのとは違い、一定期間の方向性(上昇中なのか下降中なのか)の判断が必要になります。

大体似た線を引くのですが若干違いの出る場所もあります。

どちらかというと描画するだけならゴリゴリif分岐していけばなんとかなるんですが、起動直後にWindowサイズが取れないとか、起動直後と起動後にチャートをリセットした場合で初期化される変数が異なるなどの環境要因の所為でいらない分岐が増えます。

デフォルトのMetaEditorは日本語の入力がおぼつかないので、コメントを英語で書いてますが、内容はかなり怪しい物です。

ソース:SwingLine.mq4 - Google Code(DL:SwingLine.mq4)

2010/03/16

通貨別騰落率チャート

UpDownRatio.mq4

ある時点(デフォルトで足120本前)の値段と比較したクロス円の複数通貨ペア(デフォルトでUSD/JPY, EUR/JPY, GBP/JPY, AUD/JPY, NZD/JPY, CAD/JPY, CHF/JPY)の騰落率(%)を表示するチャートです。

MetaTrader4のカスタムインジケーターですので、MetaTrader4が必要になります。

現在表示している通貨ペアの騰落率が白い線、それ以外の7色が上記7通貨ペアになります。どの線がどの通貨ペアかは、線にマウスオーバーするとツールチップに表示されます。

指定した足の数(デフォルト120)より少ないヒストリカルデータしか取得できない場合(月足の場合など)は警告が出ます。

初期表示時した時点で足120本分前の値段を元に計算するので、短い時間足だとすぐに表示が崩れるかもしれません。

また、一度も表示した事が無い通貨ペアや時間足の場合、データを自動で取得するよりも先に警告が出てしまいます。何回か時間足の表示を切り替えるとその内表示されます。

しかし、結果が視覚的にすぐ確認できるコーディングは楽しい物です。