datetime New_Time[];//буффер для проверки нового бараvoidOnStart()
{
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
staticdatetime t;//записываем старое время ArraySetAsSeries(New_Time,true);//направление индексацииCopyTime(_Symbol,_Period,0,1,New_Time);//копируем время нового бара
t=New_Time[0];
}
uint time=GetTickCount()-start;
Print("New_Time = ",time," ms");
}
voidOnStart()
{
int t;
int s;
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
MqlDateTime m;
TimeCurrent(m);
t=m.min;
s=m.sec;
}
uint time=GetTickCount()-start;
Print("time = ",time," ms");
}
Expert Advisorで最適化するために以下のコードを行いました。
staticdouble ind1;//записываю значенияstaticdouble ind2;// значенияstaticdouble indsmall;//индикаторовMqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
if (MIN==0 && SEC==0)//проверка только в начале часа
{
Здесь копирую значения индикатора из буфферов
}
新しいバーを確認しない1回の実行で、各ティックで指標値を受信した場合の結果:817,196ms
新しいバーをチェックする場合:735 904 ms
その差は特になく、多少の改善は見られるものの、十分とは言えません。
以下のようなインジケータが表示されるのですが。
int TSIHandle; // хэндл индикатора TSIdouble TSI[]; // динамические массивы для хранения численных значений TSIintOnInit()
{
TSIHandle=iCustom(NULL,0,"Blau_TSI",q,r,s,u,PRICE_CLOSE);
if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}
ArraySetAsSeries(TSI,true);
return(0);
}
voidOnDeinit(constint reason)
{
//--- освобождаем хэндлы индикаторовIndicatorRelease(TSIHandle);
ArrayFree(TSI);
}
voidOnTick()
{
MqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
staticdouble tsismall;
if (MIN==0 && SEC==0)
{
//--- копируем значения индикаторов из индикаторных буферовif(CopyBuffer(TSIHandle,0,0,3,TSI)<0)
{
Alert("Ошибка копирования буферов индикатора Moving Average - номер ошибки:",GetLastError(),"!!");
return;
}
tsismall=TSI[1];
}
}
スクリプトでは、こうしています。
時間=0
月曜日にSymbolInfoTick。
このコードで確認することができます。
しかし、シンボルごとにティックが必要 です。
このコードで確認することができます。
しかし、シンボルごとにティックが必要 です。
はい、"SymbolInfoTick"、今日はノーチェックです。
試してみたが、ダニが来るまでは効果がない。
iask=0はい、SymbolInfoTick、今日はノーチェックです。
試してみましたが、ティックが消えるまで何も動作しません。
iask=0この機能は速すぎる。
性能を測定するためには、反復回数の多いループで複数の呼び出しを適用し、総実行時間を測定する必要があります。
さらに興味深いのは、サンプルコードがあることだ。結果を待っているところです。
EAの新しいバーをチェックするために、フォーラムで見つけた「CopyTime」「CopyRates」をベースにした関数を使いました。その結果、計算にはかなりの時間がかかるという結論に至りました。
以下はそのチェックデータです(インジケータ呼び出しに 171msかかっているのが興味深いです)。
そしてここで、何か別のことをやってみたらどうだろうと思いついたのです。例えば、"TimeCurrent"。
最適化のため、以下のコードを作成。
Expert Advisorで最適化するために以下のコードを行いました。
新しいバーを確認しない1回の実行で、各ティックで指標値を受信した場合の結果:817,196ms
新しいバーをチェックする場合:735 904 ms
その差は特になく、多少の改善は見られるものの、十分とは言えません。
以下のようなインジケータが表示されるのですが。
新しいバーのチェックが行われるブロックに、ハンドルの呼び出しがあるコードを入れてみましたが、以下のようにするとエラーが発生します。
return を入れても何も返ってこないし、エラーにもならないが、EAが動かない。
hendleの呼び出しは、もし可能なら、そして一般的にスタティック変数を除くすべてのメインコードは、新しいバーをチェックする条件文の中に配置されるべきでしょう。
私の記憶違いでなければ、ハンドルを呼び出してもバッファにインジケータを要求しない場合でも、計算されるとどこかで読んだことがあります。
buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)))*10000 という単一の数式の結果を表示するインジの作り方を提案できる人がいます。
カスタムインジケータを書く必要があります。作業を簡単にするために-最もシンプルな指標の一つであるiMaを 取り上げ、少し書き換えてみましょう。こちらもMarketInfoについて書かれているトピック です。コードを書き、何かうまくいかないことがあれば、尋ねる。
スタティック 変数はどうなった?今日、ターミナルの古いビルドを更新したら、コンパイル時にエラーが発生するようになりました。
ここで、クラスの静的メンバ-データを配置 する必要があります。