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

 
fxsaber:

そこにCopyBuffer全体がINFされる。

スライディングカウントアルゴリズムでは、最初に2つのDBL_MAX 価格があるだけでバッファ全体がINFに なります。

dbl_max + dbl_max = infとする。

を選択すると、INFは計算から外れません

EMPTY_VALUEを 無視するようにすべてのインジケーターのコードを変更する必要があります。
 
A100:

スライディングカウントアルゴリズムでは、バッファ全体をINFに するために、最初に2つのDBL_MAX 価格だけが必要です。

dbl_max + dbl_max = infとする。

そして、INFはもはや計算から逃れ られない。

MAA期間以下の値で埋め尽くされるのはDBL_MAXであるため、この変形はかなり確率が高い。それから、リカレントアルゴリズムの平均値-MODE_SMAにバグがあります。

そうなんです!少し変更したら、うまくいきました

// Вычисляем Машку от Машки через хэндл самого себя
#property indicator_separate_window 
#property indicator_buffers 1 
#property indicator_plots   1 

#property  indicator_type1   DRAW_LINE 
#property  indicator_color1  clrRed 
#property  indicator_style1  STYLE_SOLID 
#property  indicator_width1  1 

input bool CustomData = false; // true - кастомный режим для iCustom
input int MAPeriod = 1 e1;      // Период МАшки

string GetMyName( void )
{
  const int Length = StringLen(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Indicators\\");
  const string Path = MQLInfoString(MQL_PROGRAM_PATH);
  
  return(StringSubstr(Path, Length, StringLen(Path) - Length - 4));
}

double Buffer[];
const bool Init = SetIndexBuffer(0, Buffer, INDICATOR_DATA);

const int handleMA = CustomData ? iMA(NULL, PERIOD_CURRENT, 100, 0, MODE_SMA, PRICE_OPEN) // от этой МАшки будет брать другую Машку, но не напрямую, а кастомно
                                : iMA(NULL, PERIOD_CURRENT, MAPeriod, 0, MODE_SMA, iCustom(_Symbol, PERIOD_CURRENT, GetMyName(), true));

int Replace( double &Array[], const double NewValue = 1 e3, const double PrevValue = EMPTY_VALUE )
{
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    if (Array[i] == PrevValue)
      Array[i] = NewValue;
      
  return(0);
}

int OnCalculate( const int rates_total,      // размер входных таймсерий 
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time 
                 const double& open[],       // Open 
                 const double& high[],       // High 
                 const double& low[],        // Low 
                 const double& close[],      // Close 
                 const long& tick_volume[],  // Tick Volume 
                 const long& volume[],       // Real Volume 
                 const int& spread[] )       // Spread 
{
  return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));
}

リカレントアルゴリズムiMAは、DBL_MAXが入力された場合を考慮していないことは確かである。バグです。


A100 さん、ありがとうございます。

 

添付ファイルをコンパイルしようとすると、MetaEditorがハングアップする

すぐにハングアップしない場合は、しばらく待つか、サマリーラインに移動してコンパイル時間を確認します

ファイル:
Test0.mq5  1 kb
 

マウスを乗せると注文/取引番号がポップアップ表示されるのはなぜですか?1000年前に頼んだのに、こんなに足りないの!?

 
fxsaber:


return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));

このような構成は避けるべきでしょう。オペランドの実行順序は、C++では規定されていないので、個々のコンパイラの判断に委ねられる。例外は && と || 演算子で、オペランドは常に左から右に実行されます。

 
Alexey Navoykov:

このような構成は避けるべきでしょう。C++ではオペランドの実行順序は規定されていないので、各コンパイラの判断に委ねられる。例外は && と || 演算子で、オペランドは常に左から右へ実行されます。

さて、MQLに登場!

 
fxsaber:

さて、MQLに入りました!

ドキュメントのどこにも、特定の順序について何も書いていない。だから、彼らはいつでも好きなように変更できるのです。

この問題を明らかにするために、すでに一度サービスデスクに連絡しました。

 

こんにちは。チャート上に表示されているインジケーターのリストと そのパラメーターを取得するために、どのような関数を使用することができるか教えてください。チャート上のインジケーターの数を返す関数しか見つかりませんでしたが

Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
  • www.metatrader5.com
У каждого графика можно посмотреть списки наложенных объектов: индикаторов, аналитических объектов и советников. Там же можно можно редактировать их свойства и удалять их с графика. Список индикаторов Индикаторы сгруппированы на наложенные на основное окно графика и на те, что открыты в отдельных окнах. Выберите индикатор и нажмите "Свойства...
 
Aleksandr Teleguz:

こんにちは。チャート上に表示されているインジケーターのリストと そのパラメーターを取得するために、どのような関数を使用することができるか教えてください。チャート内のインジケータの数を返す関数しか見つかりませんでしたが

IndicatorParameters(+IndicatorRelease)。

Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
  • www.mql5.com
//| Script program start function                                    |                          +                                    p,                                                                        parameters[p].integer_value,                                    parameters[p].double_value...
 
Alexey Navoykov:

ドキュメントのどこにも、特定の順序について何も書いていない。だから、彼らはいつでも好きなように変更できる。

そんなの気にしない。そこには書かれていないことがたくさんあるんです。

オフ・ザ・ヘッド

  • MT4/5で取引履歴の記録を時間でソートする。
  • グローバル/スタティック変数の 関数による初期化 機能 - 比較的最近登場した機能です。
  • プリプロセッサーディレクティブを1行で設定 - すぐに消されるけど。
  • オペランドを左から右へ実行する。
  • OrderSendは取引環境と99%同期しています。
  • ChartApplyTemplateは非同期です。
  • その他にも、文書化されていない微妙な部分がたくさんあるんです。そして、文書と現実が対応していないケースもある。しかも、これはバグではなく、単に言及されていないだけのレアバグです。

前例はキャスティングの不採用でしたが、そこには理由がありました。

だから、記載がないからといって使わないというのは、判断に疑問が残る。


このようなコードは、プログラマーに疑問を抱かせることはないと思います。

int Replace( double &Array[], int );

return(prev_calculated + Replace(Buffer, CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer)));

しかし、あまりいい出来ではありません。MyCopyBufferを書くことは意味がありますが、バグを回避するために必要であることを短いコードで示すのは醜いことです。だから、文書化されていないオペランドの実行優先度を使うのは、一時的な解決策であることを示すのにちょうどいいのです。