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

 
ME開発者にCTRL+SHIFT+Fを押して "MQL5Info "と入力してもらうようお願いします。出来上がったSBファイルに見られるルーディメンツを修正する。
 
プロジェクト コードから問題を切り出すのに2時間かかりました。
#define  PRINT(x) Print(#x, ":", string(x))

template<typename DATA_TYPE>
struct Wrapper{
   uchar type;
   DATA_TYPE data;
   
   template<typename T>
   void operator=(T value){                  // при замене данной строки на "void operator=(T &value){" происходит перезапись оператора присвоения в классе наследнике B (код не компилируется).
      this.data = value;   
   };
   
   void operator=(DATA_TYPE &_data){
      this.data = _data;   
   };
};

struct A{
   string data;
   
   void operator=(string value){
      data = value;
   };
};

struct B : Wrapper<A>{};


void OnStart(){  
  B b;
  
  string str_value;
  b = str_value;
  
  A a;
  b = a;
  
  B b1;
  b = b1;
}



しかし、機能を拡張して、クラスAの(string)のような単純な型だけでなく、構造体のサポートも追加しようとすると、 ベースクラスのテンプレート代入演算子が子孫クラスのデフォルト代入演算子を上書きし始め、すべての機能を殺してしまうことが判明しました。他の演算子は "operator*="などの回避策がありますが、ごちゃごちゃしていますね。開発者各位 デフォルトの代入演算子(コピーコンストラクタ)の強制コード生成を指定できるように してください。






class_name & class_name :: operator= ( const class_name & ) = default;  
class_name & class_name :: operator= ( const class_name & ) = delete;   
 

私のEAで標準的な指標、例えばiMAを使用する場合、教えてください。

可視化ウィンドウに正しく表示するために、描画スタイルを 設定するにはどうしたらよいですか?

 
Игорь Евдокимов:

私のEAで標準的な指標、例えばiMAを使用する場合、教えてください。

可視化ウィンドウに正しく表示されるように、描画スタイルを 設定するにはどうしたらよいですか?

こんな感じ:カスタム移動平均の入力色

 
知識のある人、ヒントがある!実物をベースにしたカスタムシンボルが あるんです。このシンボルのチャートからトレードができるようにするにはどうしたらいいですか?それとも、MT5にはそのような機能はないのでしょうか?
 
Vladimir Karputov:

こんな感じ:カスタム移動平均の入力色

実は、インジケータは自分で書かなければならないのです。標準指標を書き換えることは解決策にはならない。

問題は、標準のインジケーターのスタイルをどう設定するかということでした。

他に方法はないのでしょうか?

 
最近のバージョンのMTでは、文字列処理のパラダイムシフトの一環として、NULL終端文字列の使用を放棄していると見られる。
しかし、StringSetLength関数の動作には、いくつかの疑問が残ります。

StringSetLengthでは、文字列の長 さを切り詰めることはできても、増やすことはできませんが、これはどういうわけか意味をなしません。
これは意図した動作なのでしょうか?

#define  PRINT(x) Print(#x, ":", string(x))

void OnStart(){  
  string str = "123456789";
  PRINT(str);
  PRINT(StringLen(str));
  
  
  PRINT(StringSetLength(str, StringLen(str)-1));
  PRINT(str);
  PRINT(StringLen(str));
  
  PRINT(StringSetLength(str, StringLen(str)+2));
  PRINT(str);
  PRINT(StringLen(str));
}

結果
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      str:123456789
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringLen(str):9
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringSetLength(str,StringLen(str)-1):true
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      str:12345678
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringLen(str):8
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringSetLength(str,StringLen(str)+2):false
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      str:12345678
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringLen(str):8
 
新しい」文字が0x0000として初期化 される「本格的な」StringSetLengthを 実装するくらいなら、ユーザーは自分を撃ったほうがましだ。

#define  PRINT(x) Print(#x, ":", string(x))

void OnStart(){  
  string str = "123\x0000\x0000\x0000\x0000456789";
  PRINT(str);
  PRINT(StringLen(str));                                                  // StringLen(str):13      StringLen поддерживает работу с 0х0000 short value
  
  PRINT(StringSetLength_using_StringInit(str, 100));                      // false                  StringInit           не поддерживает работу с 0х0000 short value
  PRINT(StringSetLength_using_ShortArrayToString(str, 100));              // false                  ShortArrayToString   не поддерживает работу с 0х0000 short value
  PRINT(StringSetLength_using_StringInit_with_StringFill(str, 100));      // false                  StringFill           не поддерживает работу с 0х0000 short value
}


bool StringSetLength_using_StringInit(string &string_var, int new_length){
   bool result = false;

   int prev_length = StringLen(string_var);
   if(new_length == prev_length){
      result = true;
      return result;
   }
   
   string data = string_var;   
   if(new_length < prev_length){
      StringSetLength(data, new_length);
   }else{
      string string_tail;
      StringInit(string_tail, new_length - prev_length, 0x0000);
      data += string_tail;
   }
   
   if(StringLen(data) == new_length){
      string_var = data;
      result = true;
   }
   return result;
}

bool StringSetLength_using_ShortArrayToString(string &string_var, int new_length){
   bool result = false;

   int prev_length = StringLen(string_var);
   if(new_length == prev_length){
      result = true;
      return result;
   }
   
   string data = string_var;   
   if(new_length < prev_length){
      StringSetLength(data, new_length);
   }else{    
      short data_array[];
      StringToShortArray(data, data_array);
      ArrayResize(data_array, new_length);
      ArrayFill(data_array, prev_length, new_length - prev_length, 0x0000);
      data = ShortArrayToString(data_array, 0, new_length);
   }
   
   if(StringLen(data) == new_length){
      string_var = data;
      result = true;
   }
   return result;
}

bool StringSetLength_using_StringInit_with_StringFill(string &string_var, int new_length){
   bool result = false;

   int prev_length = StringLen(string_var);
   if(new_length == prev_length){
      result = true;
      return result;
   }
   
   string data = string_var;   
   if(new_length < prev_length){
      StringSetLength(data, new_length);
   }else{    
      string string_tail;
      StringInit(string_tail, new_length - prev_length, 0x1111);
      StringFill(string_tail, 0x0000);
      data += string_tail;
   }
   
   if(StringLen(data) == new_length){
      string_var = data;
      result = true;
   }
   return result;
}
 
Sergey Dzyublik:
最近のバージョンのMTでは、文字列処理のパラダイムシフトの一環として、NULL終端文字列の使用を拒否しているのが見受けられます。

このアイデアについて詳しく教えてください。

 
rsrozhkov:
知識のある方、ヒントを下さい!実際のシンボルを元に作成したカスタムシンボルがあるのですが。このシンボルのチャートからトレードができるようにするにはどうしたらいいですか?それとも、MT5にはそのような機能はないのでしょうか?

答えは自ずと決まってくる。カスタムシンボルは、実シンボルから何らかの変換を行うことで得られる。誰かが(EA、スクリプト、または手動で)逆変換を行い、実際のシンボルの注文を送信する必要があります。