Nikolai Semko: MT5で、異なるウィンドウにインストールされた2つのEAが、1つのウィンドウのリソースだけで動作することをテストするのは興味深いことです。なぜなら、各EAは独自のスレッドを持っており、ご存知のように、1つのウィンドウに複数のExpert Advisorを置くことはできないからです。
#define protectedpublic#include <Canvas\Canvas.mqh>
#undef protected#property script_show_inputsinputuint N=8; // количество центов гравитацииvoidOnStart()
{
ChartSetInteger(0,CHART_FOREGROUND,true);
CCanvas C;
int Width=(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS); // get Window widthint Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // get Window height if(!C.CreateBitmapLabel(0,0,"CanvasExamlple",0,0,Width,Height,COLOR_FORMAT_XRGB_NOALPHA)) // create canvas with the size of the current windowPrint("Error creating canvas: ",GetLastError());
uint i=0,j=100000;
int size=Width*Height;
uchar h[25600];
ArrayInitialize(h,0);
uint w;
for(w=0;w<25600;w++) h[w]=uchar(128+128*sin(double(w)/256)); //create an array to speed up the workdouble SQRT[];
uint ss=Width*Width+Height*Height;
Print(ss);
ArrayResize(SQRT,ss);
for(w=0;w<ss;w++) SQRT[(int)w]=sqrt(w); //create an array to speed up the work int k[]; ArrayResize(k,N*2);
for(w=0;w<N*2;w++) k[w]=20+rand()%200;
double XP[],YP[],D[],D1[];
ArrayResize(XP,N);
ArrayResize(YP,N);
ArrayResize(D,N);
ArrayInitialize(XP,0);
ArrayInitialize(YP,0);
ulong t=0,sum=0, f=0;
C.FontSet("Verdana",50,FW_MEDIUM);
while(!IsStopped())
{
int pos=int(i%size);
if(pos==0)
{
//Sleep(20); //For those who have a too powerful computer.if (i>0) {t=GetMicrosecondCount()-t; sum+=t; f++;
C.TextOut(Width/2,Height/2,"Время формирования кадра = "+IntegerToString(sum/f)+" мкс",clrBlueViolet,TA_CENTER|TA_VCENTER);}
C.Update();
t=GetMicrosecondCount();
for(w=0;w<N;w++)
{
XP[w]= Width/2-(sin((double)j/k[2*w])*(double)Width/2);
YP[w]= Height/2-(cos((double)j/k[2*w+1])*(double)Height/2);
}
j++;
}
int X=pos%Width;
int Y=int(pos/Width);
// for(int w=0;w<N;w++) D1[w]=SQRT[int((XP[w]-X)*(XP[w]-X)+(YP[w]-Y)*(YP[w]-Y))];for(w=0;w<N;w++) D[w]= sqrt((XP[w]-X)*(XP[w]-X)+(YP[w]-Y)*(YP[w]-Y));
double S1=0,S2;
for(w=0;w<N/2;w++) S1+=D[w];
S2=S1;
for(w=N/2;w<N;w++) S2+=D[w];
double d=S1/S2;
//double d= (D[0]+D[1]+D[2]+D[3])/(D[0]+D[1]+D[2]+D[3]+D[4]+D[5]+D[6]+D[7]);//d= (D[0]+D[1])/(D[0]+D[1]+D[2]+D[3]);
C.m_pixels[pos]=XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]);// works a little faster, but requires transferring the array m_pixels from protected to public in Canvas.mqh//C.PixelSet(X,Y,XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]));
i++;
}
C.Destroy();
}
//+------------------------------------------------------------------+
MT4であれば、そうです。
負荷を軽減するためにはOpenCLを使うしかないようです。しかし、MT4にはそれがない。それとも我慢するか。
また、アニメーションの 再描画の速度をユーザーが調整できるようにするのも一案です。この場合、必要なときにプロセッサの負荷を減らし、必要なときに負荷を戻すことができるようになります。
OpenCLを使って負荷を軽減する必要がありそうですね。しかし、MT4にはそれがない。あるいは我慢する。
また、アニメーションの再描画の速度をユーザーが調整できるようにする方法もあります。この場合、必要なときにプロセッサの負荷を減らし、必要なときに負荷を戻すことができるようになる。
MT5で、異なるウィンドウにインストールされた2つのEAが、1つのウィンドウのリソースだけで動作することをテストするのは興味深いことです。なぜなら、各EAは独自のスレッドを持っており、ご存知のように、1つのウィンドウに複数のExpert Advisorを置くことはできないからです。
MT4では、EAごとにスレッドも用意されています。私の記憶違いでなければ...
糸は違えど、プロセッサーはどれも同じ...。
それが、チャートを作る理由だと思います。
もうひとつ、ニュアンスがあります。
アニメーションが 周期的(gifなど)であれば、ピクセル配列を常に再初期化する必要はない。アニメーションの描画を1サイクルとして、各フレームをリソースに格納することができます。次に、画像をトグルするだけです。一部、これを実装し、そのおかげで複数のアニメーション速度を実現しました(当初は、毎回、元画像を描き直して、その上に新しい画像を描いていたので、アニメーション速度はひどいものでした)。
MT4では、EAごとにスレッドも用意されています。私の記憶違いでなければ...
糸は違えど、プロセッサーはどれも同じ...。
そのために、グラフィカルな地図を作成したのだと思います。
MT4とMT5の違いを理解するために、このコードを両方のプラットフォームで実行すると(コードはそこそこ動きます)、MT4ではずっと遅く実行されることがわかります。
ただ、MT4とMT5の違いを理解するために、このコードを両方のプラットフォームで実行すると(コードはそこそこ動きます)、MT4では一桁遅くなることが分かります。
はい、あそことあそこに置いてください。その差は10分の1程度。その通り、MT5では配列の初期化が10倍以上高速化されているからです。確認しました。
しかし、MT4でもすべてがはるかに高速化されているはずです。結局、画像を再描画しているだけなんですね。配列で繰り返し処理する場合は別です。
MT4でなぜこんなに遅いのかわからない。
しかし、おそらくポイントは、グラフの大きさに合わせたカンヴァス空間全体で、すべてのピクセルを再初期化していることです。
私のアニメーションでは、個々の領域だけを描き、画像の主要な部分はすべてリソースから取っています。メインとなる部分がなく、イメージはすべて作られているんですね。そのため、速度が低下します。
それは、図面の大きさです。
しかし、おそらくポイントは、グラフの大きさに合わせたカンヴァス空間全体で、すべてのピクセルを再初期化していることです。
私のアニメーションでは、個々の領域だけを描き、画像の主要な部分はすべてリソースから取っています。メインとなる部分がなく、イメージはすべて作られているんですね。そのため、速度が低下します。
それは、図面の大きさです。
なんという違いでしょう。これは意図的に極端にした例で、kanvas の速度における mt5 の利点を明確に示しています。そして、この号はあなたの発案でアーカイブ化されたものです。だから、私はずっと前から「MQL5に行け」と言っているんです。
MT4の欠点、それは開発で必要なことです。逃げなくてもいいんです。そして、その解決策を考え、改善することを余儀なくされるのです。
MT5では、あなたも頑張る必要はありません。今のままでも十分高速に動きます。そのため、MT5への移行は最終段階を予定しています。
最後に、ダイナミックテーブルの出来上がりです。簡単ではなかったというのが正直なところです。いろいろなニュアンスがあることがわかりました。
また、このテーブルは "条件付き "で動的である。つまり、最大行数があらかじめ決められているのです。まだ "絶対 "にダイナミックにすることはできないのです。
このテーブルには20行の可能性があります。そのため、20のオープンポジションを表示することができます。もっと作ってもいいのですが、とりあえずのデモということで。
クリックすると表示されます。
以下、接続ファイル(インクルージョンに入れる)、エンジン(indicatorsフォルダに入れる)、test.EA(expertsフォルダに入れる)です。
Peterさん、申し訳ありませんが、あなたが送ったものは稀に見るハッキングであるため、あなたの作品は受け入れられません。申し訳ないのですが、あなたが送ったものを調べたのは私だけで、私以外には誰も調べないようです。
そこで、順を追って説明すると、課題は次のようになった。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
私のアプローチコア - エンジン。
ヴァシリー・ソコロフ さん 2018.12.26 13:29
ピーター、これが課題だ。MT4で現在の注文受付を表示するパネルを作る。システムパネルの完全なコピーを作成する必要はありません、オープンオーダーの基本的なプロパティを持つ最も単純なテーブルを表示します:開始価格、方向、利益。あとは、あなた次第です。注文が締め切られると、テーブルの表示も消えます。また、その逆も然りで、新しいオーダーが開かれるとこのテーブルに表示されることになります。
その代わりに見えるもの。
まず、取引はパネル上で売買ボタンをクリックすることによってのみ行うことができます。標準のウィンドウからポジションを建てた場合、取引は表示されません。
次に、一部の注文が空の値で表示されることです。テーブルには存在するが、行は空である。
第三に、(これは本当に不気味なのですが)標準のダイアログから注文を閉じても、テーブルの中で消えることはありません。しかし、一番悲しいのは、パネルを再読み込みすると、クローズした注文が再びオープンしたはずの状態で表示されてしまうことです。これは何でしょう?なぜ無関係な情報をどこかに保存しておいて、それを読み込もうとするんだ!?
4つ目は、20オーダーとは一体何なのか?この制限については、私の課題には一言も書かれていませんこれは、ダイナミックで未知の環境下でのエンジンの動作をテストするために、あえて行われたものです。この仕事はランダムに選ばれたのではなく、私の要求を変更し、あなたのエンジンの「鋭い角」をすべて隠すようにしたのです。しかし、このような角度を示すために与えられた課題である。
5つ目は、ストップロスやテイクプロフィットを設定した場合は必要ないことです。これらの項目は空欄のままにしてください。
そうそう、パネルにあるポジション(十字)を閉じるボタンも機能しませんね。
要するに、ピーター。申し訳ありませんが、あなたが送ってきたものは完全にハックジョブです。仕様通りに直してください。
もう一度、課題を明確にしますので、質問はありません。
- 表は動的で、取引タブと同じ注文が表示されます。タブに注文がない場合、テーブルにも注文は表示されません。
- 表に表示される注文の数は、何でもよい。上からの制限はありません。
- 標準のダイアログウィンドウで注文を開くと、テーブルに注文が表示されるようになります。標準的な方法で注文を閉じると、あなたのテーブルの注文は消えるはずです。
- 一貫性のない 状態は許されない!テーブルがあるものを示し、トレードタブが別のものを示す場合、これはエラーとなります。
今のところ、太っ腹のノーマーク です。あなたのリファインを待っています。そして、理解できるまで3Dレンダリングはしないこと!