前回はとりあえずボタンを一個作りました。

ここにプロパティを与えます。

 

 

ObjectSetInteger(0,"Monthly",OBJPROP_XDISTANCE,20);

 

これでボタンのX座標を設定します。

X座標はチャートの左端からのピクセル数です。

 

つまり、この距離。

もうちょい左に寄せたいので20にしてみます。

すると

 

このようにボタン位置が左に移動しました。

0に設定すれば

 

チャート左端にぴったりくっ付きます。

このへんは好みで好きな位置に指定してください。

 

Y座標も同様に指定します。

 

ObjectSetInteger(0,"Monthly",OBJPROP_YDISTANCE,50);

 

XDISTANCEYDISTANCEに変わっただけです。

 

とりあえず、この位置。

 

 

ObjectSetString(0,"Monthly",OBJPROP_TEXT,"Monthly");

 

これでボタンに表示させる文字列を設定します。

 

ObjectSetStringObjectSetInteger

ObjectSetの親戚みたいなもんです。

正確に説明したら長くなるので省略(笑)

 

注意してほしいのは

 

ObjectSetString(0,"Monthly",OBJPROP_TEXT,"Monthly");

 

この最初の「Monthly」はオブジェクト名

つまり、このボタンに与えた固有の名前ですが

 

ObjectSetString(0,"Monthly",OBJPROP_TEXT,"Monthly");

 

こっちの「Monthly」はボタンに表示させたい文字列です。

ちょっと紛らわしいですが混同しないでください。

 

 

 

はい、ちゃんと表示されました。

 

 

とりあえず、ここまで。

僕はとても困っています・・・

そろそろネタが尽きてきました。(笑)

「インジケーターを改造しよう」なんてえらそーなこと言ってますが

僕のMQLスキルなど上級者レベルにはほど遠い

ぶっちゃけ

やっと初級者を卒業した程度(笑)

できることなど限られてます。

そんなわけですので

ある程度のスキルが獲得できたなら

もっと上級者から学ぶことをおすすめします。

僕としては

「MQLはそれほど難解なものじゃない」

ということが理解してもらえれば、それで満足です。

 

とりあえず今回は

 

ボタンを作成しよう!

 

ボタンがあると、いかにもGUIって感じがして

MQLの階段を一段上がったような気になれます。

非常に自己満足度の高いスキルです(笑)

 

こんな感じで

ボタンでTimeFrameを変更できるようにしたいと思います。

Dailyボタンをポチッと押すと

 

このようにDailyモードに切り替わります。

いちいちパラメーター画面を開く必要がなくなるわけです。

 

ボタンはインジケーターを読み込んだ時に一回表示させれば

それでOKなので、初期化処理の関数である

 

OnInit

 

 

ここに入れちゃいます。

まずは

 

ObjectCreate(0, "Monthly", OBJ_BUTTON, 0,0,0);

 

Monthlyというオブジェクト名のボタンを作成しますよー、

という関数です。

とりあえず、この一行をコピペして挿入してください。

 

こんな感じ。

すると

 

はい、ボタン出現。

 

ボタンはこのように、とりあえず作ってしまって

それから

表示させる文字

ボタンの色

表示させる位置(座標)

ボタンの大きさ

などのプロパティを与えていきます。

 

今回はここまで。

前回の続きです。

 

VLine[i] についてですが、

チャート上で右クリックして

「表示中のライン等」を選択してみてください。

 

 

すると

 

 

こんなのが表示されるはずです。

この右側の列が区切り線のオブジェクト名になります。

VLine[2]から始まってVLine[30]まであります。

 

 

この一番右側のがVLine[2]です。

そして左にひとつずれるたびに

VLine[3] VLine[4] VLine[5] ・・・という風にひとつずつ数字が増えていきます。

なんで[1]から始まってないのか?

繰り返し処理でiの初期値を2にしたからです。

[1]から始まるようにも、もちろんできますが

コードが増えるのでやめときました。

 

さて

 

例えば、i=3の場合

つまり、このVLine[3]をクリックしたら

 

 

このRectangleの四本値に水平線を移動したいわけです。

 

ObjectMove("High",0,0,iHigh(NULL,TimeFrame,i-1));

 

ObjectMoveはオブジェクトを移動させる関数です。

この場合は"High"つまり高値の水平線を

iHigh(NULL,TimeFrame,i-1)座標に移動させます。

i=3なら

iHigh(NULL,TimeFrame,2) です。

 

この数字の意味は前に説明しました。

Monthlyモードだったら

今月が0

先月が1

先々月が2。

だから

 

iHigh(NULL,TimeFrame,2)

これは先々月の高値という意味です。

 

意味が理解できたらコピペして他のラインのObjectMoveを追加します。

 

 

これでOKです。

 

今回追加したコード全体は

 

 

このようになります。

 

 

先々月の高値でサポートされてる状態だとわかりますね。

 

OnChartEvent関数の続きです。

 

チャート上のオブジェクトに何らかのアクションがあった場合に

なんらかの処理を行うようにする。

 

今回の場合は

 

区切り線をクリックした場合

水平線をその区切り線の右側のRectangleの四本値に移動させる。

 

という処理になります。

 

まず

 

void OnChartEvent(const int id,const long &lparam,
const double &dparam,
const string &sparam){

 

 

if(id == CHARTEVENT_OBJECT_CLICK){

 

この二行をプログラムの一番最後に追加してください。

 

そして、この二つの相方の括弧を二つ

 

}}

 

これを追加。

 

 

こんな感じにします。

これは定型文と考えておけばOKです。

チャート上のオブジェクトをクリックした時

何らかの処理を行いたい場合は

これをこのまま使えばいいです。

 

そして

 

for(int i = 2;i<RectangleTotal+1 ;i++){

string Number = "["+IntegerToString(i)+"]";

if(sparam == "VLine"+Number){

ObjectMove("High",0,0,iHigh(NULL,TimeFrame,i-1));}}

 

この四行を最後の二つの括弧の前に入れます。

適当に形を整えて

 

 

こんな感じ。

これで、とりあえず高値は移動できるようになります。

試してみてください。

 

続く

 

前回まででインジケーターとしては、ほとんど完成なんですけど

この記事の趣旨はMQLのスキルを上達させることなので

思いついた関数などを利用しつつ

さらに改造を続けていこうと思います。

 

今回はですね

 

OnChartEvent関数

 

こいつを使ってみましょうか。

 

例えばですね

 

現状、水平線は一番右のRectangleの四本値ですが

他のRectangleの四本値を見たい時もありますよね?

 

 

このような「天底」の四本値は特に重要です。

「この四本値が見たいなー」という時に

 

ここの区切り線をクリックすると

 

 

水平線が移動しました。

綺麗に反応してることがわかります。

 

と、このようなことが可能になります。

つまり

 

チャート上のオブジェクトに何らかのアクションがあった場合に

なんらかの処理を行うようにする

 

そんな関数なんです。

 

 

たまに、チャート上にボタンのついてるインジケーターを見かけますよね?

 

これは僕の自作で

MTFのボリンジャーバンドです。

僕はボリンちゃんに関しましては

「特定のひとつの期間」だけを見てるわけではなく

20と21と25のそれぞれSMAとEMAについて監視してます。

これらをいちいパラメーターの設定画面を開いて変更してたら

それはそれは相当めんどくさいことになります。

そこで

このようにチャート上のボタンをクリックすれば

即座に変更できるようにしたわけです。

 

25SMAが見たいなーと思ったら25のボタンをポチッ

すると

このように変わります。

 

時間軸もボタンクリックで変更できます。

Dailyが見たいなーと思ったら「D」ボタンをポチッ

これは20SMA。

 

これは20EMA。

 

こーゆーことが可能になります。

 

続く

 

15分足

こっからロングで+5pips。

前にも一度説明したパターンです。

 

1.ロンドン時間とNY時間のオーバーラップ時間帯

2.Market Profileのお山付近

3.Volumeのお山付近

 

これが僕の三拍子。

LAさんの三拍子とは関係ありません(笑)

 

三拍子そろったゾーンは、かなりのマネーが動いてます。

僕はMMさんでないので実際のところはわかりませんし

想像でしかありませんが、ぶっこまれてるはずです。

それだけS&Rになりやすい。

だから三拍子そろったゾーンは要注意。

 

 

Dailyモードです。

狭い本体ゾーンを抜けきるとS&R転換しやすいというのは

MonthlyやWeeklyと同じです。

見ての通り、昨日は糞長い下ヒゲ足なので

ショートで勝負するのも、なんだか気乗りしません。

だからロングパターンだけ狙ってます。

 

ここをあっさり再び上に抜けてきたら

「まだまだBullやなー」と判断できます。

見た感じ捕まってるみたいなので

BullBullって感じでもないようです。

押し目をしっかり拾われてるのでBullはBullですが

BearなMMさんもいるなー

こっからどう動くのかなー

といった感じです。

 

S&Rってのは単に抜けた抜けなかったではなく

抜け方を観察するってのも大事なんですよ。

あっさりと、あるいは力強く

ブリブリッて感じで抜けていく時は

MMさんの行きたい方向はそっちなので

カウンターはやめといた方が無難だなーと

僕は判断してます。

 

MMさんの思惑を読み取るには

実は1分足でのPAを見るのも、とっても大切なのですが

タダで有益な情報を垂れ流しても仕方ないので

興味がある人は観察してみてください。

まあ、たぶんわからないと思いますが(笑)

 

前回の記事では

一週間を7日として計算することで起こる問題について書きました。

 

じゃあ、どうすればいいか?

 

この発想が大切。

 

問題を問題として認識しながらも放置するような

そんなポンコツ思考ではいけません。

「工夫してなんとかならないか?」

という方向に思考を向けなければ。

根本的にプログラムのレベルで解決するという方法もありますが

色々とけっこー難しいです。

なので

僕の場合は「5日足」を使ってます。

つまり日足の一目のパラメーターを5倍します。

 

これは日足チャートに「間違ってる週足雲」と5日足の雲を表示させたものです。

赤い方が5日足雲。

これだと「正しい週足雲」にかなり近くなります。

完璧ではありませんが。

そして

 

たとえば、このあたりの反応をズームしてみると

 

どっちも意識されてることがわかります。

 

ここなんかも面白いですよ。

 

オーバーラップしてるゾーンでS&R転換してます。

 

 

このあたりはシンクロしてますが

 

やはり強いんですよ、ダブルだと。

 

このように5日足というのは、色々と使い道があります。

 

 

僕が5日足という発想ができたのはMQLに関する知識が

ほんの少しあったからです。

最近は「インジケーターを改造しよう」シリーズの記事が多いですが

きっと、ほとんどの読者は読んでないと思うんですよ(笑)

 

思考に気をつけなさい、それはいつか言葉になるから。

 

MQLのスキルとトレードを切り離しちゃってる時点で

その人の思考は前進を止めたのと同じなんです。

 

トレーダーとして、さらなる高みを目指すなら

MQLのスキルは必ず役にたちます。

前にも言いましたが

僕としては、みなさんが勝ち組になることにメリットはありませんし

ずっと負け組のままでいてほしいというのが本音なので

強くおすすめはしませんが(笑)

ドル円様 週足

25日先行させたMA1がSS1(先行スパン1)付近です。

スパンモデルの画像は使えないので

このような表現をしてみました(笑)

 

さて

月足の一目を週足で表示させると

SS1を抜けるかどうかってところなのですが

これを日足で表示させると

 

もう抜けちゃってます。

これがMTFのめんどくせーところでして

そもそもの原因は

 

MQLの時間軸の定数 です。

 

「インジケーターを改造しよう」で何度か取り上げましたが

時間軸を表す定数は決められていて「分」の数値になってるのですが

 

日足 1440

週足 10080

月足 43200

 

これを見て、すぐに問題点がわかった人は、なかなか鋭いです(笑)

 

週足は日足の7倍

 

1440*7=10080

 

月足は日足の30倍

 

1440*30=43200

 

と、このように計算されてるのですが

 

一週間の営業日は7日ではなく5日です。

 

それなのに日足の時間を7倍するというのは

計算式としておかしいわけです。

 

月足にしても正確に30日というわけではなく22日とかです。

これだけ違って誤差が生じないわけがないのです。

 

週足ですが、黄色い丸のあたりはなかなかいい反応をしてます。

 

これを日足でMTFで表示させると

こんなことになってしまうわけです。

もちろん、これは間違った週足なのですが

この間違った方が意識される場合もあるということが

さらにこの問題をややこしくしてます(笑)

 

これも日足チャートに週足の一目を表示させたものですが

「間違った一目」が機能しちゃってます。

 

というわけで

どっちが機能するかわからないので

僕はいつも両方見てます。

僕もだんだん疲れてきました(笑)

 

あ、ビールはまだあるので大丈夫です(謎)

 

 

ということで

 

座標数値の部分を i i-1 や i-2に書き換えて

 

オブジェクト名も前回説明したように書き換えていきます。

 

 

 

 

 

全体像は

 

 

こうなります。

 

表示させるだけなら以上でOKですが

まだ終了処理をしなきゃいけません。

そして終了処理にも繰り返し処理が必要です。

 

ここに

 

for(int i = 2;i<RectangleTotal+1 ;i++){

string Number = "["+IntegerToString(i)+"]";

ObjectDelete("UpperZone"+Number);

ObjectDelete("LowerZone"+Number);

ObjectDelete("MidZone"+Number);

ObjectDelete("VLine"+Number);}

 

これを丸っとコピペしてください。

全角スペースを入れないように注意して形を整えて

 

 

こんな感じにします。

垂直線のObjectDeleteが分離されてしまってたのですが

垂直線の削除にも繰り返し処理が必要なので、ここにまとめてあります。

 

 

以上で完了です。

 

 

パラメーターのRectangleの総数を増やせば

 

 

実に壮観(笑)

 

 

今回は色々と盛りだくさんだったので

きっと頭の中は整理されてないでしょうが

僕はそんなことは知りません(笑)

タダでこんなに丁寧に教えてもらえるだけで

ありがたいと感謝してほしいくらいです(笑)

ぶっちゃけ、僕はかなりのお人よしなので

有料セミナーで教えてもいいくらいなレベルのことまで

調子にのって教えてしまうこともあります(笑)

 

 

今回はまだまだ続くので覚悟しておいてください(笑)

 

ObjectCreate(0,"UpperZone[i]",OBJ_RECTANGLE,0,iTime(NULL,TimeFrame,i-1),iHigh(NULL,TimeFrame,i),iTime(NULL,TimeFrame,i-2),iClose(NULL,TimeFrame,i));

 

で注意しなきゃいけないのは最初の

 

"UpperZone[i]"

 

です。

これはオブジェクト名なので「数値」ではなく「文字」なのです。

プログラムでは文字と数値は全くの別物として扱われます。

ですので、ここは別の処理が必要になります。

 

まず

 

string Number = "["+IntegerToString(i)+"]";

 

これをコピペして、さらに

オブジェクト名の [2]" "+Number に変えてください。

 

 

ここに追加してください。

 

string は文字列を指定する時に使用します。

だから

 

string Number 「Numberは文字列ですよー」という意味になります。

 

 

文字列をつなぐ時には「+」を使います。

そして、つなぎたい文字は「""」でくくります。

 

IntegerToString

 

これは整数を文字列に変換する関数です。

数値はそのままでは文字として使えないので

この関数で変換させてやるわけです。

 

つまり

 

IntegerToString(2)

 

だったら、「数値の2を文字の2に変換しますよー」という意味になります。

 

結局

 

"["+IntegerToString(2)+"]"

 

というのは

 

[ 」 と 文字の2 ]   をつないで

 

[2] という文字になりす。

 

 

まだまだ続く(笑)