iCustom 関数
この関数は、指定したカスタムインジケータ (作成 または 外部のインジケータを組み込んだもの) を計算して、その値を取得します。
iCustom関数は独自で作成したインジケータ以外にも、既存のインジケータを使うことも可能です。しかし、既存のインジケータを使うのであればテクニカルインジケータ関数での関数をそのまま使う方が簡単で早いです。
通常、単体のインジケータでは自動取引はできませんが、iCustom関数やテクニカルインジケータ関数をEAプログラムに組み込むことで、インジケータから得られる値を定期的に監視し、トレードの判断を行い自動的に取引を行うことができます。
独自でインジケータを作成する場合は、こちらを参考にしてください。
データ型と構成・戻り値
double iCustom(①, ②, ③, ④, ⑤, ⑥);
戻り値は、指定したカスタムインジケータを計算して、その値を返します。
引数 [5~64]
iCustom関数は 5個以上 64個以下の引数で構成されます。最低でも④以外の 5個の引数が必要になります。
番 号 | 引数名 | データ型 | 単位 | 初期値 | 説明 |
---|---|---|---|---|---|
① | symbol | string | - | - | 計算対象の通貨ペア名。 「NULL」は選択チャートの通貨ペア名が選択されます。 |
② | timeframe | int | - | - | 時間軸。ENUM_TIMEFRAMES 列挙値から選択。 「0」は現在チャートの時間軸が選択されます。 |
③ | name | string | - | - | 使用するカスタムインジケータ名。 カスタムインジケータは \MQL4\Indicators フォルダの中にあるものが対象です。サブフォルダの中にある場合は、\MQL4\Indicators\サブフォルダ名\\カスタムインジケータ名 のようにカスタムインジケータ名の前に「\\」とする必要があります。 |
④ | … | - | - | デフォルト値 | カスタムインジケータの入力パラメータ。 使用するインジケータでセットするパラメータの順番で、カンマ (,) で区切って値を渡します。値のセットを省略した場合は、カスタムインジケータのデフォルト値が使用されます。 |
⑤ | mode | int | - | - | ラインインデックス。0~7の値で指定できます。 SetIndexBuffer関数の呼び出しで指定されたインデックスに対応する必要があります。 |
⑥ | shift | int | - | - | iCustom関数の値を算出するバーの位置。 現在のバーから指定した時間軸のバー数だけ過去へシフトします。たとえば、現在のバーからの計算は「0」、 1つ前のバーから計算する時は「1」になります。 |
使用例
iCustom関数によるRSI指標のサンプルEA
iCustom関数を使って、作成済みのインジケータを計算に使用します。作成済みのインジケータは既存で用意されている「RSI」インジケータを使います。
日足チャートを使ってEAを実行するコードです。その時のプログラムのデフォルト設定は次のとおりです。
① RSI値が30以下で買い注文。
② 買い注文がある状態で RSI値が60以上になったら決済。
③ RSI値が70以上で売り注文。
④ 売り注文がある状態で RSI値が40以下になったら決済。
⑤ 計算期間は14日間。
「RSI」インジケータのプログラムの内容を確認したい場合は、ナビゲーター中のインディケータ → 「RSI」インジケータを選択、右クリックして「修正」で見ることができます。
コード
// iCustom関数によるRSI指標のサンプルEA
#property strict
extern double lots = 0.01; // ロット数
extern int magic = 1001; // マジックナンバー
extern int period = 14; // iCustomの計算期間
extern int buy = 30; // 買い注文指標
extern int buy_close = 60; // 買い決済指標
extern int sell = 70; // 売り注文指標
extern int sell_close = 40; // 売り決済指標
int slippagePips = 3; // スリッページを3Pipsに設定
int slippagePoint; // スリッページの単位をPipsからPointへ変換した変数
double PipsPerCunit; // 1Pipsあたり各国通貨単位に変換する係数
int i, j, ticket, type; // i,j:計数用の変数, ticket:チケットNoの変数, type:買い注文or売り注文のタイプ
bool tf; // true or false
void OnInit() {
int coe = 1; // 2,4桁表示業者の場合の係数は「1」
if(_Digits == 3 || _Digits == 5) { // 3,5桁表示業者の場合の係数は「10」
coe = 10;
}
PipsPerCunit = _Point * coe; //1Pipsあたりを各国通貨単位に変換する係数
slippagePoint = slippagePips * coe; //スリッページの単位をPipsからPointへ変換
}
void OnDeinit(const int reason) { //終了処理
ObjectsDeleteAll(); // オブジェクトテキストをEA削除時消すための処理
}
void OnTick() { //レート変動毎の処理
// 既に注文されているかチェック。無しの時、ticket=-1。
ticket = -1;
for(j=0; j < OrdersTotal(); j++) {
if(OrderSelect(j, SELECT_BY_POS) == false) {
break;
}
if(magic == OrderMagicNumber() && OrderSymbol() == _Symbol) {
ticket = OrderTicket();
type = OrderType();
break;
}
}
double RSI = iCustom(NULL, 0, "RSI", period, 0, 0);
// 現在、注文が成立していなくて、条件が合えば注文実行
if(ticket == -1) {
if(RSI <= buy) {
ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, slippagePoint, 0, 0, "買い注文", magic, 0, clrNONE); // 買い注文
} else if(RSI >= sell) {
ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, slippagePoint, 0, 0, "売り注文", magic, 0, clrNONE); // 売り注文
}
// 現在、注文が成立していて、条件が合えば決済実行
} else {
if(RSI >= buy_close && type == OP_BUY) {
tf = OrderClose(ticket, lots, Bid, slippagePoint);
}else if(RSI <= sell_close && type == OP_SELL) {
tf = OrderClose(ticket, lots, Ask, slippagePoint);
}
}
}
コードをコンパイルして実行する方法はこちらを参考にしてください。(デモ口座でお試しください)
結果
ストラテジーテスターを使って次の条件でシミュレーションした結果です。
取引内容
レポート
※ストラテジーテスターによるシミュレーション結果は、保存されているヒストリカルデータや現在のスワップによって異なってきます。