ちょっと予定を変更して

先にRectangleを描画したコードの説明をします。

 

水平線を描画するのと似たような感じなんですけど、Rectangleの場合は

 

 

対角の二点の座標を指定します。AかB、どっちの組み合わせでもOKです。

 

例えば

 

 

このWeeklyの上ヒゲゾーンのA点の座標というのは

 

iTime(NULL,TimeFrame,0),iHigh(NULL,TimeFrame,1)

 

で指定されます。

 

iTime(NULL,TimeFrame,0)  これがX座標、つまり時間

iHigh(NULL,TimeFrame,1)  これがY座標、つまり価格

 

iHighは前回説明しました。

iHighは指定したバーの高値を取得する関数ですが

iTimeは指定したバーの開始時間を取得する関数です。

 

なので、iTime(NULL,TimeFrame,0)の意味するところは

TimeFrameでWeeklyを選択した場合

 

バーの開始時間(現在表示してるチャートの通貨ペア、Weekly、今週)

 

ということです。

 

一方、対角の

 

 

こっちのA点の座標は

陽線と陰線とで座標が違ってきます。

陽線だったら終値ですし、陰線だったら始値です。

 

そのため

 

 

 

このようにif-else条件処理というものを行っているのです。

この処理については、いずれあらためて説明するとして

陽線の場合はA点の座標は

 

 

となります。

 

Time[0] というのは現在のバーの形成開始時間です。

 

以上が理解できれば

 

 

この部分の記述の意味も理解できると思います。

そして

 

 

この部分と同じように

水平線の色の設定にも

 

ObjectSet という関数を使います。

 

結局何が言いたかったかというと

「長方形でも丸でも三角でも垂直線でも水平線でも

オブジェクトの記述というのはみんな似たような感じですよー」

ということです。

 

 

iHigh(NULL,TimeFrame,1)の説明の続きです。

 

iHighは指定したバー(ローソク足)の高値を取得する関数です。

 

最初のNULLは「現在のチャートの通貨ペア」という意味です。

例えば表示してるチャートとは別の通貨ペアの高値を表示する

ということも可能なのです。

 

TimeFrameは時間軸のパラメーターですね。

 

最後の1はバーのシフトの数を指定します。

現在のバーを0として

一本前が1

二本前が2

と、過去にさかのぼるたびに1ずつ増えていきます。

 

Weeklyの場合だったら

今週が0

先週が1

先々週が2

となるわけです。

 

他の「安値」「始値」「終値」も同様です。

iLow

iOpen

iClose

となるだけで。

 

つまり

 

ObjectCreate("LastWeekHigh",OBJ_HLINE,0,0,iHigh(NULL,TimeFrame,1));

 

この、先週高値の水平線を描画するコードをコピペして

Highの部分をLow,Open,Closeに置き換えるだけでOKなんです。

もちろんオブジェクト名もですよ。

 

これでOKです。

 

このように各水平線が表示されます。

 

ただし、このままだとRectangleの時と同様で

時間軸のパラメーターを変更しても

 

 

反映されません。

 

なので、Rectangleの時と同様に削除コードを入れます。

 

ObjectDelete("LastWeekHigh");
ObjectDelete("LastWeekLow");
ObjectDelete("LastWeekOpen");
ObjectDelete("LastWeekClose");

 

この四行をRectangleの削除コードの下に追加します。

 

 

こんな感じ。

 

今回はここまで。

次回は水平線の色と線種を変更できるように改造したいと思います。

暇なのをいいことに、どんどん進めていきます。

誰もついてこれないでしょうが僕はそんなこと知りません(笑)

 

今回は水平線を引いてみたいと思います。

 

このインジケーターはゾーン表示することで

直感的にわかりやすくしてあるのですが

それだとゾーンの中しか見ない人がいるので。

S&Rを見たいんですからチャートの左をざーっと確認しなきゃダメです。

僕の弟子のけびんのような視野の狭いポンコツになってはいけません。

 

そのためには、どうしても水平線は必要です。

 

水平線を描画するのは簡単です。

例えば高値だったら

 

ObjectCreate("LastWeekHigh",OBJ_HLINE,0,0,iHigh(NULL,TimeFrame,1));

 

この一行を追加するだけです。

Rectangleのコードの下

 

 

こんな感じで追加すればOKです。

 

ObjectCreateはRectangleでも使ってる、オブジェクトを生成する関数です。

 

その次の"LastWeekHigh"というのはオブジェクトの名前です。

オブジェクトには必ずなんらかの名前をつけなきゃいけないのです。

 

OBJ_HLINEはオブジェクトのタイプの指定です。

RectangleだったらOBJ_RECTANGLE

今回は水平線なのでOBJ_HLINE。

 

その後の0はメインウインドウという意味です。

 

その次にも0がありますが、これは横軸の座標指定です。

水平線は時間指定は意味がないので常に0でOKです。

 

最後の

iHigh(NULL,TimeFrame,1)

これで縦軸の座標を指定してます。

つまり水平線を引く価格。

 

iHighは

 

字数制限の関係で次回に続く(笑)

僕みたいな、ひきこもりのぼっちは土日は何もすることがありません(笑)

ブログはとても良い暇つぶしになります。

 

さて今回は

 

enum 列挙型

 

というやつを組み込んでみたいと思います。

 

これは何かというと

パラメーターを変更する時に、いちいち数値を入力するのではなく

リストから選択できるようにするためのものです。

 

まず

 

enum TimeFrameSelect{Monthly = 43200,Weekly = 10080,Daily = 1440};

 

この一行をコピーして

extern int TimeFrame = 10080 ;の行の上に挿入してください。

これで

 

「TimeFrameSelectという列挙型のデータを使いまーす。

Monthlyには43200

Weeklyには10080

Dailyには1440

これらの数値を代入しまーす。」

 

という意味になります。

 

TimeFrameSelectはわかりやすいようにそう名付けただけですので

別に好きな名前をつけてもかまいません。

 

 

それからextern int TimeFrame = 10080 ;

 

extern TimeFrameSelect TimeFrame = Weekly ;

 

に書き換えてください。

 

「TimeFrameSelectをパラメーターにしまーす。

TimeFrameにはWeeklyを代入しまーす。」

 

ということです。

Weeklyにはその前で10080が代入されてますので

Weeklyを選択すれば結果的に10080を入力したことになるのです。

 

 

 

こうなってればOKです。

 

以上です。

いつものように別名で保存してCompileしてください。

 

 

Weeklyをダブルクリックすれば

 

 

このように選択できるようになりました。

僕は自分のペースでどんどん記事を書いていきますが

別に僕のペースに無理に合わせる必要はありませんので

ひとつひとつ確実に消化していってください。

 

とりあえず現時点で

 

 

こんな感じになってると思います。

 

いや、なってないですよね(笑)

 

 

この三行は見やすくするために入れただけです。

 

//以下はプログラムとしては読み取られないので

説明文を入れるためによく使われます。

特に初心者はプログラムのコードだけだと何がなんだかわかりませんので

//を使っていちいち説明を入れておいた方がいいです。

 

 

こんな感じで。

 

ただ、パラメーターに関しては

 

 

こうした場合

 

 

このように日本語で表示されます。

「わしゃー英語はようわからん」という人はこっちの方がいいかもしれませんね。

 

あと

括弧の位置を微妙にズラしてる理由ですが

 

括弧は二個で一組で、相方が決まってます。

 

括弧が足りなかったり、ダブってたりしたらエラーになります。

実はこの括弧のエラーは非常に多いんです。

僕は何度も何度も何度も何度も、括弧エラーで苦しんだ(笑)

なので、括弧が複数行にまたがるような場合は

 

相方の括弧を同じ列にそろえれば括弧エラーが見つけやすいんです。

 

 

メタエディターは括弧をクリックすると

 

 

このように相方をハイライト表示してくれるので

どこが間違ってるか、たいていわかります。

 

例えば

 

 

最後の行に余計な括弧を入れてみました。

その括弧をクリックすると

 

同じ列に括弧がなく、相方もハイライト表示されないので

「あー、この子は要らん子や」とわかるわけです。

前回の改造の「意味」を説明します。

 

 

if(reason==REASON_REMOVE || reason==REASON_PARAMETERS)

 

これはその後に記述されている関数が実行される条件を設定してます。

この意味は

 

「もし、インジケーターが削除された、あるいはパラメーターが変更された場合は」

 

となります。

ifは「もしも」、reasonは「理由」、removeは「外す」

これらはまあ、わかりますよね。

 

ただ

== と ||

これは一般ぴーぽーが日常で使うことはまずないはずです。

 

==は僕たちが普通に考える「イコール」だと思えばいいです。

これが「=」といっこだけの場合

例えば

A=B という場合は

「AにBを代入する」という意味になるので要注意です。

これはMQL初心者は必ず「???」になるはずです。

誰もが通る道です。僕もそうでした(笑)

 

とにかく普通に「等しい」という意味で使う場合は

イコール二個だと覚えておいてください。

 

 

そして

||

これはORです。「あるいは」という意味です。

入力する場合はShiftキーを押したまま、Backspaceキーの左のキーを二回押します。

 

 

んで、次にこれらの条件が満たされた時に実行される関数

 

ObjectDelete("LastWeekUpperZone");

 

これはLastWeekUpperZoneというオブジェクトを削除しますよーという意味です。

 

 

つまり

Rectangleの座標を移動させるのではなく

一度消してしまって、再度作り直すことで問題を解決したのです。

 

 

「削除しただけで作り直してないじゃないか」と思うかもしれませんが

Custom indicator initialization function 

以下のコードはtickを受信するたびに実行されてるんです、実は。

試しにRectangleのコーナーをダブルクリックして右クリックから削除してみてください。

すぐに再生されます。

土日はtickを受信してないので再生されませんが。

 

 

以上が前回の改造の意味です。

 

ドル円様 1時間足

 

おそらくFXBさんも注目してたであろう、このライン。

 

Monthlyの四本値ラインも絡んでる見え見えのS&R。

 

ですが、日本人にとってはつらい時間帯(笑)

もちろん僕はノートレです。

 

5分足

ここを狙ってたのですが

本体ゾーンぎりぎりまで引き付けようとしすぎて逃げていきました(笑)

僕はとにかくぎりぎりまで引き付けたい人なので

こーゆーことは頻繁にあります。

 

結局僕がエントリーしたのは

1分足

先月安値ラインのここです。

ロングでいつもどおり+5pipsでサクッ。

その後、何pips伸びようが僕は知ったこっちゃない(笑)

ちなみに

黄色い丸で囲んであるのは1分足レベルのLinesです。

こーゆーのを見つけることに関しては僕は天才です。

自分で言うのもなんですが、まぢ天才。

 

 

110.25、つまりquarterですし

Fibonacci Pivot のMonthly 38.2 Support

 

 

4時間足

これも見え見えのライン。

本体が抜けるのをずっと待ってました。

 

ということで、

僕はこの時点ですでにかなり満足しちゃってたのです(笑)

 

とにかく昨日のMMさんは見え見えのBullでしたので

てきとーにロングしてれば誰でも勝てたと思います(笑)

 

FXBさんの大好きなコマ足包み線ではありませんが

いちおう包み線も出てますし

その後のペナントもしっかり上にブレイクしてますし

いちいち説明しませんが

他にも下位の時間足でもあちこちでBull見え見えでしたし

これで目線が下になってた人は

脳みそが腐ってるのでFXはやめといた方がいいです(笑)

最初に読み込んだ時に固定されてしまったRectangleの座標。

 

ObjectMove という関数で移動させるのが普通ですが

 

今回はそれじゃなくって

 

void OnDeinit(const int reason)

 

これを使います。

初期化解除の関数です。

 

すでに気づいてるでしょうが

このインジケーターは削除してもRectangleが残ったままです。

そいつも同時に解決するために

初期化解除のコードを追加します。

 


void OnDeinit(const int reason){
if(reason==REASON_REMOVE || reason==REASON_PARAMETERS)
{
ObjectDelete("LastWeekUpperZone");
ObjectDelete("LastWeekLowerZone");
ObjectDelete("LastWeekMidZone");
}
}

 

この8行をこのままコピーして23行目の下に挿入してください。

適当に改行やスペースを入れて

 

こんな感じにしてください。

スペースを入れる時は

 

絶対に全角を使わないでください!

 

全角だとスペースじゃくて文字として認識されてしまうんですよ。

 

だからエラーになります。作動しません。

 

プログラム中は日本語を入力する必要のある時以外は

常に半角の直接入力モードしておいてください。

 

全角のスペースを入れてしまったら見た目は半角スペース二個と同じなので

発見しにくいです。

僕は何度もそれではまった(笑)

 

書き換えたら、いつものように別名で保存してCompileしてください。

パラメーターを変更すれば、ちゃんと反映され

インジケーターを削除すればRectangleは消えるようになってるはずです。

 

 

 

前回はMonthlyの四本値を表示できるように改造しました。

ただ、それだとインジケーターが二種類必要になります。

そこで、ひとつで両方表示できるようにします。

 

前に色を変えられるようにした時は色を変数(パラメーター)にしました。

今回は時間軸を変えられるようにしたいのですから

時間軸を変数にすればいいのです。

 

色を変数にした時はextern colorを使いましたが

今回は

 

extern int

 

こいつを使います。

 

intはinteger(整数)を意味します。

 

変数名は何でもいいのですが、わかりやすいように今回はTimeFrameとします。

 

というわけで

 

extern int TimeFrame = 10080 ;

 

この一行をコピーして12行目の下に貼り付けてください。

 

 

 

それから前回43200に書き換えた部分を

すべてTimeFrameという文字列に書き換えます。

やり方は前回と同じです。

 

こうして「Replace All」をポチッと押すだけ。

 

 

あとはいつものように別名で保存してCompileすればいいです。

新規のチャートに読み込むと

パラメーターにTimeFrameが追加されてます。

Monthlyの四本値を表示したい時は43200を入力すればOKです。

 

Dailyにすることもできますよ。

このように、日足の定数である1440を入力すればいいだけです。

すると

 

このように前日の四本値が表示されます。

 

ですが、「ある問題」が発生します。

新規で読み込んだ場合はこのように正しく表示されますが

例えば最初にMonthlyで読み込んだチャートで

「Weeklyを見たいなー」と思い

バラメーターを10080に変更しても表示は変わりません。

それは

最初に読み込んだ時にRectangle(長方形)の座標が固定されるからです。

 

それを解決するには・・・・

 

続く(笑)

需要がなくても僕はかまわず進めていきます(笑)

読者を増やすことなど微塵も考えてません(笑)

 

今回は月足用に改造してみましょう。

 

MQLでは時間軸の値は定数で決められてます。

 

http://www.metasys-seeker.net/MQL4_Reference_ver1/02-02_Timeframes.html

 

ここは僕がしょっちゅうお世話になってるサイトです。

てゆーか、MQL初心者はみんなお世話になってると思います。

なんかわからないことがあったら、まずここで調べます。

 

週足の定数は10080です。

これを

月足の定数43200に変えます。

 

これだけで月足仕様になります。

この程度なら一つずつ書き換えてもたいした手間じゃないのですが

実は一度に全部置き換えることができます。

 

メタエディターのツールバーから

「Edit」→「Find and Replace」→「Replace」 を選択してください。

 

それから、このように数値を入れます。

10080を見つけたら43200に置き換えますよー、という意味です。

あとは「Replace All」をポチッ。

 

すると

19箇所書き換えましたよーと表示されます。

 

はい、全部43200になってます。

 

これで完了です。

 

あとは週足用とは別名で保存してCompileするだけ。

 

問題なし。

簡単、簡単。

 

このように、MQLなんてひとつひとつクリアしていけば

たいして難しくはないんです。

この「ひとつひとつ」の積み重ねが大事。

いわばこれはスキルのaccumulationです。

それを怠ると僕の弟子のけびんのように

いつまでたっても何もできないポンコツになるわけです。

永久にMarkupはやってきません。