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

 
damirqa:

こんにちは、https://www.mql5.com/ru/articles/100 から MQL5 の勉強を始めました。コードを起動したところ、エラー4756が発生しました。 ドキュメントに目を通しましたが、これ以上はダメでした。まずは簡単なもの(Alert/Print...)から始めてみようと思ったのです。最も重要な機能のひとつがOrderSendです。OrderSendの使い方について、フォーラム/ドキュメントを検索し始めました。この記事https://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions、 買いポジションを開くためのコードが見つかりました。エラー4756とretcode10030が出ました。10030 - それはOrderSendプロパティであることは理解しましたが、このプロパティがどのように使用されるべきか(他の人のコードを見ました)、そして主に何のために使用されるのかが理解できていません。そして、https://www.mql5.com/ru/docs/trading/ordersend を開き、 コードをコピーして実行したら、うまくいきました。
しかし、なぜエラー4756が出るのか、どうすれば10030と同じように解消できるのか、まだ理解できていません。

の間のコードを見てみました。

とこちらも

私にはほとんど同じに見えますが、これらのエラーはどこに出ているのでしょうか(4756と10030)。指をさして説明してください。

構造体の1フィールドが未入力である。そして、十分とは言えないが、そんなエラーはない。

インスタントエグゼキューション

即時約定モード(ストリーミング価格で取引するモード)でポジションを建てるための取引注文です。9項目は必須項目です。

  • アクション
  • 記号
  • ボリューム
  • 価格
  • スラム
  • ティーピー
  • 偏差値
  • タイプ
  • タイプフィリング

また、マジックやコメント欄の指定も可能です。

マーケットエグゼキューション

成行執行モードでポジションを建てるための取引注文。5つのフィールドの指定が必要です。

  • アクション
  • 記号
  • ボリューム
  • タイプ
  • タイプフィリング

また、マジックやコメント欄の指定も可能です。


 

what update has arrived, 1736, what's in it, where can I read it?

 

どのインジケータがチャートに描画されているかをプログラムで決定する機会を提供することを提案します。

仮にトレーダーが独自のインディケータを始めたとすると、計算に使うバッファの数と、チャート上にインディケータを 描くために使うバッファの数が分かりません。

カスタムインディケーターへの対応

intChartIndicatorGet()
longchart_id,// チャート識別子
intsub_window// サブウィンドウの番号
const string indicator_shortname // 短いインジケータ名
);


また、描画バッファの配列を要求することもできます

intChartIndicatorGet()
longchart_id,// チャート識別子
intsub_window//ウインドウ番号
const string indicator_shortname // 短いインジケータ名

int & IndicatorVisualBuffer[] // 描画バッファの番号...);


これにより、チャートにインストールされている未知のインジケーターと連携できる可能性が広がります...

 
Vladimir Pastushak:

どのインジケータがチャートに描画されているかをプログラムで決定する機会を提供することを提案します。

トレーダーがインジケータを始めたとすると、計算に使われるバッファの数と、チャート上にインジケータを 描画するために使われるバッファの数が分かりません。

による指標への対応

intChartIndicatorGet()
longchart_id,// チャートID
intsub_window// サブウィンドウの番号
const string indicator_shortname // 短いインジケータ名
);


また、描画バッファの配列を要求することもできます

intChartIndicatorGet()
longchart_id,// チャート識別子
intsub_window//ウインドウ番号
const string indicator_shortname // 短いインジケータ名

int & IndicatorVisualBuffer[] // 描画バッファの番号...);


これにより、チャートにインストールされている未知のインジケーターと連携する可能性が高まります...

何を返してくれるの?

int  ChartIndicatorGet(
   long           chart_id,              // идентификатор графика
   int            sub_window             // номер подокна
   const string   indicator_shortname    // короткое имя индикатора
   );

そして、それを追加することに何の意味があるのでしょうか?入力パラメータを追加して、その応答として同じインジケータハンドルを受け取りたい...。

また、差し支えなければ、どのような目的で必要なのでしょうか?私は皮肉を言っているのではありません。やはり、提案されたものは、その必要性について説得力のある議論をすべきと私は思います。

 
Alexey Viktorov:

何を返すか

とか、追加して何かいいことあるのか?入力パラメータを追加して、その応答として同じインジケータ・ハンドルを取得することを提案する...

そして、もしそれが困難でないとしたら、そのような必然性は何のために現れたのでしょうか。皮肉を込めた問いかけがない。やはり、何かを提供するのであれば、その必要性を説得的に説明することが必要だと思うのです。


ユーザーは任意のインジケータを置く。

Expert Advisorは自動的にそれを見つけ、バッファデータを使ってシグナルを受信します。


あとはiCustomを使って、パラメータリストを書けばいいのですが、ここでバッファの問題が......。

Copyでバッファ量をカウントすることは可能ですが、どのバッファなのかを把握することは不可能です ...

 
Vladimir Pastushak:

ユーザーは任意のインジケータを配置する。

Expert Advisorは自動的にそれを見つけ、バッファーのデータを使ってシグナルを取得します。


あとはiCustomを使って、パラメータのリストを書けばいいのですが、ここでバッファの問題が......。

プログラムでCopyを使ってバッファ量をカウントすることは可能ですが、どれが描画しているのか把握できません ...

なぜ不可能なのか?iCustom()で バッファINDICATOR_CALCULATIONSを取り出すことは可能ですか?

質問は面白いが、それを議論するのはこのスレッドではない。個人的には、それが何らかの形でプログラマーの仕事を改善したり、簡略化したりすることができるのか、疑問を持っています。指標が違いすぎるし、適用条件も違いすぎる。そうすると、グラフィカルなプロットの種類を 決められるようにしてほしいとか、社内の要望が雪だるま式に増えていくんです。

 
Alexey Viktorov:

なぜできないのでしょうか?iCustom()でINDICATOR_CALCULATIONS バッファにアクセスできますか?

質問は面白いが、それを議論するのはこのスレッドではない。個人的には、それが何らかの形でプログラマーの仕事を改善したり、円滑にしたりすることができるのか、疑問を持っています。指標が違いすぎるし、適用する条件も違いすぎる。そうすると、グラフィカルなプロットの種類を 決められるようにしてほしいとか、社内の要望が雪だるま式に増えていくんです。


理論的には、インジケータにデフォルトで書き込まれているもの(プログラマーのコードのことではありません)は、外部から利用できるはずです.バッファの数、プロットの種類、色、その他の標準的な...

 

これが、私が遭遇した問題です。

ChartIDを1000か10000で割った余りをマジックとして使うことにしました。

しかし、なぜかChartID()を変えると、割り算の残りが突然同じになります。質問:なぜですか?

スクリプトを確認する

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d = 100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
}/*******************************************************************/

結果

2018.01.15 13:01:45.881 Script 00 EURUSD,M15: removed
2018.01.15 13:01:45.881 00 EURUSD,M15: uninit reason 0
2018.01.15 13:01:45.881 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:45.881 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 13:01:45.881 00 EURUSD,M15: initialized
2018.01.15 13:01:45.871 Script Test\00 EURUSD,M15: loaded successfully
2018.01.15 13:01:40.361 Script 00 EURUSD,H1: removed
2018.01.15 13:01:40.361 00 EURUSD,H1: uninit reason 0
2018.01.15 13:01:40.361 00 EURUSD,H1: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:40.361 00 EURUSD,H1: ChartID - 131472503841474908
2018.01.15 13:01:40.361 00 EURUSD,H1: initialized
2018.01.15 13:01:40.351 Script Test\00 EURUSD,H1: loaded successfully

割り算の残りは同じはずなので、それぞれ74907と74908が表示されると予想しました。


この質問に対する回答も待っています。

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

バグ、バグ、質問

アレクセイ・ビクトロフ さん 2018.01.09 14:21

MT5テスターでは、「入力フィールド」オブジェクトOBJ_EDITは、その中にある値を編集することを許可して いません。これは設計上そうなっているのか、それともバグなのか?

ターミナルとMT4テスターでは編集可能ですが、MT5テスターでは編集しようとせず、オブジェクト作成 時にプログラムで入力した値が全く消えてしまいます。


 
Alexey Viktorov:

しかし、なぜか違うChartID()でいきなり同じ残差を割り算で出してしまう。質問:なぜですか?

入力fmodが2倍になっているため。Doubleは膨大な数の整数を格納することができません。例えば、こんなケースです。

Print(DoubleToString((double)131472503841474907, 0)); // 131472503841474912

これをやってください。

long fmod( const long Value, const long Value2 )
{
  return(Value % Value2);
}


floatを例にとると、doubleの特殊性がすぐに理解できます。

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  for (int i = 0; i < INT_MAX; i++)
    if ((int)(float)i != i)
    {
      PRINT(i);
      PRINT((float)i);
      PRINT((double)i);
      
      break;
    }
}


結果

i = 16777217
(float)i = 16777216.0
(double)i = 16777217.0


SZYダブルはインレンジ全体の情報を失わない、ロングではそうではない。

 
fxsaber:

入力のfmodがdoubleであるため。Doubleは膨大な数の整数を格納することができません。例えば、あなたの場合。

これをやってください。

もちろん、このサンプルはこれから確認するのですが、こんなチェックコードもありました。

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
  printf("LONG_MAX = %I64d",LONG_MAX);
  printf("DBL_MAX = %.16e",DBL_MAX);
  Print("DBL_MAX-LONG_MAX = ", DBL_MAX-LONG_MAX);
}/*******************************************************************/

その結果

2018.01.15 14:07:20.440 Script 00 EURUSD,M15: removed
2018.01.15 14:07:20.440 00 EURUSD,M15: uninit reason 0
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX-LONG_MAX = 17976931348623157081452742373170435679807 0567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX = 1.7976931348623157 e+308
2018.01.15 14:07:20.440 00 EURUSD,M15: LONG_MAX = 9223372036854775807
2018.01.15 14:07:20.440 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:07:20.440 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:07:20.440 00 EURUSD,M15: initialized
2018.01.15 14:07:20.430 Script Test\00 EURUSD,M15: loaded successfully

値の切り捨てが行われてはならないことを示す。


しかし、ここで私はこのバリアントを確認し、提案されたものを少し変更しました。

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", (long)fmod(ChartID(), d));
  Print("ChartID() % ", d, " = ", ChartID() % d);
}/*******************************************************************/

で、期待通りのバリアントが得られました。

2018.01.15 14:17:51.301 Script 00 EURUSD,M15: removed
2018.01.15 14:17:51.301 00 EURUSD,M15: uninit reason 0
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID() % 100000 = 74907
2018.01.15 14:17:51.301 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:17:51.301 00 EURUSD,M15: initialized
2018.01.15 14:17:51.291 Script Test\00 EURUSD,M15: loaded successfully

もうひとつの疑問が浮かびます。

MathMod および fmod が、2つの数値の除算後の 実数余りを 返す場合。そして、ドキュメントによると

分の余り=時間%60


なぜ違いがあるのでしょうか?