まずインジケーターの作り方を学んでみよう。
ぶっちゃけ難易度は結構高いと思う。
簡単に書こうとしてもどうあがいても配列もループ分も必要なので、ちょっと気合い入れないとダメ。
一応書式ばらして高級言語として要約するけどね。

最初に記述するのがproperty。
色んな種類があるので検索して調べてみよう。

1,property indicator_separate_window
2,property indicator_buffers 1

この辺りは必ず必要になると思う。
1はwindowの種類。RSIみたいに下に小窓作る場合はseparate_window、もう一つは移動平均線みたいにチャートに描画する場合。
2は描画するインジケーターの変数が入るところ。

一般的には変数っていうのがわからない。
ってところから始まる。
スクールを最後まで受講してもこれが分からないって人もマジでいるし、これは覚えておこう。

今から教える方法は理系やエンジニアに殺されかねないが、簡単に概念を覚える方法。

まず学校でやったx=yみたいな話を思い出そう。
3 + 4 = x

この時xは7になる。
変数はあなたが好きに記号をつけられるので、Pointという変数をつくる。
Point = 5。なら Pointは5である。
前述したxを使ってみよう、Point = Point + xならどうだ?
これは理系が爆笑する表現だが、左が現在、右が過去として見ればすべてこれで決着が付くのが変数だ。

x = 7、 Point = 5なので、x + Point = 12である。
因みにこれは数字だった場合だ。

文字としてx + Point だったらどうだろう。
7に5を合体したら、「75」だよね。

変数ってそういう感じである。
これを表現するのに「箱」とよく言われるが、漠然としててよくわからん。
理系やエンジニアに怒られても
x=y とか △+3=5の時、△はいくつ?
みたいな義務教育の勉強に照らし合わせた方が手っ取り早いと思うんだよね。
足し算引き算より掛け算割り算が優先される、とか当たり前の四則演算の法則も当てはまるし。

Fxck = 12、Fxckはいくつ?
小学生でもわかるでしょ?そういう事なんだよ。数学的には定数なのに動的だからそういう意味では見当はずれもいいところだけどね。

元に戻すとproperty indicator_buffersってので、インジケーターの数値を格納して、それ描画するって事。
現在は5、1時間前が8、2時間前が7。
こんな感じの数値を線とかでなぞったらグラフになるでしょ?

変数は基本的には(否定する指向もあるが)、先に宣言するものなのでここではそのindicator_buffersに入れる変数をセットしておきたい。
double rsiInd[]としよう。

この[]って何?ってなるかもしれないが、ここでは省略する。これがまた面倒くせえんだ。

次にメソッドについて。

void start(){;

}

こんな感じの。
startって書いてある奴はmt4ではこの{}に書かれた処理をやります!って事だ。
正確に言うとレートが更新された瞬間にこの処理を行う。
他にもtickごとに反応するOntickとか色々あるけど、とりあえずこれ。必要に応じて他の覚える。
この関数ってのは、処理されるタイミングがいつか?って言うだけの話で、例えば立ち上げた瞬間に動くプログラム、閉じる瞬間に動くプログラム等を記述したい時はstart外に新しくその島を作る感じ。

ということで、startメソッドの上でも下でもいいから、これも用意しておこう。
int init(){
SetIndexBuffer(0,rsiInd);
SetIndexStyle(0,DRAW_LINE,STYLE_DOT,1,Blue);
}
initは起動した瞬間に処理するメソッド。中身は、
描画するindicator_buffers0番の数値はrsiIndです。という宣言
buffers0番は青色の線を1の太さで描画します。という宣言。

ではインジケーターを作ろう。

int limit= Bars – IndicatorCounted();
こんな感じの変数を作る。
limitって部分は変数名なので好きにつけていい、がBars – IndicatorCounted();ってなんやねん。ってなるだろう。
どんな言語にも環境変数ってのがあって元々用意されてる変数がある。
例えば今日の日付とかね。
MT4なら株為替ならClose[0]ってのがあり、これは現在の終値の環境変数なの。予め用意してくれてんのよ。
USD/JPYが113.4円の時に「 A =Close[0] 」って命令したらA = 113.4になる訳。
思い当たる変数は大体用意してあるから自分で調べると良い。(例えば、自分のパソコンのユーザー名を反映させたい!とか)

上記の奴は「 limit = 表示されたロウソク足の本数 」ってやっている感じ。

全体像を載せるとこんな感じになる。

void start(){;
int limit= Bars – IndicatorCounted();
for(int i = 0; i < limit; i++){
rsiInd[i] = iRSI(NULL,PERIOD_H1,14,PRICE_CLOSE,i)
}
}

何が何だかって感じになると思うが、俺も(入門者としての)中級者向けだと思っている。我慢して聞いてくれ。
forというのは。

for(変数設定; 括弧内の処理をループする条件; 一回ループした後の処理){
ループする処理
}

こういう書式である。
言語ごとに書き方は違うが、基本的には順番とか全部同じである。
JAVAならfor(int i = 0, i > 4, i++){}
VBならfor int i = 0 To 4 step +1
とか。

もっと人間らしい言語にすると
for(iは0、iが4を超えるまで繰り返す、繰り返す度にiに+1){
繰り返す処理
}

となるから、ひも解くと。
for(iは0、0からlimit回なので、表示されたロウソク足の本数分繰り返す)
みたいな処理になる。

rsiInd[i] = iRSI(NULL,PERIOD_H1,14,PRICE_CLOSE,i)

これはiRSI(NULL,PERIOD_H1,14,PRICE_CLOSE,i)がキモ。
テクニカルインジケーター関数といって、環境変数みたいなもんである。(正確にはクラスなのかな)
RSIを算出する関数が用意されているので、条件を設定して、そこから算出したRSIの数値を呼び出してくれる。

最後にiと書かれているが、ここはロウソク足の本数である。
0は今現在の足、1は一本前。

同様にIndicater bufferに設定しているrsiInd[i]のi部分もロウソク足の本数である。
前述したClose[0]とかもMT4の用意された環境配列変数はロウソク足の数に対応している。

for(int i = 0; i < limit; i++){
rsiInd[i] = iRSI(NULL,PERIOD_H1,14,PRICE_CLOSE,i)
}

ってことは、どういう処理行われているかひも解くと。

※1回目
rsiInd[0] = iRSI(NULL,PERIOD_H1,14,PRICE_CLOSE,0)
つまり現在描画しているインジの数値 = 現在のRSI数値。

※2回目
rsiInd[1] = iRSI(NULL,PERIOD_H1,14,PRICE_CLOSE,1)
つまり一本前で描画しているインジの数値 = 一本前のRSI数値。

※3回目
rsiInd[2] = iRSI(NULL,PERIOD_H1,14,PRICE_CLOSE,2)

これをlimit分の回数、つまり表示されるロウソク足の本数分処理するって事。

rsiInd[]は描画反映するbufferに設定してあるので、rsiIndに数値が入ればインジケーターに描画される。
いってしまえば。
rsiInd[0] = 30;
rsiInd[1] = 40;
rsiInd[2] = 50;
と手打ちして起動すれば直近三回分50から10ずつ下がったグラフが固定で表示されるわけだ。

これを当時のロウソク足で計算した数値を代入するからこんな書き方になる訳。

property indicator_separate_window
property indicator_buffers 1

//最初に宣言しておく変数
double rsiInd[];

//起動時に処理される命令
int init(){
SetIndexBuffer(0,rsiInd);
SetIndexStyle(0,DRAW_LINE,STYLE_DOT,1,Blue);
}

//チャートが動く度に処理される命令
void start(){;
int limit= Bars – IndicatorCounted();
for(int i = 0; i < limit; i++){
rsiInd[i] = iRSI(NULL,PERIOD_H1,14,PRICE_CLOSE,i);
}
}

全体像はこんな感じ。
rsiInd[i] =
以降の部分に計算がはいるから、これに自分が考えた計算式入れれば自作インジケーターが作れる。
例えば
rsiInd[i] = (Close[i] + Close[i + 1]) / 2;
ならロウソク足二本分の平均価格が表示される

以上、疲れたし、こんなんじゃ多分難しい。失敗。