初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 245

 
forexman77:

スクリプトでは、こうしています。

時間=0

月曜日にSymbolInfoTick。

このコードで確認することができます。

void OnStart()
{
  double ask;
  uint start=GetTickCount();
  for(int i=0;i<1000000;i++)
  {
    ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
  }
  uint time=GetTickCount()-start;
  Print("SymbolInfoDouble = ",time," ms");
  
  MqlTick tick;
  start=GetTickCount();
  for(int i=0;i<1000000;i++)
  {
    SymbolInfoTick(Symbol(),tick);
  }
  time=GetTickCount()-start;
  Print("SymbolInfoTick = ",time," ms");
}

しかし、シンボルごとにティックが必要 です。

 
Fleder:

このコードで確認することができます。

しかし、シンボルごとにティックが必要 です。

はい、"SymbolInfoTick"、今日はノーチェックです。

試してみたが、ダニが来るまでは効果がない。

void OnStart()
  {
uint start=GetTickCount();
double iask=0;
MqlTick latest_price;       // Будет использоваться для текущих котировок  
if(!SymbolInfoTick(_Symbol,latest_price)){iask=latest_price.ask;}
Alert("iask=",iask);
uint time=GetTickCount()-start;
Alert("time=",time);  
  }
iask=0
 
forexman77:

はい、SymbolInfoTick、今日はノーチェックです。

試してみましたが、ティックが消えるまで何も動作しません。

iask=0

この機能は速すぎる。

性能を測定するためには、反復回数の多いループで複数の呼び出しを適用し、総実行時間を測定する必要があります。

 
barabashkakvn:
さらに興味深いのは、サンプルコードがあることだ。結果を待っているところです。
 
forexman77:
ありがとうございます。きっと重宝しますよ。
 

EAの新しいバーをチェックするために、フォーラムで見つけた「CopyTime」「CopyRates」をベースにした関数を使いました。その結果、計算にはかなりの時間がかかるという結論に至りました。

以下はそのチェックデータです(インジケータ呼び出しに 171msかかっているのが興味深いです)。

datetime New_Time[];//буффер для проверки нового бара
void OnStart()
  {
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
static datetime 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");
  }

MqlRates rates[]; 
void OnStart()
  {
datetime t;  
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
ArraySetAsSeries(rates,true);
int copied=CopyRates(Symbol(),Period(),0,1,rates);  
t=rates[0].time; 
}
uint time=GetTickCount()-start;
Print("t = ",time," ms");
  }

そしてここで、何か別のことをやってみたらどうだろうと思いついたのです。例えば、"TimeCurrent"。

最適化のため、以下のコードを作成。

void OnStart()
  {
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で最適化するために以下のコードを行いました。

static double ind1;//записываю значения
static double ind2;// значения
static double 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;   // хэндл индикатора  TSI
double TSI[]; // динамические массивы для хранения численных значений TSI

int OnInit()
  {
TSIHandle=iCustom(NULL,0,"Blau_TSI",q,r,s,u,PRICE_CLOSE);
if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}
ArraySetAsSeries(TSI,true);
   return(0);
  }

void OnDeinit(const int reason)
  {
//--- освобождаем хэндлы индикаторов
   IndicatorRelease(TSIHandle);
   ArrayFree(TSI);
  }

void OnTick()
  {
MqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
static double tsismall;

if (MIN==0 && SEC==0)
{
//--- копируем значения индикаторов из индикаторных буферов
   if(CopyBuffer(TSIHandle,0,0,3,TSI)<0)
     {
      Alert("Ошибка копирования буферов индикатора Moving Average - номер ошибки:",GetLastError(),"!!");
      return;
     }
tsismall=TSI[1];
}
}

新しいバーのチェックが行われるブロックに、ハンドルの呼び出しがあるコードを入れてみましたが、以下のようにするとエラーが発生します。

if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}

return を入れても何も返ってこないし、エラーにもならないが、EAが動かない

hendleの呼び出しは、もし可能なら、そして一般的にスタティック変数を除くすべてのメインコードは、新しいバーをチェックする条件文の中に配置されるべきでしょう。

私の記憶違いでなければ、ハンドルを呼び出してもバッファにインジケータを要求しない場合でも、計算されるとどこかで読んだことがあります。

 
buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)) )*10000という式の結果を出力するインジケーターの作り方を誰か教えてくれませんか?
 
rus-lot:
buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)))*10000 という単一の数式の結果を表示するインジの作り方を提案できる人がいます。

カスタムインジケータを書く必要があります。作業を簡単にするために-最もシンプルな指標の一つであるiMaを 取り上げ、少し書き換えてみましょう。こちらもMarketInfoについて書かれているトピック です。コードを書き、何かうまくいかないことがあれば、尋ねる。

 
スタティック 変数はどうなったのでしょうか?今日、ターミナルの古いビルドを更新したら、コンパイル時にエラーが発生するようになりました。

unresolved static variable
 
sgreen:
スタティック 変数はどうなった?今日、ターミナルの古いビルドを更新したら、コンパイル時にエラーが発生するようになりました。

unresolved static variable

ここで、クラスの静的メンバ-データを配置 する必要があります。

//+------------------------------------------------------------------+
//| Класс "Анализатор текстов"                                       |
//+------------------------------------------------------------------+
class СParser
  {
public:
   static int        s_words;
   static int        s_symbols;
   //--- конструктор и деструктор
                     Parser(void);
                    ~Parser(void){};
  };
...
//--- инициализация статических членов класса Parser на глобальном уровне
int CParser::s_words=0;
int CParser::s_symbols=0;
理由: