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

 
fxsaber:

クローム

FireFoxはまだ上部に更新されたテーマがあります

スマートフォンに搭載されていたブラウザーをお試しください。

 
STARIJ:
FireFoxの場合、まだトップでテーマを更新しています。

そして、左の青いもの

Chromeでも同じです。このブルー/グレーのアイコンを自動的に表示させることができないんです。そして、未読のトピックの太字が印象的で、それについて書いたりもしています。

 
また、MQがMQLにフレンドオーバーを追加する計画についてご存知の方はいらっしゃいますか?惜しいことをしましたね。
 

AcePrime-Demoのアカウントで面白い事例がありました。

Expert Advisorを起動します。

// Советник возвращает полностью сформированные торговые запросы (включая ручные)
#define  TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define  TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) + 
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) + 
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

string ToString( const MqlTradeResult &Result )
{
  return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
         TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +
         TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +
         TOSTRING(Result.retcode_external));
}

void OnTradeTransaction(   const MqlTradeTransaction&, const MqlTradeRequest& Request, const MqlTradeResult& Result )
{
  if (Request.action)
  {
    Print(ToString(Request));
    Print(ToString(Result));    
  }
}

そして、任意のボ・シンボル(バイナリーオプション)のポジションを建てようと します。端末のログでは、次のようになります。

'3182780': market sell 1.00 XAUUSDbo
'3182780': failed market sell 1.00 XAUUSDbo [Invalid data]

Expert Advisorのログでは、次のようになります。

Request.action = TRADE_ACTION_DEAL (1)
Request.magic = 0
Request.order = 0
Request.symbol = XAUUSDbo
Request.volume = 1.0
Request.price = 0.0
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 0
Request.type = ORDER_TYPE_SELL (1)
Request.type_filling = ORDER_FILLING_FOK (0)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment = 
Request.position = 0
Request.position_by = 0

Result.retcode = 4
Result.deal = 0
Result.order = 0
Result.volume = 0.0
Result.price = 0.0
Result.bid = 0.0
Result.ask = 0.0
Result.comment = 
Result.request_id = 9
Result.retcode_external = 0

確認したところ、OrderCheckはtrueを返しました。トレードセッションの開始などしかし、MT5は手動と自動の両方の要求について同じように警告を出し、retcode = 4を与えています。端末では問題ないと言っているのに、実際にやってみると何も起こらないというのは、なぜなのでしょうか?開かないということを要望なしに理解するにはどうしたらいいのでしょうか?そして、この4つ目のリターンコードは何でしょうか?

GetLastError() は以下を返します。

err_trade_send_failed

4756

取引要求の送信に失敗しました


すべて問題なく再現します。
 

こんにちは。

このようなコードはコンパイルできないはず(プライベートメンバーアクセスエラーが出るはず)だと思うのは私だけでしょうか?

class cA;
class cB;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cA
  {
   //====================
private:
   //====================
   //===============
   //===============
   cB               *B;
   //===============
   //===============
   void              testfunc(void){::Print(__FUNCSIG__);}
   //====================
public:
   //====================
   //===============
   //===============
   void              test(void)
     {
      ::Print(__FUNCSIG__);

      if(::CheckPointer(::GetPointer(this.B))==POINTER_INVALID)return;

      this.B.testfunc();   // Здесь идет вызов private метода объекта B, что вроде как не должно быть возможным
     }
   //===============
   //===============
   void              SetB(cB *const b){this.B=b;}
   //===============
   //===============
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cB  : public cA
  {

  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   cA A;
   cB B;

   A.SetB(&B);
   A.test();

//---
   return(INIT_SUCCEEDED);
  }

SDは大丈夫、そんなこともできるんだと...。

 
Andrey Barinov:

こんにちは。

このようなコードはコンパイルできないはず(プライベートメンバーアクセスエラーが出るはず)だと思うのは私だけでしょうか?

SDは大丈夫、そんなこともできるんだと...。

MQLのルールでは、あるクラスのインスタンスが、最初のインスタンスと同じクラスに属していれば、別のインスタンスのプライベートフィールドやメソッドに自由にアクセスすることができます。cBはcAから継承されているので、cBはcAであり、したがってcAは、それがどこで宣言されているかにかかわらず、cBインスタンスの任意のプライベートメソッドとフィールドにアクセスすることができます。

 
Vasiliy Sokolov:

MQLのルールでは、あるクラスのインスタンスが、最初のインスタンスと同じクラスに属していれば、別のインスタンスのプライベートフィールドやメソッドに自由にアクセスすることができます。cBはcAから継承されているので、cBはcAであり、したがってcAは、それがどこで宣言されていても、cBインスタンスの任意のプライベートメソッドとフィールドにアクセスすることができます。

ありがとうございます。ドキュメントでは見たことがないのですが。ご指摘いただけますか?
 
Andrey Barinov:
ありがとうございます。ドキュメントでは見たことがないのですが。ご指摘いただけますか?
ドキュメントには載っていない、言語特有の文書化されていない「機能」だからだ。とても不思議なことで、賛否両論ありますが、それでもそのようになったのです。
 
Andrey Barinov:
ありがとうございます。ドキュメントを見ても、この機能には出会っていない。ご指摘いただけますか?

これはC++でも 同様です(MQLはC++のイメージと似通った形で作られています)。よく言われるように、C++のプライバシーはオブジェクトレベルではなく、クラスレベルにあります。そうでなければ、例えば、すべてのプライベートフィールドに特別なゲッターメソッドを持たないコピーコンストラクタを作ることはできないでしょう。

 
Stanislav Korotky:

C++でも 同じです

この例をC++でコンパイルしてみましたか、それとも一般的な理論上の推論ですか?