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

 

皆さん、グッドタイム

CTradeクラスのResultDeal()関数について質問です。

つまり、Strategy Testerでは この関数は問題なくトレードチケットを返しますが、ResultRetcode()関数が常に「TRADE_RETCODE_DONE」を返すにもかかわらず、Chart 上でEAを投げると常に「0」を返してしまうのです。

コード例

/////////////////////////////////////////////////////////////////////
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
/////////////////////////////////////////////////////////////////////
CTrade Trade;
CSymbolInfo SymbolInfo;

uint Retcode;
ulong TicketDeal;
bool first_calc;
bool second_calc;
bool third_calc;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   TicketDeal = 9999999;
   
   first_calc = true;
   second_calc = false;
   third_calc = false;   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   if(first_calc)
   {
      first_calc = false;
      second_calc = true;
      
      SymbolInfo.Name(Symbol());
      SymbolInfo.RefreshRates();
      Trade.Buy(1.0, Symbol(), SymbolInfo.Ask(), 0.0, 0.0, "BUY");
//---
      Retcode = Trade.ResultRetcode();
      if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
      
      Print("first_calc ////////////////////////////////////");
      Print("PositionsTotal(): ", PositionsTotal());
      Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
   }
   else
   {
      if(second_calc)
      {
         second_calc = false;
         third_calc = true;
//---
         Retcode = Trade.ResultRetcode();
         if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
         
         Print("second_calc ////////////////////////////////////");
         Print("PositionsTotal(): ", PositionsTotal());
         Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
      }
      else
      {
         if(third_calc)
         {
            third_calc = false;
//---
            Retcode = Trade.ResultRetcode();
            if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
            
            Print("third_calc ////////////////////////////////////");
            Print("PositionsTotal(): ", PositionsTotal());
            Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
         }
         else
         {
            //Print("TicketDeal: ", Trade.ResultDeal());
         }
      }
   }   
}
//+------------------------------------------------------------------+

テスターでの実行ログ。

2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   first_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   second_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   third_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   Retcode: 10009; TicketDeal: 2

チャート上の実行ログ。

2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) first_calc ////////////////////////////////////
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) PositionsTotal(): 0
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.026 _TestSelect (EURUSD,M1) second_calc ////////////////////////////////////
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) third_calc ////////////////////////////////////
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0


私は何を間違えているのだろう?トレードチケットを リアルタイムで 入手するにはどうすればよいですか?

そして2つ目の質問(あまり重要ではありませんが)、なぜ取引実行直後にPositionsTotal()関数が「ゼロ」を返すのでしょうか?そして、次のティックで信頼性の高いデータを表示します。この情報を一度に入手 することは可能ですか?


ファイル:
 
ZAKST:

皆さん、グッドタイム

CTradeクラスのResultDeal()関数について質問です。

つまり、Strategy Testerでは この関数は問題なくトレードチケットを返しますが、ResultRetcode()関数が常に「TRADE_RETCODE_DONE」を返すにもかかわらず、Chart 上でEAを投げると常に「0」を返してしまうのです。

コード例

テスターでの実行ログ。

チャート上の実行ログ。


私は何を間違えているのだろう?トレードチケットを リアルタイムで 入手するにはどうすればよいですか?

そして2つ目の質問(あまり重要ではありませんが)、なぜ取引実行直後にPositionsTotal()関数が「ゼロ」を返すのでしょうか?そして、次のティックで信頼性の高いデータを表示します。この情報を一度に入手 することは可能ですか?


うーん、突然ですが、リアルタイムで 必要なデータは、同じCTrade クラスのResultOrder()関数で返されます、保留中の注文は使っていませんが...。

質問は同じです:私は何が間違っているのでしょうか?

 

こんなマクロがあるんです。

#define  Warning if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

こんな風に使っています。

Warning"Warnig  сработал. ");

Question: このような使い方をするためには、マクロの定義をどのように修正する必要がありますか?

Warning("Warnig  сработал. ");

警告と "Warnig worked "の間に括弧がある場合。"マクロ定義で括弧を使おうとした場合

#define  Warning( if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

が、コンパイラが括弧を使わせてくれない。

 
ZAKST:

うーん、突然ですが、同じCTrade クラスのResultOrder()関数は、ペンディングオーダーを使っていないのに、必要なデータをリアルタイムで返して くれました.........。

質問は同じです:私は何が間違っているのでしょうか?

MT5の注文システム、注文-取引-ポジションを理解すればよい。

ResultOrderはオープニングオーダーです。POSITION_IDENTIFIERが 本注文のチケットと等しいポジションとなる。

すべての案件は、ポジション識別子で履歴を確認することができます。位置のチケットと混同しないでください、それは変更することができ、識別子は一定です。

s.e. テスターは、注文の実行に遅れがなく、すぐに 取引が成立する点で異なっています。現実には、時間が経過し、注文の作成が成功した時点ではまだ取引が行われていないため、OnTradeイベントでキャッチする必要があります。
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
pivomoe:

こんなマクロがあるんです。

こんな風に使っています。

Question: このような使い方をするためには、マクロの定義をどのように修正する必要がありますか?

警告と "Warnig worked "の間に括弧がある場合。"マクロ定義で括弧を使おうとした場合

が、コンパイラは括弧を使わせてくれません。

パラメトリック形式を使いたいのに、ノンパラメトリック形式を指定した場合、次のようにしなければなりません。

#define  Warning(CUSTOM) (if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+"",string(CUSTOM)))


Warning("Warnig  сработал. ");
 

うまく説明できなかった。最初からやりましょう。今はこのようにマクロを使っています。

Warning,"Warnig  сработал. i=",i);

マクロ自体はこんな感じです。

#define  Warning if(LogWarnig)MoiLoggerWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')

警告," と ");" の間のマクロ呼び出しで、任意の型のパラメータを任意の数だけ指定する。これはすべて、Write 機能のリロードを繰り返すことで実現します。

質問です。このように呼び出せるようにするには、マクロのどこを修正すればよいのでしょうか。

Warning("Warnig  сработал. i=",i);
 
pivomoe:

うまく説明できなかった。最初からやりましょう。今はこのようにマクロを使っています。

マクロ自体はこんな感じです。

警告," と ");" の間のマクロ呼び出しで、任意の型のパラメータを任意の数だけ指定する。これはすべて、Write 機能のリロードを繰り返すことで実現します。

質問です。このように呼び出せるようにするには、マクロのどこを修正すればよいのでしょうか。

答え:マクロの再読み込みも繰り返し行う)

しかし、文字列には演算子 + を使い、すべてを文字列に変換した方がよい。そうすれば、多くのパラメータを持つバージョンの関数(およびマクロ)は不要になる

 
Aleksey Mavrin:

MT5の注文システム、注文-取引-ポジションを理解すればよい。

ResultOrderはオープニングオーダーです。POSITION_IDENTIFIERが 本注文のチケットと等しいポジションとなる。

すべての案件は、ポジション識別子で履歴を確認することができます。位置のチケットと混同しないでください、それは変更することができ、識別子は一定です。

s.s. テスターは、注文の実行に遅れがなく、すぐに 取引が生まれるという点で異なります。実際の取引では時間が経過し、約定が成立した時点ではまだ取引が行われていないため、OnTradeのイベントでキャッチする必要があります。
ご返信ありがとうございました。対処していきます))
 
こんにちは!EAからインジケーターのプロパティにアクセスするにはどうしたらいいですか?例えば、インジケーターのハンドルを知っているEAから線の色を変えたい。ヘルプを探しても見つからなかったのですが、私の探し方が悪いのでしょうか?
 
Tango_X:
こんにちは!EAからインジケーターのプロパティにアクセスするにはどうすればよいですか?例えば、インジケーターのハンドルが分かっている場合に、EAから線の色を変えたいのですが。探してみたのですが、見つかりませんでした。探しすぎでしょうか?

このためのインジケータは、入力色パラメータを持つ必要があります。つまり、カスタムインジケータ である必要があります。

理由: