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

 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  struct ARGB
  {
    uchar blue;
    uchar green;
    uchar red;
    uchar alpha;
  };
  
  struct N
  {
    uint num;
  };
  
  N n={100288};
  ARGB c;
  c=n;         //так получаем предупреждение implicit struct cast       sample.mq5      22      4
  c=(ARGB)n;   //а так всё в порядке
}
両方の構造体は同じサイズで、損失なく互いにコピーされますが、それでも警告が表示されます。
 
Fleder:
両方の構造体は同じサイズで、損失なく互いにコピーされますが、それでも警告が表示されます。
なるほど、それは素晴らしい。明示的なキャストを作るのは、それほど難しいことではありません。しかし、バグが発生したときに、何が割り当てられたのか把握しようとするのは、あまり気持ちのいいものではありません。
 
TheXpert:
だからすごいんです。明らかなカーストを作るのはそんなに難しいことではありません。また、バグが発生したときに、どこに何を割り当てるかを考えるのは、あまり楽しいことではありません。
コンパイラのモットー "転ばぬ先の杖 "のようだ。
 

アプリケーションからSRにコピーします。

RAMから*.hcキャッシュに戻す時系列のセルフアンロード機能
エラー、MetaTrader 5 MQL、開設、開始:2014.04.12 06:04, #995430

端末のバージョンとビット

910 32ビット

問題の内容

開発者の皆さん、こんにちは。

MQL5では、CopyRatesCopyTimeCopyOpenなどの 多くのシステム関数が、時系列データの受信を目的としています。

これらの関数のいずれかを呼び出すと、要求されたタイムスケールが "Max bars in chart" パラメータ内で RAM にロードされます。

しかし、以下のような要因が重なります。

1.シンボル上で利用可能な十分深い履歴、またはサーバーから完全にロードされた履歴。

2.Max bars in chart "パラメータが "Unlimited "に設定されています。

3.最小のタイムフレーム M1 のデータを要求する。

非常に多くのメモリが消費されている。

この問題は、MQL5を実行するプログラムのロジック(例えば、多通貨のExpert Advisorやインジケーターの場合)が、以下のように悪化しています。

は、数シンボルの低レベルの時間枠のデータへの交互アクセス(例えば、シングルサーチ)のために設けられてもよい。

その結果、RAMの消費量が何倍にもなってしまうのです。

Получение данных нужного таймфрейма из промежуточных данных

HCCフォーマットのサービスファイルは、HCフォーマットで要求された時間軸で価格データを構築するためのデータソースの役割を果たす。HC形式のデータは時系列であり、素早くアクセスできるように最大限に準備されている。これらは、"Max bars in charts "パラメータを超えない範囲で、チャートまたはmql5-programの要求に応じて作成され、さらに使用するためにhc拡張子を持つファイルに保存されます。

リソース節約のため、必要な時だけタイムフレームのデータをロードしてRAMに保存し、要求がない時間が長い場合はRAMからデータをアンロードしてファイルに 保存します。各時間枠のデータは、他の時間枠の準備データとは独立に用意されています。データの準備と利用可能性に関するルールは、すべての時間枠で同じです。すなわち、HCCフォーマットで保存されるデータの単位は分棒であるにもかかわらず、HCCフォーマットのデータが利用可能であることは、同じボリュームでM1時間枠のHCフォーマットのデータが利用可能であり、アクセス可能であることを意味しない。

サーバーから新しいデータを受信すると、すべての時間枠でHC形式の使用済み価格データが自動的に更新 され、計算の入力データとして明示的に使用するすべての指標が再計算されます。

引用した資料の黄色で示した処理のタイミングは、30分程度とかなり大きいです(私の観測では)。

その結果、要求されたすべてのタイムスケールは、何の理由もなく「RAM」に「居座る」ことになります。

RAM」が「ラバー」でない場合そして、貪欲なExpert Advisor/Indicatorは、より多くのタイムラインを必要とし、ターミナルは他にすることがありません。

ただし、余分なタイムスケールをファイル(キャッシュ)に戻す緊急の「ダンプ」を除く。そのため、今回の緊急リセットでは、端末がタイムスリセットを行うことで

キャッシュが壊れる」、つまりデータの「良い半分」が失われる。そして、次にこのタイムシリーズにアクセスしたとき、端末はこの「壊れたキャッシュ」を正常なものとして読み込む。

その結果、端末のチャートには、必要な時系列が、履歴に大きな穴が開いた状態で表示されます。

期待される結果

MQL5言語は、実行環境のリソースを節約する傾向にある。その例を挙げると、次のようになります。

1.ArrayFree 関数

2.resourceFree 機能

3. オペレータの削除

4.チャート内の最大バー数」 パラメータ

MQL5の言語機能にシステム関数を追加して、端末が使用しなくなったタイムスリップで強制的に操作を行うことは可能でしょうか?

この時系列で開かれたチャートがない場合、タイミングの終わりで?

例えば、ある機能。

bool SeriesFlush(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   );

これなら許されるでしょう。

1.RAMオーバーフローを気にしない。

2. 端末の電源を切ったときに手動で *.hc ファイルを削除することでしか取り除けない「壊れたキャッシュ」を心配する必要はありません。

3.OSのビットモードやメインメモリのサイズに依存する必要がありません。

4.ソフトウェア製品を開発する場合、上記のデメリットを回避しようとする「松葉杖」を使用しないこと。

 
Fleder:

アプリケーションからSRにコピーします。

RAMから*.hcキャッシュに戻すセルフアンロードの可能性
なぜかというと、それは素晴らしいアイデアだからです。
 
正のバイアスを持つインジケータからデータを取得する方法を教えてください。 私は、-1バーのデータに興味があります?
 
dentraf:
正のオフセットでインジケータデータを取得する方法を教えてください。 私は-1バーのデータに興味があります?

これを行うには、対象となる指標線のオフセット設定を知る必要があります。これはiAlligatorの テクニカル指標からの例です。

//--- зададим смещение для каждой линии
   PlotIndexSetInteger(0,PLOT_SHIFT,jaw_shift);

これはオフセットであり、将来の指標計算ではありません。

 

アプリケーションからSDにコピーする。

インジケーターのIsStoppedシステム機能の誤動作
エラー、MetaTrader 5 MQL、開設、開始:2014.04.12 07:59, #995480

端末のバージョンとビットモード

910 32ビット

問題の内容

開発者の皆さん、こんにちは。

反復回数の多いループを設計する際のコード品質向上のための推奨事項の1つである

は、MQL5プログラムの強制停止の検証をシステムで組み込むために

IsStopped() システム関数。

しかし、実際には、このチェックはインジケータでは機能しません(スクリプトとExpert Advisorでは機能します)。

以下、問題の本質を示すインジケータ・ショートコードです。

#property  indicator_plots 0
//=====================================================================
// Custom indicator initialization function
//=====================================================================
int OnInit()
{
  return(INIT_SUCCEEDED);
}
//=====================================================================
// Custom indicator iteration function
//=====================================================================
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[])
{
  long n=0;
  for(int i=0;i<1 e+10 && !IsStopped();i++) {n++;}
  Print("OnCalculate End");
  return(rates_total);
}

このインジケータをチャートから削除しようとしても、「インジケータの計算」の処理はこのまま止まりません。

プログラムの停止 フラグをチェックするためです。

タスクマネージャーでterminal.exeのプロセスを監視すれば、簡単に見つけることができます。クアッドコアプロセッサーで

CPUの負荷は約25%です。また、端末の負荷は、時間が経っても全く減らないのは

端末のシャットダウンまた、ターミナルをシャットダウンしても、ターミナル.exeのプロセスはマネージャーでハングアップしたままです。と、感じています。

としてオペレーティングシステムからアンロードされることを「ハンギング」という。


期待される結果

お願い、この問題を解決してください。

 
barabashkakvn:

これを行うには、対象となる指標線のオフセット設定を知る必要があります。これはiAlligatorの テクニカル指標からの例です。

これはオフセットであり、将来のための指標の計算ではありません。

未来計算をしていますが、オフセットを使ってレンダリングしています。Expert Advisorから-1バーを計算するにはどうしたらよいですか?

必要な人がいれば、CopyBuffer(Handle_original,0,-2,10,Data_Ind ) を使ってください。

 
dentraf:
その通り、未来で計算しているのですが、オフセットを引くには、Expert Advisorから-1バーを読み込むにはどうすればいいのでしょうか?
1 バーの見積もりはありません。オフセットとは:存在するバー(例:バー番号2)に対して計算し、この計算値をバー2からオフセットを引いた値にプロットする。つまり、オフセットが5の場合、バー2で計算された値がバー"-3 "に描画されます。