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

 
Aleksey Vyazmikin:

のため、まだコードを表示する準備ができていません。

しかし、MT5からプロファイリングの結果を表示する準備ができている - 私はトレーディング機能は問題外であると理解しています。



OHLC環境では、以下の機能を使用しています。

もしかして、私のやり方が悪いのでしょうか?

残念ながら、あなたはやり方を間違えて います。

ネイティブで効率的なMQL5のコードを書く代わりに、ひどく非効率なMQL4エミュレーターを使い、何十倍も動作を遅くして いるのです。

悪いのは、速度に関する質問をしているのだから、自分が何をやっているのかすら分かっていないことだ。
 
Aleksey Vyazmikin:

その結果、次のようなコードになります。

https://www.mql5.com/ru/code/18305

Высокопроизводительная библиотека iTimeSeries
Высокопроизводительная библиотека iTimeSeries
  • 投票: 19
  • 2017.05.25
  • nicholishen
  • www.mql5.com
Эта библиотека предоставляет молниеносный доступ к таймсериям для реализации привычных методов MQL4 (например, iBarShift) в чувствительных к задержкам приложениях на MQL5.
 

ありがとうございます - このライブラリは見たことがあります - 説明は分かりにくかったです


ほとんどの時間は、初期化の段階で 費やされます。時系列データに何度もアクセスする予定がない限り(バー形成中に数千回以上)、別の方法を検討する必要があります。

私のExpert Advisorはバーのオープニングでしか動作しませんが、試してみることに意味があると思いますか?
 
Renat Fatkhullin:

残念ながら、やり方が間違って いるのです。

ネイティブで効率的なMQL5コードを書く代わりに、ひどく非効率なMQL4エミュレーターを使い、何十倍も動作を遅くして いるのです。

悪いのは、速度について質問しているのだから、自分が何をしているのかすら理解していないことだ。

もちろん、私は解決策を探していました - MQL4の関数をMQL5に置き換える方法、特に時系列を参照すること、そしてこれがMQL5に移行するほとんどの人が遭遇する問題の1つであることを見ました。

そこで、同サイトの記事の中で、私の方法を推奨しているものがあり、解決策を見つけました。

個人的には、便利で良い機能を言語から排除する理由が理解できません。

そこで質問ですが、情報の正しい受け取り方と、MQL5の 活用方法について教えてください。

 
Aleksey Vyazmikin:

そこで質問ですが、MQL5の 良さを実感するために、受信データを正しく整理するにはどうしたらよいのでしょうか。

MQL4のコードにしがみつかず、MQL5のネイティブでより生産性の高い機能を利用すること。MQL4 -> MQL5コンバータ/スプリッターは、MQL4のダイレクトアクセスマイクロファンクションをMQL5のバルクオペレーションでエミュレートしようとするため、パフォーマンスが数十倍遅くなります。しかも、そのエミュレーションは、最適化やキャッシュをまったく行わずに行われるのです。

特定の機能(他人のコードを含むコードのビット)を使用する根底には、具体的に何が行われているかという理解があるはずです。そうしないと、「他人のコードを使ったばかりに速度が落ちた!」ということになります。道具を理解し、それを使って何をするのかを理解しなければ、良い結果を得ることはできません。


正しいやり方」に加えて、「プログラミングを学ぶ」という作業は、ある言語を操作する(理解するのではなく、操作する)という最も基本的なレベル以上になると、極めて困難であることを明確にしておく。ですから、大量の記事、ドキュメント、ライブラリにある既成のコードを読み、数年間強制的に練習する以外に、学ぶ方法はないと思っています。
 
Renat Fatkhullin:

MQL4コードに固執せず、MQL5言語のネイティブでより生産的な機能を使用してください。

特定の関数(他人のコードを含むコードの一部)を使用する根底には、何が行われているのかを理解することが必要です。そうしないと、「他人のコードを使っただけなのに、見ろよ、速度が落ちたぞ!」となる。道具を理解し、それを使って何をするのかを理解しなければ、良い結果を得ることはできません。


正しいやり方」に加えて、「プログラミングを学ぶ」という作業は、その言語を操作する(理解するのではなく、操作する)最も基本的なレベル以上になると、非常に困難であることを明確にしておく必要があります。だから、記事やドキュメントを読み、ライブラリにあるレディコードを読み、数年間練習する以外に、学ぶ方法はないと思っているんだ。

Renatさん、コードベースはご覧になりましたか?MQL4から流用した関数を使ったコードがあるのですが。

私は、環境に関する正しい情報を得る方法を具体的に書いてくださいと言っているのです。抽象的な本を参照することは生産的ではなく、チェックできない言い訳に過ぎないという私の(おそらく間違った)考えを強めるだけです。

配列に情報をコピーする関数の意味が分からないほど頭が悪いというのは、プログラミング言語の付属文書が低レベルであることを意味する。この配列から別の配列へのコピーの利点と、必要に応じて配列から情報を取得する関数がなぜひどいコードになるのか理解できません。

 
Aleksey Vyazmikin:

もちろん、MQL4の関数をMQL5に置き換える方法、特に時系列を参照する方法を探していて、これがMQL5に移行するほとんどの人が遭遇する問題の1つであることを知りました。

そこで、同サイトの記事の中で、私の方法を推奨しているものがあり、解決策を見つけました。

個人的には、便利で良い機能を言語から排除する理由が理解できません。

だからこそお聞きしたいのですが、私がMQL5の 良さを実感するための正しい情報の受け取り方とは何でしょうか?

もしかして私の探し方が悪いのでしょうか?ここでは、このすべてのコードの代わりに必要なものを1つのコピーにまとめています。

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

エラー、バグ、質問

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

ありがとうございます - 修正しました。

その結果、以下のようなコードになりました。

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }

テスターの時間が長くなった - もう待ちくたびれた ::)

使うためには、どういう構造なのかを理解すればいいのです

struct MqlRates
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
   int      spread;       // спред
   long     real_volume;  // биржевой объем
  };


Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyRates - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

もしかしたら、私の見方が悪かったのか?この 1冊で、このようなコードの代わりに必要なものをすべて手に入れることができます。

これを使うためには、構造がどうなっているかを理解すればいいのです



同じものが出てくるんですよ、実は...。

ご指摘のバリエーションは、ifleに合っていますね。

- 計算が行われるのは、バーの開店時のみです。

- 必要なバーの本数が事前にわかる

コードにループがあり、計算量があらかじめわからない場合があるのですが。

また、新しいバーの情報を追加するだけの方が合理的なのに、例えば300本分の情報を開くたびにコピーすることに何の意味があるのか、開発者はなぜこの方法をとらなかったのでしょうか。

 
申し訳ないが、初心者にいちいちプログラミングを教えることに付き合っている時間は全くない。特に、その人がプログラミングを理解するための基礎すらできていないことがわかると、つまらないことを聞いてくるんです。


でも、方向性は示しますよ。

  1. MQL5ドキュメント
  2. コードベース
  3. 記事一覧
  4. フォーラム(「俺のために書いてくれ、なんで教えてくれないんだ、俺の仕事しろ」モードではない)
  5. フリーランス(こちらは正しく書けるそうです)
  6. "なぜこのラッパーが遅くなり、リソースを浪費しなければならないのか、最適に書き直せるかもしれない "という思慮深い分析による独立した仕事。
  7. コードの各行におけるリソースの実際の消費量を示すプロファイラの 使用
Профилирование кода - Разработка программ - Справка по MetaEditor
Профилирование кода - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Профилирование — это сбор характеристик программы, таких как время выполнения отдельных ее фрагментов (функций, строк). В MetaEditor встроена...
 

このような形でコミュニケーションを図りたいとは思っていません。その話を理解しようとせず、何が起こるのかを考えようとせず、信じられないような反論を投げかけてくるのです。