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

 
TheXpert:
だから工場を作れ。そうすれば、問題は解決する。

今のままでも十分作業しやすいんですけどね。オブジェクトはかなり硬い構造になっています。各メンバーの仮想Loadメソッドを呼び出すと、メンバーも同じようにLoadする。各データブロック(オブジェクト)の先頭には、(ロード時の制御のために)タイプのIDが書き込まれます。それだけなんです。自作自演の工場のようなものです。

そのため、ファクトリーと型登録テーブルが必要になります。なかなか解決しない中、ペーパークリップや粘着テープで何とかしています。:)

 

ガンのファン。

2つ目のアンカー ポイントが未来にある場合、角度は変わります。

また、このオブジェクトはコピー(Ctrlキーを押しながら)する際に問題があります。コピーされず、オリジナルを引きずってしまい、3回目、5回目とコピーにかかることが非常に多い。

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов - Документация по MQL5
 
MetaDriver:

OK、素晴らしい。

Slavaさん、(一般的な開発のために)なぜコンストラクタの最初(祖先の初期化の後)に仮想メソッドテーブルを初期化できないのか聞いていいですか?

もう言ったでしょ?コンストラクタは階層構造で動作します。祖先の構築中は、子孫に関する情報はありません。
 
stringo:
前にも言ったけどコンストラクタは、階層を作成します。祖先が構築されている間は、子孫に関する情報はない。

もう読みましたよ。そして、それを完璧に理解したのです。そして、読んだ内容を理解した上で質問しました。 写真付きで分かりやすく説明します。

class MySecond: MyFirst
{
  void  MySecond(MyArg arg): 
    MyFirst(arg)
   { // Можно код инициализации VMT добавлять здесь. Тогда не будет проблем с виртуальными вызовами.
     ...............
     MyVirtualFunc();
      ...........
     return;
   } // Сейчас код инициализации VMT добавляется здесь.

};

すべて理解する、その ほうが難しい、いろいろと微妙なところがある。すべての暗黙の初期化を最後に書く方が、はるかにシンプルで普遍的です(あなたにとって)。そして、「そんなことをする人はいない」「C++では慣習的に行われていない」等と事前に信じ込んでいるくらいです。

しかし、私たち(ユーザー)にとっては、MySecond()コンストラクタをMyFirstではなくMySecondクラスの領域と考える方がよりシンプルで普遍的、合理的、論理的なことなのです。コンストラクタで仮想関数を 動作させることと、コンストラクタのコードに関する重要かつ深刻な制限をドキュメントで数カ所表現すること、にもかかわらず、サービスデスクやフォーラムに「コンストラクタの仮想バグについて」初心者から重要かつ深刻なメッセージを定期的に受け取ること、どちらが簡単か考えてみましょう。 これも深刻な要因です。初心者はすぐにたくさん期待されますから......。

 
struct SDaylyRange {double min, max, open, close;};
void OnStart()
  {
//---
   SDaylyRange tmp, tmp2;
   tmp = 2+3 ? tmp : tmp2;
   if (2+3) tmp = tmp; else tmp = tmp2;
  }

構造体を含むテンソル演算子はCode Generation Errorになる(ifに置き換えるとうまくいくが)

 

定期的にエラー4401が発生する

err_history_not_found

以下のインジケーターコード

datetime prevTime[22];
MqlRates _Rates[];

bool IsNewBar(ENUM_TIMEFRAMES period) {
   datetime currentTime[1];
   CopyTime(Symbol(), period, 0, 1, currentTime);
   int _;
   switch (period) {
      case PERIOD_M1  : _= 1;
         break;
      case PERIOD_M2  : _= 2;
         break;
      case PERIOD_M3  : _= 3;
         break;
      case PERIOD_M4  : _= 4;
         break;
      case PERIOD_M5  : _= 5;
         break;
      case PERIOD_M6  : _= 6;
         break;
      case PERIOD_M10 : _= 7;
         break;
      case PERIOD_M12 : _= 8;
         break;
      case PERIOD_M15 : _= 9;
         break;
      case PERIOD_M20 : _= 10;
         break;
      case PERIOD_M30 : _= 11;
         break;
      case PERIOD_H1  : _= 12;
         break;
      case PERIOD_H2  : _= 13;
         break;
      case PERIOD_H3  : _= 14;
         break;
      case PERIOD_H4  : _= 15;
         break;
      case PERIOD_H6  : _= 16;
         break;
      case PERIOD_H8  : _= 17;
         break;
      case PERIOD_H12 : _= 18;
         break;
      case PERIOD_D1  : _= 19;
         break;
      case PERIOD_W1  : _= 20;
         break;
      case PERIOD_MN1 : _= 21;
         break;  
      default         : _= 0;    
   } 
   if(currentTime[0]== prevTime[_]) return(false);
   else {
      prevTime[_] = currentTime[0];
      return(true);
   }
}

int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| 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[]) 
if (IsNewBar(_Period)) {
    int err = CopyRates(Symbol(), PERIOD_D1, 0, 2, _Rates);
   Print("Count:", err);
   if (err < 1) {
       Print("ERROR:", GetLastError());
       Print("__Symbol:", Symbol());
       return(rates_total);
   }

}
return(rates_total); 
}

は、(D1でない場合は)起動時に即座にエラーを出します。というか、ターミナルを起動 し、チャートを開いた後に一度、インジケータを付けるとエラーになります。端末が閉じられていない場合は、起動時にこのようなエラーは発生しません。

しかし、しばらくすると(数時間、私は2時間で十分でした)、すでに開いているチャートでエラーが発生することがわかります。(m30で走らせました)

 

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

MQL5コンパイラで、せめて警告を出すように変更できないでしょうか?

このようなコード上のエラーに対して

if(Flag_Exitl=true) {break;}


この比較条件は正しくありません(==であるべきです)ので、常にbreakになります。

この状況をコンパイラでどのように対処すれば(もし可能であれば)、コードを書くときにぶつかることが少なくなるでしょうか?

(うまくいかないと思いきや、ifで代入と比較を分けてから質問を削除しているようです)。

 
Fia:

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

MQL5コンパイラを変更して、少なくとも警告を出すようにすることは可能でしょうか?

このようなコード上のエラーに対して

if(Flag_Exitl=true) {break;}


比較条件が正しくない(==であるべき)ため、常にbreakとなる。

この状況をコンパイラでどのように対処すれば(可能であれば)、コードを書くときにぶつかることが少なくなるのでしょうか?

(うまくいかないと思ったので、ifで代入と比較を分けるかもしれないので、質問は削除します)。

条件の書き方が間違っている可能性がありますが、MQL5では許容されています。

Flag_Exitl 変数を true に設定し、Flag_Exitl が true であれば、break するようにします。

一連の動作は、まさにこんな感じです。

 

画面に表示する必要のないバッファの扱いがよくわからない。

なぜか下のコードによると

1) 何も描かない

2) 両方のバッファを Label1 と呼ぶ

正しいデータが含まれていても

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   2

//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_color1  clrRed, clrWhite
#property indicator_type1   DRAW_COLOR_LINE

//--- plot Label2
#property indicator_label2  "Label2"
#property indicator_color2  clrRed, clrGreen
#property indicator_type2   DRAW_COLOR_LINE

//--- indicator buffers
double         L1_1[];
double         L2_1[];
double         Colors_1[];

//--- indicator buffers
double         L1_2[];
double         L2_2[];
double         Colors_2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0,L1_1,INDICATOR_DATA);
   SetIndexBuffer(1,L1_2,INDICATOR_DATA);
   SetIndexBuffer(2, Colors_1,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3, Colors_2,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4, L2_1, INDICATOR_CALCULATIONS);
   SetIndexBuffer(5, L2_2, INDICATOR_CALCULATIONS);
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
{
   for (int i = 0; i < rates_total; i++)
   {
      L1_1[i] = i;
      L1_2[i] = i + 1;
   }
   return(rates_total);
}
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 

こんにちは。間違った方向に書いているかもしれませんが、正しい方向を示していただければと思います。mt5のWeb APIに関する質問はどこにすればいいのでしょうか?)

念のため、状況を説明しておこうと思います。МТマネージャーとPHPによるWEB APIを持っているのですが...。ロシア語の請求書が作成され、データが送信され、МТマネージャにも表示されるのですが、問題があります。МТマネージャのデータはユニコードで表示されます(「044404300c0438043b0438044f 」 - ユーザー名がこのように見えます)。データ送信時はエンコードもデコードもされず、MTクライアントからは全て正常に作成されるのですが...。少なくとも、どちらを見ればいいのか?(