こんにちは~。
MQLをマスターしたくて、まずはポケモンマスターでも目指すかぁ(ゲームボーイの緑で)と思っているりょうです。
今回は前回に引き続き、完全未経験の僕がMQLを学習している様をここに記す試みです。
インジケーターとEAの違いは?
前回、無事にプログラミングデビューを果たした僕ですが、次はインジケーターを作ってみることにしました。
ちなみに、FXトレードをする上でよく目にする『インジケーター』と『EA』ですが、それぞれ意味が違うプログラムで、その違いについては下記のような感じです↓。
インジケーター・・・チャートと一緒に表示させるテクニカル指標のプログラムのこと
EA・・・エキスパートアドバイザーの略 自動売買をするプログラムのこと
EAは自動売買ツールって言われ方もするね
その他細かい違いはあるかもしれませんが、ざっくり言うとこういう違いです↑。
という事で、プログラミングデビュー第二弾は簡単なインジケーターを作ってみることにしました。
始値・高値・安値・終値を使ったインジケーター
今回作ったソースコードはこちらです↓。
//+------------------------------------------------------------------+
//| CloseLine.mq4 |
//| Copyright 2021, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
double Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
SetIndexBuffer(0, Label1Buffer);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[]) {
//---
for( int i = rates_total - 1; i >= 0; i = i - 1 ) {
Label1Buffer[i] = high[i];
}
//--- return value of prev_calculated for next call
return(rates_total - 1);
}
//+------------------------------------------------------------------+
起動した結果がこちらです↓。
高値を線でつなぐインジケーターになりました。
高値なんかローソク足見てたらわかるがな!
って感じですが、MQL習得のための練習インジケーターですので(笑)
これで初めてインジケーターを作ることに成功しました!
とにかくやったぞー!
やったにゃ~!
今回、自分で作ったソースコードの部分はこちらです↓。
まずは12行目↓。これでバッファを定義します。
double Label1Buffer[];
次に18行目↓。インデックスに用意したバッファを格納します。今回は『Label1Buffer』を0番目に紐づけさせます。
SetIndexBuffer(0, Label1Buffer);
最後に36~38行目↓。ここで実際にさせたい判定を記述しています。
for( int i = rates_total - 1; i >= 0; i = i - 1 ) {
Label1Buffer[i] = high[i];
}
ちょっと修正してみた
次に、このソースコードを修正してみました。
37行目にある
Label1Buffer[i] = high[i];
これを、以下のように修正しました↓。
Label1Buffer[i] = (open[i] + close[i]) / 2;
結果がこちらです↓。
『高値を線でつなぐ』というインジケーターから『始値と終値の中間の値を線でつなぐ』というインジケーターになりました。
ちょっとインジケーターっぽくなったぞ!
やったぞ!
判定するコードの部分に『low[i]』を使えば、もちろん安値の値を取得することも可能です。
今回のインジケーターですが、以前記事にしたforループを使用しています。
forループはプログラミングの基本なのだ!
基本にゃ!
とてもシンプルなインジケーターでしたが、初めてのプログラミングなのでこれでも丸一日はかかってしまいました(汗)
難しかったぜ・・・
成長するのだ
ムゥのごはん代を稼ぐのにゃ