エラー、バグ、質問 - ページ 2099

 
Vladimir Pastushak:
Guys, I'm sick and tired from www.mql5.com in android in mt5 my username and password entered in the mt5.
なぜユーザー名とパスワードを紛失し続けるのか?

私も定期的に聞かれるのですが、ユーザー名・パスワードを入力せず、Backボタンを押すだけでログイン状態になるんです。

 
Nikolai Semko:

ChartXYToTimePrice()のような非常に便利な関数は、なぜこんなに実行時間がかかるのでしょうか?

XYToTimePrice()に類似した関数を書いたら、もっと速く実行できるようになった。最大で数百倍の高速化を実現。

しかし、元の関数には SubWindow_out を持つChartID_in も存在します。フルアナログにする。

 
fxsaber:

つまり、元々SubWindow_outを持つChartID_inもあるわけです。フルアナログにする。


ChartID_inと SubWindow_outを追加する ことは、全く難しいことではありません。しかし、私は完全なアナログを作ることを目指しているわけではなく、ChartXYToTimePrice()の遅さを示すために、この関数を作っただけです。

void XYToTimePrice(long chart_id,int x,int y,int& sub_window,datetime &time,double &price,int id)
  {
   static int left_bar; // номер самого левого бара на экране
   static int WidBar;
   static int Wid;
   static int Hei;
   static double y_min;
   static double y_max;
   static int PerSec=PeriodSeconds();
   static bool ChartChange=true;
   if(id==CHARTEVENT_CHART_CHANGE) { ChartChange=true; return; } 
   if(ChartChange) // если было изменение чатра после последнего вычисления
     {
      left_bar=(int)ChartGetInteger(chart_id,CHART_FIRST_VISIBLE_BAR, sub_window);        // номер самого левого бара на экране
      Wid=(int)ChartGetInteger(chart_id,CHART_WIDTH_IN_PIXELS, sub_window);               // ширина экрана в пикселях
      WidBar=(int)ChartGetInteger(chart_id,CHART_WIDTH_IN_BARS, sub_window);              // ширина экрана в барах
      Hei=(int)ChartGetInteger(chart_id,CHART_HEIGHT_IN_PIXELS, sub_window);              // высота экрана в пикселях
      y_min=ChartGetDouble(chart_id,CHART_PRICE_MIN, sub_window);                         // макс. цена на экране
      y_max=ChartGetDouble(chart_id,CHART_PRICE_MAX, sub_window);                         // мин. цена на экране
     }
   if(x>Wid || x<0 || y<0 || y>Hei) return;  // выходим если точка (x,y) за пределами экрана
   price=y_min+(Hei-y)*(y_max-y_min)/Hei;
   int NrBar=left_bar-(int)((double)x/((double)Wid/(double)WidBar)); 
   datetime T[1];
   if(NrBar>=0) CopyTime(NULL,0,NrBar,1,T);
   else { CopyTime(NULL,0,0,1,T); T[0]+=fabs(NrBar)*PerSec;}
   ChartChange=false;
   time=T[0];
  }

しかし、確かに、私の関数には追加のパラメータであるイベントIDが必要です。そして今のところ、この機能はオリジナルの1ピクセルのろうそくの太さとほぼ同等に動作しますが、必要に応じて改良することができます。

 
Nikolai Semko:

ChartID_inとSubWindow_outを追加することは、全く難しいことではありません。しかし、私は完全なアナログを作ることを目指しているわけではなく、ChartXYToTimePrice()の遅さを示すために、この関数を作っただけなのです。

しかし、確かに、私の関数には追加のパラメータであるイベントIDが必要です。また、この機能はオリジナルの1ピクセルのロウソクの太さとほぼ同じですが、必要に応じて改善することができます。


そして、ChartXYToTimePriceの不思議な機能にも気がつきました。実行時間はチャート上のバーの 数に正比例します。

これは、その計算アルゴリズムが「変」であることを示している。つまり、このような問題の最適解としては、かなり奇妙な循環和である。

XYToTimePrice関数の実行速度は、バーの本数に関係なく同じです。

また、ChartGetInteger関数やChartGetDouble関数の速度も、正直言って明らかに過大評価されており、非常に不思議な機能を持っています。例えば、関数

ChartGetDouble(0,CHART_PRICE_MAX);

は20-100倍高速になります。

ChartGetDouble(0,CHART_PRICE_MIN);          

MAXがMINの後にある場合。

が、入れ替えれば逆転する。


つまり、同じ関数が繰り返し計算され、前の関数呼び出しですでに計算され保存されたデータを使用するのは論理的だと思われます。しかし、チャート価格の最大値(または最小値)の単純な二重値を計算するために、おかしな計算や多くの中間データ、そしておそらくは配列の作成が行われています。

ただし、この効果はプロファイリングの特殊性によるもので、フェイクである可能性も否定できません。しかし、これらの機能の遅さは偽物ではありません。

 
Nikolai Semko:

必要であれば、改良することもできます。

2つの関数の結果が一致したときに、速度特性を比較するのが正しいというのは、今でも有効でしょう。ご記入ください。

 
Vladimir Pastushak:
みんな、mt5でandroidのwww.mql5.com からユーザー名とパスワードを入力するのに疲れたんだ。
なぜユーザー名とパスワードを紛失し続けるのか?

servicedeskに書き込む。ログを添付してください。すみません、ありがとうございました。

 

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

バグ、バグ、質問

fxsaber さん 2017.10.04 09:13

これについては何度も書かれている。なぜか修正されない。

すでに修正されたようですね。build 1730ではもうこの問題はありません。
 
Nikolai Semko:

また、ChartXYToTimePriceの奇妙な特徴に気づきました。実行時間はチャート上のバーの 数に正比例します。

これは、その計算アルゴリズムの "おかしさ "を示している。つまり、このような問題の最適解としては、かなり奇妙な循環和である。

XYToTimePrice関数の実行速度は、バーの本数に関係なく同じです。

また、ChartGetInteger関数やChartGetDouble関数の速度も、正直言って明らかに過大評価されており、非常に不思議な機能を持っています。例えば、関数

は20-100倍高速になります。

MAXがMINの後にある場合。

が、入れ替えれば逆転する。


つまり、同じ関数が繰り返し計算され、前の関数呼び出しですでに計算され保存されたデータを使用するのは論理的だと思われます。しかし、チャート価格の最大値(または最小値)の単純な二重値を計算するために、おかしな計算や多くの中間データ、そしておそらくは配列の作成が行われています。

ただし、この効果はプロファイリングの特殊性によるもので、フェイクである可能性も否定できません。しかし、これらの機能の遅さは偽物ではありません。

チャートデータリクエスト機能の遅さは、情報の送受信の仕方にあり、実装そのものに問題があるわけではありません。これらの関数の実装自体は原始的なものであり、チャートのバーの本数には依存しない。

しかし、チャートはオブジェクトであり、その情報は多くのソースに分散しているため、全体の制御はメッセージ・キューに基づいて行われます。前のリクエストが処理されるまで、次のリクエストは待機する。

しかし、同じグラフに対するリクエストが連続している場合、これらの後続のリクエストは非常に高速に実行されます。これは、最初の依頼から誰も間に割り込んでくる暇がなかったからである。

 
Slava:

チャートデータリクエスト機能のボトルネックは、情報の送受信方法にあり、実装そのものにあるわけではありません。これらの関数の実装自体は原始的なものであり、チャートのバーの本数には依存しない。

しかし、チャートはオブジェクトであり、その情報は多くのソースに分散しているため、全体の制御はメッセージ・キューに基づいて行われます。前のリクエストが処理されるまで、次のリクエストが待機しています。

しかし、同じグラフに対するリクエストが連続している場合、これらの後続のリクエストは非常に高速に実行されます。これは、誰も最初のクエリとの間に割り込む時間がなかったからである。


そうであってほしい。しかし、それを実感したからといって、楽になるわけではありません。スラバ、単純なプログラマーを誤解しないでください。以前のメッセージにある私のテスト・インジケータの例では、ChartXYToTimePrice() リクエストの平均実行時間が5000~10000マイクロ秒(1ピクセルのローソクの太さとFullHD画面の標準MTウィンドウの場合) であることがはっきりと示されています。そんな時に何ができるのか。

まあ、例えばこの間に500個の陰影のある円のイメージを同じ画面内に形成して表示させることができます。

行列ができていても、でも、なぜこんなに行列ができるのか?
一方には500個の円をピクセル単位で生成して画面に出力し、もう一方には2桁の数字を入力する簡単なクエリを表示しています。しかも、重さは同じです。
単純なプログラマーは、そこに座って頭をかきむしり、パズルを組み立てることができないのです。

 
Nikolai Semko:

そうであってほしい。でも、それを理解したからといって、楽になるわけではありません。スラバ、単純なプログラマーを誤解しないでください。以前のメッセージにある私のテストインジケータの例では、ChartXYToTimePrice() リクエストの平均実行時間が5000~10000マイクロ秒(キャンドル幅1ピクセル、フルHD画面のMT標準ウィンドウの場合) であることが明確に示されています。そんな時に何ができるのか。

まあ、例えばこの間、同じ画面内に500個の陰影のある円のイメージを形成して表示することが可能です。

行列ができていても、でも、なぜこんなに行列ができるのか?
一方は500個の円をピクセル単位で形成して画面に表示するもので、もう一方は単純な2桁のクエリである。しかも、重さは同じです。
単純なプログラマーは、座って頭をかきむしり、パズルを組み立てることができない。

同期コマンドと非同期コマンドの違いを感じ取っていただけたでしょうか。