質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

解決済

1回答

2236閲覧

MQL4のObjectCreateで「オブジェクトが既に存在しています」というエラーになる。

mokopi

総合スコア38

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

0クリップ

投稿2021/06/26 03:02

編集2021/06/28 23:17

MQL4入門者です。
インジ作成の練習をしています。
練習として、以下のコードをチャートで実行したところエラーになりました。

●GetLastError()関数で取得したエラー内容は、「4200」で ERR_OBJECT_ALREADY_EXISTS(オブジェクトが既に存在しています)というものです。

エラーの意味を知る参考にしたページhttps://yukifx.web.fc2.com/sub/reference/02_stdconstans/error/error_runtime.html

●質問
すでにオブジェクトが表示されている(たとえば現在から20分前の足に矢印が一つ)けれども、さらにオブジェクトを表示する(たとえば、現在から10分前の足に矢印をさらにもう一つ)方法をお教えください。

※例えば20分前に(Close[2]>Close[1])が起きたらその場所に。10分前に同じく(Close[2]>Close[1])が起きたらその場所に表示してほしいだけです。まったく同じ場所に表示しようとしているのであれば「オブジェクトが既に存在しています」というエラーもわかるのですが、そうではないのにこういうエラーが起きるのはなぜだろう・・。

※追記
調べていると、インジケーターバッファ?というものが関係していそうな気がしてきました。

※追記 6/29
オブジェクトの名前が同じだから、2つ目以降が「すでにある」と認識されるのかなと思い
オブジェクト名にTimeLocal()を入れて試しました。(string型に変換)

datetime now = TimeLocal();
Print(TimeToString(now, TIME_DATE));
{ObjectCreate(ChartID(), now, OBJ_ARROW_BUY, 0, x1, y1);}

が、結果は変わりません(オブジェクトが初めの1つしか表示されない)でした。

#property copyright "" #property link "" #property version "1.00" #property strict #property indicator_chart_window // 1本前のローソク足 datetime x1 = Time[1]; // 1本前の終値 double y1 = Close[1]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping //--- 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[]) { if(Close[2]>Close[1]) // 2本前の終値<1本前の終値ならば {ObjectCreate(ChartID(), "BUY", OBJ_ARROW_BUY, 0, x1, y1);} // 1本前のローソク足に矢印を表示 return(rates_total); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

オブジェクトの名前が同じだから、2つ目以降が「すでにある」と認識されるのかなと思い

ObjectCreateで作成するオブジェクトの名称は一意である必要があるのでその考えであっています。

ただ、

// 1本前のローソク足
datetime x1 = Time[1];

// 1本前の終値
double y1 = Close[1];

これだとインジケータの開始時にx1とy1が初期化されて、その後変わらないので
毎回同じ位置に矢印を出してしまいます。

投稿2021/07/02 13:56

mah

総合スコア591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問