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

 
Vitaly Muzichenko:

サイクルではそう思えるので、関数を捨てて

ありがとうございます。

しかし、機能を削除すると、ブレーキが残ってしまう......。くそ

 
Aleksey Vyazmikin:

ありがとうございます。

しかし、機能を削除すると、ブレーキが残ってしまう......。くっそー。

4=>5からプログラムを書き直したことがあるのですが、4ではLow[1]やTime[0]などの構文をすべて最新のもの、つまりCopyLowやCopyTimeに 置き換えたら、4でもプログラムが速くなったんです。私は今、古い構成は使わず、新しいものだけを使用しています。そのため、コードは5番目のプラットフォームにも簡単に移植でき、取引関数を 変更するだけです

 
Vitaly Muzichenko:

4=>5からプログラムを書き直し、Low[1]やTime[0]などの構文をすべて最新のもの、つまりCopyLowやCopyTimeに 置き換えたら、4でもプログラムが速くなったんだ。私は今、古い構成は使わず、新しいものだけを使用しています。そのため、コードは5番目のプラットフォームにも簡単に移植でき、取引関数を 変更するだけです

くしゃみのたびにアレイを埋める のはリソースの消費では?

バーのオープニングで配列に情報をコピーし、コードの展開に応じてそこから情報を取得するのが理にかなっているのかもしれませんね。バーオープンで取引しています。


 
Aleksey Vyazmikin:

くしゃみをするたびに配列を埋める のは、リソースを消費するのでは?

バーが開くときに配列に情報をコピーし、コードが進むにつれてそこから情報を取得するのが理にかなっているのかもしれませんね。バーオープンで取引しています。

配列は、新しいバーで埋めることができ、それはより少ないリソースを消費します。iLow[1]を複数の場所で扱う場合は、配列ではなく一旦変数に格納し、それを読み出すようにします。

仮にこれを

// Инициализация TIME[0] TIME[1]
  ArraySetAsSeries(TM,true);
  if(CopyTime(dSymbol,Period(),0,2,TM)<0) return;
  TIME_0=TM[0];
  TIME_1=TM[1];
そして、TM[0]TM[1] の代わりに、変数TIME_0 とTIME_1 を使って作業します。
 
Vitaly Muzichenko:

配列は新しいバーで埋めることができ、それはより少ないリソースを必要とします。例えばiLow[1]を複数の場所で扱う場合、一旦変数に書き込んで、配列の代わりに変数を読み込むことが望ましいです。

そうだとすると

それにしても、MT4の方がずっと速いんですねー、がっかりです。

 

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

バグ、バグ、質問

アレクセイ・ヴャズミキン さん 2017.07.21 15:07

なぜファンタジーなんだ?あなたのアイデアを理解し、動作することを確認し、要求が1回で、EAが動作するために必要なバーの数がわかっていれば、効果があります。

それとも、別の方法で構造を使うことを提案されたのでしょうか? それなら、説明してください!ただし、気を悪くしないでください。


ファンタジーがない。もし、1つのローソク足に対して2つ以上のパラメータを取得する必要がある場合、メッセージや質問にある関数を使用して、ローソク足の各パラメータに対して個別にこれらの関数を呼び出す必要があります。これはCopy***()を2回以上出すことになりますが、CopyRates()を使えば、Copyの呼び出しは1回で済みます。

コピーする数については、また別の問題です。まず必要なインジケータ値を含むバーを計算して、それをコピーすればいいのかもしれません。私の記憶が正しければ、コピーするのは未知数という話だったはずです。どんなファンタジーなんだろう?

極端な話、例えば10本のバーをコピーしてその中を探し、見つからなければまた10本のバーをコピーする。コピーは時間がかかるので、配列をコピーする方が安上がりです。

一般的には、さまざまなバリエーションがあります。それを全部ドキュメントに書いてしまうと、まったくドキュメントにならなくなってしまいます。プログラミング教室でも教えています。しかし、残念ながら、すべての先生ができるわけではありませんし、すべての生徒がレッスンでそれを理解したいと思っているわけでもありません。そして、その始まりは、2年生から5年生までの算数の授業で、先生が問題の詳しい説明を要求するときです。しかし、ここでも問題は同じです。

 
Alexey Viktorov:

派手さはない。もし、1つのローソク足に対して2つ以上のパラメータを取得する必要がある場合は、メッセージや質問にある関数を使用して、各ローソク足のパラメータに対して別々に関数を呼び出す必要があります。これはCopy***()を2回以上実行することになりますが、CopyRates()を使用するとCopyの呼び出しは1回で済みます。

コピーする数については、また別の問題です。まず、どのバーでインジケータの正しい値が利用できるかを計算し、それをコピーする必要があるのかもしれません。私の記憶が正しければ、コピーするのは未知数という話でした。どんなファンタジーなんだろう?

そして、最後の手段として、例えば10本の小節をコピーして、その中から探し、見つからなかったら、また10本の小節をコピーする、ということも可能です。コピーはかなり高価な操作であり、配列の中を検索した方が安上がりである。

この場合、多くのバリエーションがあります。このようなことは、ドキュメントには書けません。むしろ、ドキュメントではなくなってしまいます。プログラミング教室でも教えています。しかし、残念ながら、すべての先生がその方法を知っているわけではありませんし、すべての生徒がレッスンでそれを理解したいと思っているわけでもありません。そして、その始まりは、2年生から5年生までの算数の授業で、先生が問題の詳しい説明を要求するときです。しかし、ここでも問題は同じです。

ファンタジーについて-は、「言われたことを理解しようとせず、何が得られるかを考えようとせず、信じられないような反論をする」というあなたの発言に対する返答であり、あなたが提示したバージョンがファンタジー分野のものであるという事実に対するものではありませんでした。

あなたのコンセプトは完璧に理解していますし、あなたへの返答の中に埋め込まれていました。

しかし、未知の量のデータをどのように扱うのか、よく理解できません。コードの形で例を示していただけませんか?


 

このリンクhttps://www.mql5.com/ru/code/16805 を使って、インジケータの監査と最適化にご協力ください。問題は、多数のバーが表示されたときにインジケータが大きく減速し始めることです。

毎ティックで計算するのではなく、バーオープン時のみ計算するようにするにはどうしたらいいのか知りたいのですが?Expert Advisorの方法は適切ではありません。最初のティックの後、すべての値が消え、次のバーで初めて表示されます。

Donchian Channel MTF
Donchian Channel MTF
  • 投票: 13
  • 2016.12.13
  • Mladen Rakic
  • www.mql5.com
Мультитаймфреймовая версия канала Дончиана.
 
Aleksey Vyazmikin:

ファンタジーについてですが、「言われたことを理解しようとせず、何が有効かを考えようとせず、信じられないような反論を繰り出す」というあなたの発言に対する返答であり、あなたが提案したオプションがファンタジーの領域から来たものだということではないのです。

あなたのコンセプトは完璧に理解していますし、あなたへの返答の中に埋め込まれていました。

しかし、未知のデータ量をどのように処理 するのかがよくわかりません。コードの形で例を示していただけませんか?


その答えが先に出たのは...。

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

最後の手段として、例えば10小節ずつコピーして検索し、見つからなかったらまた10小節ずつコピーする。コピーは高価な操作なので、配列内を検索する方が安上がりです。

しかし、配列から最大数の棒を取り出そうとするのではなく、1本のコピーで済ませるようにした方がいい。

コードサンプルは書きません。普通のプログラマーは、ヒントがあればいいんです。以下はアルゴリズムの例です。

  1. 水路が交差しているバーのおおよその数を決定する。15とする。
  2. インジケーターの両バッファーをコピーします。
  3. CopyRates()を使ってバーの値をコピーします。
  4. ループの中では、チャンネルの上限と高いバーの値を比較すると同時に、低いバーとチャンネルの下限を比較することを開始します。そのうちの1つが見つかれば、そのバーインデックスが変数に格納され、続けて2つ目のクロスを探す。交差点バーの両方の変数に値があるとき、ループを終了する。

このように、必要に応じて1コピー1サイクルで2つの交点を見つけることが可能です。ArraySetAsSeries() では、交差を見つけることが可能で、私の意見では、その番号ではなく、バーの時間を覚えて おく方が良いので、必要ないくらいです。しかし、バーの時間を知っていれば、その数を決定することに困難はない。

Question: インジケータバッファを1値分コピーし、ハイバーを1値分コピーしてそれらの値を比較するサイクルと、一定量コピーして2つの配列の値を互いに比較するサイクルのどちらが速いでしょうか?

 

ちょうど昨日、これを書いたところです。

タスク

各ティックで"InpCountCopy "要素のopen、high、low、close、timeを取得する。

実施する。

  1. 0 "から "InpCountCopy-1 "までのループ - ループは一度に1つのオープン、ハイ、ロー、クローズと時間を取得します。
  2. 一度に「InpCountCopy」要素をMqlRates構造体に取得し、その構造体をループしています。

特徴

チェック方法は、OnTickとOnTimer(1秒)のどちらかを選択できます。

//+------------------------------------------------------------------+
//|                                      Copy OHLC vc Copy Rates.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.001"
//--- input parameter
input int InpCountCopy=1000;
input bool OnTickOnTimer=false; // OnTickOnTimer: false -> OnTick, true -> OnTimer 1 second
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(OnTickOnTimer)
      EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(OnTickOnTimer)
      return;
   Testing();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(!OnTickOnTimer)
      return;
   Testing();
  }
//+------------------------------------------------------------------+
//| Main function                                                    |
//+------------------------------------------------------------------+
void Testing()
  {
//--- for once one element
   ulong start=GetMicrosecondCount();
   for(int i=0;i<InpCountCopy;i++) // in one operation we get one element.
     {
      double open=iOpen(i);
      double high=iHigh(i);
      double low=iLow(i);
      double close=iClose(i);
      datetime time=iTime(i);
     }
   ulong end=GetMicrosecondCount()-start;
   string text=(OnTickOnTimer)?"OnTimer":"OnTick";
   text=text+"\n"+"OHLC: "+IntegerToString(end);

//--- for one operation we get "InpCountCopy" elements.
   start=GetMicrosecondCount();
   MqlRates Rates[];
   if(!iRates(Rates,0,InpCountCopy))
      return;
   for(int i=0;i<InpCountCopy;i++)
     {
      double open=Rates[i].open;
      double high=Rates[i].high;
      double low=Rates[i].low;
      double close=Rates[i].close;
      datetime time=Rates[i].time;
     }
   end=GetMicrosecondCount()-start;
   text=text+"\n"+"Rates: "+IntegerToString(end);

   Comment(text);
  }
//+------------------------------------------------------------------+ 
//| Get Open for specified bar index                                 | 
//+------------------------------------------------------------------+ 
double iOpen(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Open[1];
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,Open);
   if(copied==1)
      open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Get the High for specified bar index                             | 
//+------------------------------------------------------------------+ 
double iHigh(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double High[1];
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,High);
   if(copied==1)
      high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Get Low for specified bar index                                  | 
//+------------------------------------------------------------------+ 
double iLow(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Low[1];
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,Low);
   if(copied==1)
      low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Get Close for specified bar index                                | 
//+------------------------------------------------------------------+ 
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Close[1];
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,Close);
   if(copied==1)
      close=Close[0];
   return(close);
  }
//+------------------------------------------------------------------+ 
//| Get Time for specified bar index                                 | 
//+------------------------------------------------------------------+ 
datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   datetime Time[1];
   datetime time=0;
   int copied=CopyTime(symbol,timeframe,index,1,Time);
   if(copied==1)
      time=Time[0];
   return(time);
  }
//+------------------------------------------------------------------+ 
//| Get Rates for specified bar index                                | 
//+------------------------------------------------------------------+ 
bool iRates(MqlRates  &Rates[],const int index,int count,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   int copied=CopyRates(symbol,timeframe,index,count,Rates);
   if(copied!=count)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+


ファイル:
理由: