Init()およびDeInit()実行シーケンス - ページ 25

 
Alexey Viktorov:

Dimitri あなたは教養あるプログラマーだと思います。プログラミングのマナーについて教えてもらっていないのですか?

それ以外は、配列の オーバーランなどの可能性を想定して、昔のmql4と同じように書けばよい。応答がエラーになる...じゃあ、フラグを立てて...。さあ、行こう、時間がない...。そして、より厳格な言語ではどうしようもない問題にぶつかり、開発者のせいにし始める...。

キリストは復活されました。


既存のオブジェクトを作成しても、何もひどいことは起きません。オブジェクトが作成されないだけで、それだけです。
 
Nikolai Semko:

また、ターミナルやファイルのグローバル変数を使用せず、1つのウィンドウで複数の同じインジケータを適用 できるソリューションを後で追加する予定です。

ところで、インジケータの入力パラメータが 異なるセットごとに異なる値を生成する関数を書くのは面白い作業です。

最初に思いついたのは、ChartSaveTemplateを介したものでした。


グローバルに、どうやら資源をあきらめる。

 
fxsaber:

ところで、インジケータの入力パラメータが 異なるセットごとに異なる値を生成する関数を書くのは面白い作業です。

最初に思いついたのは、ChartSaveTemplateを通してでした。


グローバルなものをあきらめること、それはどうやら資源のようです。


もちろん、リソースは最適なソリューションだと思います。グローバルターミナル変数やファイルとは異なり、目に見えないし、高速ですから。また、配列の受け渡しは、ファイルの受け渡しと同じようにできますが、すべてがRAM上で行われるため、より高速です。また、グローバルのように端末にではなく、ウィンドウに属します。さらに、1つのウィンドウに同じ指標のリソースを全て作成することも可能です。

いや、ChartSaveTemplateは面倒くさすぎると思うんです。グローバルな変更、テンプレート、ファイルを使用せずに、1つのインジケータのすべてのインスタンスに共通のリソースを作成することを試みます。

 
Nikolai Semko:

私の例は、新TFのUnitと旧TFのUnitの並びが曖昧な場合の問題を示すために作成したもので、解決策ではありません。

問題を解決するのではなく、迂回させただけです。
私の例では、TFが変更され、新しいオブジェクトのUnitでそれが再び作成された場合も含め、いかなる場合でも古いTFのUnitでオブジェクトを削除することが重要なだけです。

もし配列が最初に古いTFのDeunit、次に新しいTFのUnitであれば、論理的にそうなるはずです。その後、オブジェクトは削除され、再び作成されます。

もし、シーケンスが最初に新しいTFのUnit、次に古いTFのDeunitであれば、Unitでオブジェクトを作成しようとしても、まだ削除されていないので、単に変更されるだけである。そして、旧TFのDeunitによって削除される。これがバグです。

このブランチを読んでおらず、この「機能」を知らないプログラマが遭遇する可能性があることを示すのが、この例のポイントでした。
この例は、解決策を示すものではありません。解答のバリエーションとして、こちらと こちらが 紹介されています。また、後で解決策を追加すると思いますが、ターミナルのグローバル変数やファイルを使用せず、1つのウィンドウに複数の同一のインジケータを設定しても、この解決策が機能するようにすることです。この問題を解決しようとしましたか?あるいは、特に他人のコードの誤りを見つける能力しかないのか。


今日は悪態をつくのは罪だが、そんな気がする...。

あなたの戯言は最後まで読めませんでした。

もう一度言いますが、問題のないところに問題を作らないでください。

あなたのコードにあるすべての質問の答えは、ここにありました。

アレクセイ・ヴィクトロフ

原始的な二刀流を例に出すと、何が言いたいのか?

ほぼ正しい コードの例を使った方がいい。

絶対的なものを期待していたわけではありません。

それだけだ......消えろサタン、私を罪に導かないでくれ。

 
Alexey Viktorov:

今日は悪態をつくのは罪だが、そんな気がする...。

あなたの戯言は最後まで読めませんでした。

何度も言うが、問題が存在しないところに問題を押し付けるな。

あなたのコードにあるすべての答えはここにあったのです。

絶対的なものをあてにしていたわけではないんです。

以上、サタンは去れ、私たちを罪に導かないでください。


おいおい、他の掲示板に行けよ。心理療法士がアドバイスするところ。わかりました、わかりました。幼少期の愛情不足、注目と愛情を求めている。申し訳ございません。何かあれば、お手伝いしますよ。直筆で書いても いいんですよ。冗談じゃないんです。

そして、ここでそれをしない方がいい、我々はあまりにも人々を楽しませてしまったからだ。

まさに復活

 
クールなハウツー!実行
#property indicator_chart_window
#property indicator_plots   0

void OnInit()
{
  Print(__FUNCTION__ + (string)ChartIndicatorGet(0, 0, MQLInfoString(MQL_PROGRAM_NAME)));
}

void OnDeinit( const int Reason )
{
  Print(__FUNCTION__);
}

int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double& price[])
{
  return(rates_total);
}

そしてTFを入れ替える。Deinit!は1つもありません。すべての指標は気づかれずに実行され、リソースを食いつぶしてしまう。そして、ただひたすら

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

fxsaber さん 2016.09.22 16:14

インジケーターでチャート上の自分のハンドルを知るにはどうしたらいいですか?ChartIndicatorName を通すと短い名前が返されるため、適切 ではありません。また、同じ名前のインジケータが、異なる入力パラメータで既に実行されている可能性があります。

そのハンドルを知りたい場合は、ChartIndicatorGetを使用しなければならないことがわかりますが、上記の例にあるように、本当に問題になってしまいます - インジケータがアンインストールされてしまうのです。

なんということでしょう。


こんなこともできない。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

バグ、バグ、質問

fxsaber さん 2016.09.23 10:20

自分のINDICATOR_SHORTNAMEを 知るにはどうしたらよいですか?IndicatorGet*関数が存在しない!

どのsub_windowにヒットしたかは、インジケータからはわからない。バケモノばかりです。

 
fxsaber:

どのsub_windowにあるのか、インジケータからはわかりません。バケモノばかりです。

https://www.mql5.com/ru/docs/chart_operations/chartwindowfind
Документация по MQL5: Операции с графиками / ChartWindowFind
Документация по MQL5: Операции с графиками / ChartWindowFind
  • www.mql5.com
Операции с графиками / ChartWindowFind - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:
クールなティップハック実行

そしてTFを入れ替える。ダイニットは1つもないだろう!?すべての指標は気づかれずに実行され、リソースを食いつぶしてしまう。そして、私が望んだのは、ただ

もし、そのハンドルを知りたければ、ChartIndicatorGetを使うべきですが、上の例に示すように、本当に残念なことに、そのインジケータは削除不可能になってしまいます。

回復不可能になる。

そんなことに直面したことがあります。例題があるので、ヘルプをもっとよく読むようにとのことです。

//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
   //--- количество окон на графике (всегда есть хотя бы одно главное окно) 
   int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL); 
   //--- про ходим по окнам 
   for(int w=0;w<windows;w++) 
     { 
      //--- сколько индикаторов в данном окне/подокне 
      int total=ChartIndicatorsTotal(0,w); 
      //--- переберем все индикаторы в окне 

      for(int i=0;i<total;i++) 
        { 
         //--- получим короткое имя индикатора 
         string name=ChartIndicatorName(0,w,i); 
         //--- получим хэндл индикатора 
         int handle=ChartIndicatorGet(0,w,name); 
         //--- выведем в журнал 
         PrintFormat("Window=%d,  index=%d,  Name=%s,  handle=%d",w,i,name,handle); 
         //--- обязательно освобождаем хендл индикатора, как только он становится ненужным 
         IndicatorRelease(handle); 
        } 
     } 
  }
しかし、その後、その行動は「是正」されると付け加えました。しかし、どうやらまだ調整中のようです。
 
Alexey Kozitsyn:
https://www.mql5.com/ru/docs/chart_operations/chartwindowfind

ありがとうございます。しかし、同じ制限があります。ショートネームがないとどうしようもありません(どうしてわかるのでしょうか?)

 
Alexey Kozitsyn:

というようなことに出くわしたことがあります。開発者からは、「例があるので、ヘルプをもっとよく読んでください」とアドバイスされました。

しかし、その後、その行動は「修正」されるだろうと付け加えた。しかし、どうやらまだ調整中のようです。

本当に助かりました、ありがとうございます

DeinitでIndicatorReleaseを しないことがポイントです。