ここではサイコロジカルラインのインジケータ―やEAの作り方について解説します。
サイコロジカルライン(Psychological line)とは、投資家心理を数値化したオシレーター分析のインジケーターです。(n日間で終値比プラスの日数)÷ n × 100で算出され、75%で買われ過ぎ、25%で売られ過ぎと判断します。
インジケーターの作り方
次のリンクから今回作成したサイコロジカルラインのインジケーターファイルがダウンロードできます。
今回完成したインジケーターファイル【Psychological.mq4】をダウンロード
インジケーター新規作成
MetaEditorで新規作成ボタンでMQL4ウィザードを開き、「カスタムインディケータ」にチェックを入れます。
次へボタンをクリック。
インジケーターの名前を入力し、パラメーターを作るため追加ボタンをクリックします。
パラメーターを次のように設定します。
名前 | タイプ | 初期値 |
---|---|---|
Psycho_Period | int | 12 |
次へボタンをクリック×2。
「サブウインドウに表示」にチェックを入れて、
「最小値」「最大値」にチェックして、最小値を0、最大値を100にします。
インジケーター用配列を作るため、追加ボタンをクリックします。
今回は、次のように設定しました。
ラベル | タイプ | カラー |
---|---|---|
Psychological | Line | Yellow |
完了ボタンをクリック。
これで、サイコロジカルラインを描画させる大まかな枠組みが出来ているので、後はOnCalculate()関数内にサイコロジカルの計算を追加するだけです。
OnCalculate()関数内の処理
OnCalculate()関数内でサイコロジカルの計算をします。
変数を宣言
使用するローカル変数を次のように宣言します。
int i, j, limit;
過去の部分から描画するコード
過去の部分のサイコロジカルラインも描画させるため、次のコードを追加します。
if (prev_calculated == 0) // 最初
limit = rates_total - 1; // 左端のローソク足から全部
else // それ以外
limit = rates_total - prev_calculated; // ローソク足増加時「1」、通常「0」
for (i=limit; i>=0; i--) // limit本前から現在のローソク足を処理
{
// ここでサイコロジカルを計算
}
このコードは、インジケーターを作成する場合によく使用しますので、覚えておくと便利です。
サイコロジカルを計算
上記for()文の{}括弧内に次のコードを追加します。
if (i + Psycho_Period >= rates_total) continue; PsychologicalBuffer[i] = 0; for(j=0; j<Psycho_Period; j++) { if(Close[i+j] > Close[i+j+1]) PsychologicalBuffer[i] += 100; if(Close[i+j] == Close[i+j+1]) PsychologicalBuffer[i] += 50; } PsychologicalBuffer[i] /= Psycho_Period;
もし、i + Psycho_Period がローソク足本数以上の場合はスキップ PsychologicalBuffer[i] に 0 を代入しておいて、 ローソク足Psycho_Period本分の終値比較を実行する { もし、今回終値が前回終値より大きい場合、PsychologicalBuffer[i] に 100 を足す もし、今回終値と前回終値が等しい場合、PsychologicalBuffer[i] に 50 を足す } PsychologicalBuffer[i] を Psycho_Period で割る
これで、(n日間で終値比プラスの日数)÷ n × 100が計算されて、サイコロジカルラインが描画されるようになります。
EAの作り方
次のリンクから今回作成したサイコロジカルラインを使用したEAファイルがダウンロードできます。
今回完成したEAファイル【Psychological_EA.mq4】をダウンロード
テンプレートEAを利用する
過去の記事【EA作成の為のテンプレート】でダウンロードできるテンプレートEA最新版「Template_2019.mq4」をカスタマイズしてサイコロジカルラインによるEAを作成します。
パラメーターを追加・変更する
パラメーター変数に次のコードを追加します。(UseMA_Exitは削除します)
extern int Psycho_Period = 12; extern double Psycho_SellLevel = 75; extern double Psycho_BuyLevel = 25; extern bool UsePsycho_Exit = true;
シグナル判定を変更する
MAによるシグナル判定を、サイコロジカルラインによるシグナル判定に変更して、ma_signをpsycho_signに変更します。
int psycho_sign = 0; double psycho_1 = iCustom(NULL, 0, "Psychological", Psycho_Period, 0, 1); double psycho_2 = iCustom(NULL, 0, "Psychological", Psycho_Period, 0, 2); if (psycho_2 > Psycho_BuyLevel && psycho_1 <= Psycho_BuyLevel) psycho_sign = 1; if (psycho_2 < Psycho_SellLevel && psycho_1 >= Psycho_SellLevel) psycho_sign = -1;
int entry_sign = 0; if (psycho_sign == 1) if (filter_ok_buy == true) entry_sign = 1; if (psycho_sign == -1) if (filter_ok_sell == true) entry_sign = -1;
あとがき
サイコロジカルラインは意外と簡単な計算ですので、iCustom()関数を使わずにEA内で算出しても良いですね。
では今回はこのへんで。
ありがとうございます !! 対応してくださって、感謝感激、雨あられ、どころか、まさに日本晴れです
願いを聞いて、かなえてくれる、そういうひとが世の中に居るんですね。神様のような存在に感じました
早速、ダウンロードいたしまして、いろいろ学んでいるところです。
maさん
おはようございます。
お役に立ててよかったです^^
がんばりましょ~!
先日は、ありがとうございました
あれから、数ヶ月間、ストラテジー作りに躍起になり、おかげさまで、プログラミング初心者の私にも、ようやく、トレンドフォロー系のEA PF 1.7 、一時間足のものが、3個出来上り、二ヶ月半前から実運用していまして、かなり順調です。
しかし、その短所を補う意味で、逆張り系のEAを作りたく、ADXをフィルターとして、試行錯誤していますが、なかなか良いものは出来上りません・・(日足で、PF1.5、しかし、半分がトレンドフォローの意味を含んでしまっているものは出来ました)
そもそも、純粋な意味のカウンタートレードは、成立しないのでしょうか。
自分で勉強しなければいけないこととは一方で思うのですが、なにとぞ、ヒントだけでも与えていただきたく、お願いいたします。
maさん
こんにちわ!
良いEAができてよかったです^-^
トレンド転換をとらえるのは難しいと思いますが、もみ合いでボラがあるところ、(時間や通貨)を見つけるといいかもですね。
こんにちは すると、あの通貨、あの時間帯ですね (釣りをしていると、ボラがピョンピョン跳んでいますが・・笑) 良いものが完成できたら、教えます 爆
冗談はさておき、これからも、こちらのページで勉強させていただきます。いつもありがとうございます
maさん
こんにちわ!
>良いものが完成できたら、教えます 爆
とてもうれしいです^-^
期待しております!
為替ラジオをご存知ですかhttp://forexradio.net/ 漫才が含まれているので面白いですよ
専業システムトレーダーの、ナナさんの放送回がお気に入りです
maさん
こんにちわ!
為替ラジオおもしろそうですね!
ありがとうございます^-^