初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 854

 
CTrade::PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX) をいじっていて、内部が整理されていないことに気がつきました。boolとResultRetcode()という2つのリターンコードが全てです。RetCodeは常に内部で0になってからfalseを返すわけではないので、PositionCloseがfalseを返した場合、RetCodeはTRADE_RETCODE_DONEを返す可能性があります。この2つの戻り値を同期させることができれば、開発者にとってありがたいことです。
 
. ... Rick D. ... .:
CTrade::PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX) をいじっていて、内部が整理されていないことに気がつきました。boolとResultRetcode()という2つのリターンコードが全てです。RetCodeは常に内部で0になってからfalseを返すわけではないので、PositionCloseがfalseを返した場合、RetCodeはTRADE_RETCODE_DONEを返す可能性があります。この2つの戻り値を同期させることができれば、開発者にとってありがたいことです。

コード+サンプル+ログ。

 
一つ変なバグを発見しました。私だけのものなのかもしれません。

COrderInfo::OrderType()は常に0を返す。

それを確認するために、手動で任意の保留中の注文(BuyStop、SellStop、...)を発注することができます。
を入力し、それをスクリプトに入力します。
#include <Trade\Trade.mqh>

COrderInfo m_order;

void OnStart()
{
  ulong ticket = 250262937; //здесь ваш тикет
  
  if (!m_order.Select(ticket))
  {
    PrintFormat("COrderInfo::Select(#%I64u) failed", ticket);
    return;
  }
  
  PrintFormat("OrderType= %d", m_order.Type());
}

仮想関数表で何かあるかも?デバッグでは、virtual int CObject::Type()にしかたどり着けません。

PS.もう、自分でもわかっているんです。COrderInfo には、Type() と OrderType() という 2 つの類似したメソッドがあります。

 
Vladimir Karputov:

コード+サンプル+ログ。

どんな状況か見てみましょう。

#include <Trade\Trade.mqh>

CTrade m_trade;

void OnStart()
{ 
  int LErr;
  bool bRC;
  double price;

  ResetLastError();
  
  price = 0.0;
  bRC = m_trade.Buy(0.1, "EURUSD", price, 0.0, 0.0);

  LErr = GetLastError();

  PrintFormat("! Buy:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)",
    ticket,
    (string)bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
  //В m_trade.ResultRetcode() теперь TRADE_RETCODE_DONE
  
  //---

  ulong ticket = 1; //Позиции с таким тикетом нет
  
  ResetLastError();

  bRC = m_trade.PositionClose(ticket);  

  LErr = GetLastError();
  
  PrintFormat("! Close #%I64u:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)",
    ticket,
    (string)bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
  //В m_trade.ResultRetcode() все еще TRADE_RETCODE_DONE
}

CTradeには、新しい操作の前にそれらをリセットするSetResultRetcodeとSetResultCommentのメソッドが見当たりません。

私のクラスを継承し、そこに1つのメソッドを追加する必要があります。


class CTradeEx : public CTrade
{
public:
  void SetResult(MqlTradeResult& result)
  {
    m_result = result;
  }  
};
 
. ... Rick D. ... .:

どんな状況か見てみましょう。

CTradeには、新しい操作の前にそれらをリセットするSetResultRetcodeとSetResultCommentのメソッドが見当たりません。

何のために?まったくもって不要な機能。

第一に、あなたは空中で撃つ - 最初に確認することなく、取引注文を送信する - 操作が返されたものを確認せずに。PositionCloseは bool型です。

次に、ポジションクローズチェーンについてですが、ポジションが見つからない(指定したチケットで選択できない)場合は、"false "を返します。

//+------------------------------------------------------------------+
//| Close specified opened position                                  |
//+------------------------------------------------------------------+
bool CTrade::PositionClose(const ulong ticket,const ulong deviation)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean

このとき、構造体はどこにもクリアされません。なぜなら、それは意味がないからです。

 
Vladimir Karputov:

何が言いたいの?まったくもって不要な機能。

第一に、あなたは空中で撃つ - 最初に確認することなく、取引注文を送信する - 操作が返されたものを確認せずに。PositionCloseは bool型です。

次に、ポジションクローズチェーンについてですが、ポジションが見つからない(指定したチケットで選択できない)場合は、"false "を返します。

同時に、構造体はどこにもクリアされない。結局のところ、以前は位置を選択できなかったのだから、構造体には何の情報もないのである。

1) ResetLastError()は絶対に不要な関数と言った方がいいかもしれません。

2)返送された結果に対するチェックがある。例えて言えば、あるWinAPI関数を呼び出して、それがエラーを返し、GetLastError() (ResultRetcodeのアナログ)が任意の最後のコードを返すと想像してください。

もし私がPositionCloseを呼び出す前に何らかのチェックを加えても(私はそうします)、RetCodeが変化しない場合、他の呼び出しの前の他のチェックを上書きすることはありません。

私のExpert Advisorはログに情報を書き込みます。必要なのは、ある呼び出しがfalseを返した場合に、ResultRetcodeとResultCommentをログにきちんと書き込むことだけです。

 
. ... Rick D. ... .:

1) ResetLastError()は全く不要と言った方が良いかもしれません。

2)リターン結果のチェックがある。例えて言えば、あるWinAPI関数を呼び出して、それがエラーを返し、GetLastError() (ResultRetcodeのアナログ)が任意の最後のコードを返すと想像してください。

PositionCloseを呼び出す前に何らかのチェックを加えても(そうするつもりです)、RetCodeが変化しない場合には、他の呼び出し前のチェックを上書きしません。

私のExpert Advisorはログに情報を書き込みます。必要なのは、あるコールがfalseを返したときに、ログにResultRetcodeとResultCommentをまともに書き込むことだけです。

ResultRetcode() メソッドを呼び出すことで、取引要求の実行結果(取引サーバーのリターンコード)を確認する必要が ある場合、CTradeクラスのヘルプをお読みください

 
Vladimir Karputov:

ResultRetcode() メソッドを呼び出して、取引要求の実行結果(取引サーバーのリターンコード)を確認する タイミングは、CTradeクラスのヘルプをお読みください

と断言してもいい。

1) PositionCloseがfalseを返した場合、Retcodeは満たされないのですか?

2) PositionCloseがtrueを返した場合、Retcodeは常に入力されるのか?

 
Vladimir Karputov:

注文→取引→ポジションポジションから始値を 取る。

このOrder -> Trade -> Positionの様子を画像で見せてもらえますか、トレードが書かれている場所より下にあるので、そこにコピーすることはできません


 
Seric29:

このOrder→trade→positionの様子を画像で見せてもらえないでしょうか、トレードが書き込まれるのは一番下なのでコピーできないのです。


質問を書き直すか、句読点をつけるか、いっそのこと、何を、どこで、誰が、と絵に書き足してください。そうでなければ、見慣れた文字が見えても、意味や言いたいことが理解できないことになります。

理由: