インディケータ: Setka (グリッド) - ページ 2

 
Prival:
新しいバージョン3.09をCode Baseに投稿しました。

ダウンロードできます。

if(ObjectFind(0,nm)<0) ObjectCreate(0,nm,OBJ_VLINE,0,t1,2);

このような構造では、ObjectFind()は明らかに不要です。ObjectCreate() で作成する場合も同様に、名前でリストを検索し、新しいオブジェクトを作成するか、既存のオブジェクトのアンカーポイントのパラメータを変更します。

ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,false);

MQLプログラムから作成されたオブジェクトでは、このプロパティは強制的にfalseになります。

同様に、OBJPROP_WIDTHの値を変更する意味はありません。

私の測定によると、これらの編集はビルド時間を約10%短縮します。

 

ありがとう、覚えておくよ。今、ある作業をしているんだけど、不具合があるんだ。

グリッドだけで8つのチャートを開いている。

ネットから5分間切断する。これがネットに接続した後の画像。2つのチャートがクラッシュしている。

グリッドの新しいバージョン4.01を添付します。

ファイル:
setka__1.mq5  15 kb
 
Prival:

ありがとう、覚えておくよ。今、ある作業をしているんだけど、不具合があるんだ。

グリッドだけで8つのチャートを開いている。

ネットから5分間切断する。これがネットに接続した後の画像。2つのチャートがクラッシュしている。

グリッドの新しいバージョン4.01を添付します。

これは端末のアーキテクチャとインジケータのアルゴリズムの結果です。インディケータはシンボルストリームで実行されるため、その計算中にヒストリを使用した多くの操作が不可能になります:ティックの処理、他のインディケータの計算、サーバとのヒストリの同期、シンボルタイムフレームによるヒストリの 構築またはロードなど

グリッド・インディケータは長時間計算され、他のシンボル・タイムフレームのデータを使用するため、エラーが発生した場合は計算を中断することが望ましい。コードを書き換えたくないのであれば、このようにすればよい:

bool isNewBar_i(datetime date,ENUM_TIMEFRAMES timeFrame,bool& error)

  {

...

   else
     {
      Print("Timeframe ",fTimeFrameName(timeFrame)," is not ready");
      error=true;

     }

というようにします:

      //--- определимся с цветом линии
      if(_Period<PERIOD_H1) if(isNewBar_i(time[i],PERIOD_H1,error) && _Period<PERIOD_M30) line_color=new_hour;
      if(_Period<PERIOD_D1) if(isNewBar_i(time[i],PERIOD_D1,error) && _Period<PERIOD_H4 ) line_color=new_day;
      if(_Period<PERIOD_W1) if(isNewBar_i(time[i],PERIOD_W1,error) && _Period<PERIOD_D1 ) line_color=new_week;
      if(_Period<PERIOD_MN1)if(isNewBar_i(time[i],PERIOD_MN1,error)&& _Period<PERIOD_MN1) line_color=new_mon;
      //---
      if(error) return(0);

ファイル:
setka.mq5  15 kb
 
antt:

これは、端末のアーキテクチャとインジケータのアルゴリズムの結果です。インジケーターはシンボルストリームで実行されます。つまり、その計算の過程で、ティックの処理、他のインジケーターの計算、サーバーとのヒストリーの同期、シンボルのタイムフレームによるヒストリーの構築や読み込みなど、ヒストリーを使った多くの操作が不可能になります。

このストリームの概念が理解できず、データ・アクセスに関するヘルプを50回読みました。で、実行に1分くらいかかる(長い)のですが、なんとなくわかってきたような気がします。インジケータが計算されている間、つまり関数が実行され始めている間、私は正しく理解していましたか?

int OnCalculate () {
コンピュータ(端末)の全リソース がこのタスクに与えられ、それが実行されるまで(完了するまで)

return(rates_total); }.

以下のことはしてはならない:

- このシンボルが見つからない場合、そのシンボルから履歴を読み込もうとする。

- 別のタイムフレームを要求する。

- 別のシンボルをリクエストする。

最初の呼び出しですべての行を設定し、if(prev_calculated==0)までは忘れてください。

正しいですか

S.Y.

  1. トレーダー- 熊手を踏む人。
  2. ダミー- レーキを踏んだことがないので、レーキはないと確信している初心者トレーダー。
  3. カモ- 定期的に熊手を踏むが、熊手は存在しないと確信しているトレーダー。
  4. ナロー・スペシャリスト - 同じレーキを踏む技術に精通しているトレーダー。
  5. ワイド つ以上のレーキを並行して踏むトレーダー。
  6. メカシステムのスペシャリスト- レーキヒットを自動化できるトレーダー。

レナトの評価では、私はレベル5です :-))https://www.mql5.com/ru/forum/1165/page3 さらに一歩進んだ )))

 

コードを完全に書き直しました。 他の時間枠は要求していません。

もしよろしければUnlimitウィンドウでmac.バーを設定し、M15、M5、M1を通過してください。 M1で何か問題があります - サービスに書きました。私だけの問題なのか、それとも皆の問題なのかを知りたいだけなのです。

これが私のログです。

2010.06.17 11:39:55 Grid (EURUSD,M1) Failure or first run Time= 1.2 sec for 1293476 barsObjectsTotal= 48010_time= 2002.10.25 06:41:00
2010.06.17 11:39:52 Grid (EURUSD,M5) Failure or first run Time= 0.0 sec for 847192 bars ObjectsTotal= 423 _time= 2010.06.02 21:35:00
2010.06.17 11:39:48 Grid (EURUSD,M15) Failure or first run Time= 0.0 sec for 285186 bars ObjectsTotal= 962 _time= 2010.05.04 22:00:00

グリッドバージョン4.11

 
Prival:

私はこのスレッドの概念を理解することができず、データ・アクセスに関するヘルプを50回読んだ((スクリプトは例としてそこに与えられている。実行には1分ほどかかりますが(長い)、なんとなくわかってきたような気がします。インジケータの計算が進行している間、つまり関数が実行され始めている間、私は正しく理解しているのでしょうか?

http://ru.wikipedia.org/wiki/Thread


int OnCalculate () {
全てのコンピュータ(端末)リソースがこの タスクに 与えられ、それが実行(終了)されるまで。

return(rates_total); } .

すべてのリソースではない。しかし、このシンボルに関連する計算のほとんどは、OnCalculate()が完了するまで待機する。


以下のようなことはしてはならない:

- 履歴がない場合は、このシンボルの履歴を読み込もうとする。

はい。現在のシンボルに対する十分な履歴がない場合、OnCalculate() の実行は間違いなく改善されません。


- 別のタイムフレームを要求する

要求することはできますが、データが不足しているか不十分な場合、OnCalculate() で待機する意味はありません。現在のシンボルに対する他のインディケータのデータについても同様です。

- 他のシンボルをリクエストする

別のシンボル(ヒストリ、インディケータ)のデータの処理は別のスレッドで行われるため、理論的には、必要なデータがすべて表示されるまでループ内で待つこともできます。しかし、そうしない方がよいでしょう。OnCalculate()の待機ループは、現在のシンボルのデータ処理を止めてしまいます。

プログラムをやり直すには、最初の呼び出しですべての行を設定し、if(prev_calculated==0)でそれを忘れる必要があることは理解できたと思います。

カスタム・インディケータを作成する際の一般的な推奨事項:何らかのエラーが検出された場合、またはデータの不足が検出された場合は、直ちにreturn(0)を使用してOnCalculate()の実行を停止します。次のティックでは、if(prev_calculated==0) で新たに計算を試みます。
 
Prival:

面倒でなければ。アンリミットウィンドウでマックのバーを設定し、M15、M5、M1を通過する。 ログに残る結果をここに投稿する。 M1で何か問題がある - サービスに書き込んだ。私はちょうどそれが私またはみんなであるかどうかを確認したい。

2010.06.17 11:58:59 6op0k (EURUSD,M1) Failure or first run Time=0.1sec for 4009008 barsObjectsTotal=403_time=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) 失敗または初回実行 Time=0.0sec for 847196 bars ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) 失敗または初回実行 Time=0.0sec for 285187 bars ObjectsTotal=1108_time=2010.05.04 22:15:00
 
antt:
2010.06.17 11:58:59 6op0k (EURUSD,M1) 失敗または初回実行 4009008本 時間=0.1秒 ObjectsTotal=403時間=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) 失敗または初回実行 Time=0.0sec for 847196 bars ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) 失敗または初回実行 Time=0.0sec for 285187 bars ObjectsTotal=1108_time=2010.05.04 22:15:00

ありがとうございます。つまり、最終的にすべてを正しく書いて、「インジケータ」は本当に意図したように動作します。 時間=2010.06.15 07:45:00 開発者がサービスデックスで沈黙しているのは残念だ。

問題が再現されました。

 
Prival:

ありがとうございます。つまり、最終的にすべてを正しく記述し、「インジケーター」が本当に意図したとおりに機能したということです。私が経験した失敗は、ターミナルの問題です(うまくいっていますね。 時間=2010.06.15 07:45:00 開発者がサービスデックスで沈黙しているのは残念だ。

問題が再現された...と思う...ありがとう。

と訂正することができる:

H1のgravfikで縦 または横線を 表示した後、別の時間間隔に切り替えると、インジケーターに関係ない線が削除されます。

これは、視覚的に価格のステップを決定するために履歴を確認するための非常に便利なインジケータですが、古い時間間隔に置かれたマーク(垂直および水平線)がより小さい時間間隔に切り替えるときに消えるという事実のために、それは不快になります。

 

このインジケーターは、ターミナル・ウィンドウの価格スケールの表示に関する問題を完璧に解決しました。

3021までのビルドでコンパイルすると、エラーは表示されず、すべて問題なく描画されます(以前にコンパイルしたバージョンをターミナルの新しいビルドに投入しても同様です)。

それ以降のビルドでのコンパイルではエラーは表示されませんが、ターミナルでは加算器が垂直方向のマークアップを描画せず、ログには次のように書かれています。

行をコメントアウトした:

StringConcatenate(line_name,IntegerToString(str.hour,2,'0'),":",IntegerToString(str.min,2,'0'),"_N",line_counter);

ターミナル・ログのエラーは消えます(線は引かれませんが)。

どっちを掘る?偉大な道具を生き返らせるには?