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

 
papaklass:

...

なるほど。あなたの立場は明確です。
 

そんなEAが、現実には1コアの力を欠いているなんて、想像すらできない。例えば、テスターでExpert Advisorが1年分の履歴を1日1シンボルずつパスする場合(多すぎる!コードを書き直すべきかも!)、現実には平均1/250の電力=0.4%のCPU負荷がかかることになります。

10シンボルのEAでは、平均4%の負荷がかかります。他のコアに負荷をかけてもあまり意味がないんです。

 

Konstantin(Lizar)のアイデアについては、良いと思います。しかし、この種のソリューションでは、チャートから直接来るイベントと、カスタムで生成されるイベントを分離する必要があります。カスタムイベントについては、OnUserEventsのように、2つのイベントキューと2つのイベントハンドラを用意することができます。

また、カスタムイベントの追加機能として、優先度を明示的に指定(例えば0から9まで)することで、ユーザーが特定のイベントの先取りや処理をコントロールできるようにするのも面白いでしょう。例えば、このような機能により、低い値のイベントを実行し、高い値のイベントをキューから削除することができます(キューがより重要なイベントでいっぱいになっている場合、新しいイベントはキューに入れられません)。

papaklass:

私はソフトウェア開発をしたことがないので、ソフトウェア開発者の技術的な言葉を話すことはできません。4コアのパソコンとMT5で得たいものを記載します。一般的にはこのような感じです。


複数のツールの取り扱いが可能になり、開発者は完璧に実行可能なソリューションを作り上げました。

2.テスターの仕事とコアの山について。これは特殊なケースであり、この仕組みを実際の取引と比較するのは正しくありません。テスターの問題を解決する本質は、いくつかのExpert Advisorのバリエーション(またはむしろ1つのExpert Advisorと多くのユニークなパラメータセット)がある場合、利用可能なすべてのコア/エージェントに計算を分散するのが合理的であるということです。このように、タスク全体としては非同期だが、個々のエージェントの立場からはすべてが同期している。

3.マルチスレッドといっても、複数のツールを同時に処理するのではなく、複数のイベントを同時に(しかも特定の個々のEA内で)処理することを指しています。それは、どのバージョンの端末にもなかったことです。

オーバーヘッドが多すぎる、ユーザーの構成が雑多すぎる、「マルチスレッド」なExpert Advisorがアクセスするデータの同期に問題がありすぎる、などなど。

一方、イベント付きのアイデアは、論理的な結論に至っていない。OK、「マルチスレッド」を実装するのは高価で問題がありますが、端末自体の中で処理と情報の流れを最大限に並列化し、最大数のタスクを解決するのに十分なハンドラ群を作成することは可能です(しかも通常のパラメータセットで)。

 
papaklass:

M5のExpert Advisorで、2010年4月1日から2011年9月1日の期間に12通貨で1436秒(24分)で1つのパスを作成し、同時に5687トレードを行います。1つのコアだけがロードされ、他の3つのコアはアイドル状態です。つまり、このプラットフォームはコンピュータのパワーを使わないので、1回のパスで3/4の時間をロスしてしまうのです。これは、ストラテジーをデバッグする際に、このプラットフォームの大きな欠点となる。最適化時のみコアをフル活用。しかし、最適化は単発よりもずっと稀なことなのです。そして、単発で多くの時間を浪費している。

3/4の時間を失う」というのは、「マルチスレッドを使うのは機会損失であり、開発者の明らかな欠陥である」という考えを示しています。

残念ながら、シーケンシャルなタスク(1つのテスターパスもシーケンシャルなタスクです)に対するマルチスレッドは無償で提供されるものではありません。現実には、マルチスレッドはプロセスの同期に大きな(時には複数の)損失がある。実際、共有リソースへのアクセスはすべてシンクロナイザーで縛られなければならない。

テスターをターミナルから別プロセスに移動させたのは、テスト時間の99%をロックなしでシングルスレッドで動作させるためだけです。その結果、大幅なスピードアップを実現しました。

マルチタスクを各EAに突っ込もう」という提案は、この場合のマルチスレッドのコスト(トータルの速度低下)と結果(速度低下+99%の非プロ開発者の屋根を吹き飛ばす)を完全に誤解しているからだ。


ターミナル、テスターでのマルチタスクの適用に関する問題を効果的に解決し、リモートエージェントとMQL5クラウドネットワークモードでほぼ無制限のパワーのスケーリングを可能にしました。


12枚のチャートを開き、それぞれに1つずつインジケータを置くと、ある時間帯にターミナルがどのように遅れるかがわかります。フォーラムに寄せられたメッセージから判断すると、この現象は私だけに起こっているわけではなさそうです。そのため、12個の計測器と1個のインジケータになっています。 そして、計測器とインジケータの数を増やす必要がある場合、ターミナルがクラッシュしてしまうのです。そして、1つのコアが使われ、残りは休んでいることになります。端末の処理を コアに分散させれば、つまりコンピュータのパワーをフルに使えば、別の次元の課題も解決できるはずです。そういうことなんです。

12の異なるシンボルを持つチャーがあるとすれば、各チャーのシンボルは他のものに影響を与えることなく、明らかに独自のスレッドで動いていることを意味します。

チャートが遅くなり始めたら、その理由はありふれたもので、指標の一つが非常に不経済である。この場合、いくらマルチタスクを駆使しても、根本は効率を気にせず、頭の中で指標を書いているプログラマーの仕事ですから。

 

私は逆のチャートを取得することはできません、何かが間違っている、新しいバーが このバリアントで不具合

私がいじくりまわしているオリジナルのインジケータを添付します。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---- проверка количества баров на достаточность для расчета
   for(int numb=0; numb<8; numb++) if(BarsCalculated(RSI_Handle[numb])<rates_total) return(RESET);
   if(rates_total<min_rates_total) return(RESET);

//---- объявления локальных переменных 
   int to_copy;

//---- расчеты необходимого количества копируемых данных
   if(prev_calculated>rates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора
      to_copy=rates_total-1;                   // стартовый номер для расчета всех баров
   else to_copy=rates_total-prev_calculated+1; // стартовый номер для расчета новых баров
   
//---- копируем вновь появившиеся данные в массивы
   if(CopyBuffer(RSI_Handle[0],0,0,to_copy,Buffer1)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[1],0,0,to_copy,Buffer2)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[2],0,0,to_copy,Buffer3)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[3],0,0,to_copy,Buffer4)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[4],0,0,to_copy,Buffer5)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[5],0,0,to_copy,Buffer6)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[6],0,0,to_copy,Buffer7)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[7],0,0,to_copy,Buffer8)<=0) return(RESET);
   
   //мой кусок отсель   
   if (Reverse)
      {
         int start=prev_calculated;
         for(int i=start;i<rates_total;i++)
            {
               Buffer1[i]=100-Buffer1[i];
               Buffer2[i]=100-Buffer2[i];
               Buffer3[i]=100-Buffer3[i];
               Buffer4[i]=100-Buffer4[i];
               Buffer5[i]=100-Buffer5[i];
               Buffer6[i]=100-Buffer6[i];
            }
         Buffer1[0]=100-Buffer1[0];
         Buffer2[0]=100-Buffer2[0];
         Buffer3[0]=100-Buffer3[0];
         Buffer4[0]=100-Buffer4[0];
         Buffer5[0]=100-Buffer5[0];
         Buffer6[0]=100-Buffer6[0];
       }  
   //досель    

//----     
   return(rates_total);
  }
//+------------------------------------------------------------------+

ファイル:
Multi_RSI.mq5  15 kb
 

何が問題なのか、アドバイスをお願いします。

マルチカレンシーを執筆中

MAインジケーターハンドルが表示される

maHandle_EURUSD=iMA("EURUSD",PERIOD_H1,MA_Period_EURUSD,MA_Shift_EURUSD,MODE_SMA,PRICE_CLOSE);

maHandle_GBPUSD=iMA("GBPUSD",PERIOD_H1,MA_Period_GBPUSD,MA_Shift_GBPUSD,MODE_SMA,PRICE_CLOSE); 

チャンピオンシップで許可された残りの10通貨についても同じことをしていますが、テスト中にエラー4801が発生し、12通貨すべてが履歴に残っています(と思います)。

EURUSDチャートでテストしています。

Expert AdvisorはGBPUSDを テストしている(最適化するために設定でそう設定している)

 
Lazarev:

何が問題なのか、アドバイスをお願いします。

マルチカレンシーを執筆中

MAインジケーターハンドルが表示される

チャンピオンシップで許可された残りの10通貨についても同じことをしていますが、テスト中にエラー4801が発生し、12通貨すべてが履歴に残っています(と思います)。

EURUSDチャートでテストしています。

Expert AdvisorはGBPUSDをテストしている(最適化するために設定でそう設定している)

SymbolSelect Market Watchにシンボルを追加したいのですが。
 

papaklass:

さて、そんな素朴な疑問に答えてください・・・。

丁寧とは言えないまでも、さらにシンプルにお答えします。

残念ながら、あなたは完全に本題から外れており、プロセスに関する表面的な考えしか示していない発言をしています。

私たちの技術的な主張のほとんどは理解されないでしょうし、同期の基本的な問題やその提供に関する損失さえも理解されないと思われます。

したがって、「あなたの主張を聞かせてくれたら、私たちは推測します」という要求をする必要はなく、状況は完全に理解できるのです

 

初心者のための回答が見つからない。

1)動的配列に 別の要素を追加する場合、ArrayResize を使用して展開する必要がありますか?

2) MQL5で動的配列iから要素(例えば配列の途中の1つ)を削除する関数はありますか?ない場合は、どのような方法があるのでしょうか?

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Fia:

初心者の私は、これらの質問に対する答えを見つけることができません。

1)動的配列に 別の要素を追加した場合、ArrayResizeで展開する必要がありますか?

配列のサイズはある程度余裕を持って作り、限界に近づいたらサイズを大きくする。自動でリサイズして末尾に追加することはありません。ArrayInitialize()関数の例を見てみましょう。