記事"MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第8部): 注文およびポジション変更イベント"についてのディスカッション - ページ 3

 
leonerd:

ティックが受信され、そのティックに未決注文が 設定され、同時に有効化(トリガー)された場合(買い逆指値でテストしました)、エンジンはすべてのイベントを登録しません...

TRADE_EVENT_PENDING_ORDER_PLASEDイベントは受信されますが、TRADE_EVENT_PENDING_ORDER_ACTIVATEDは受信されません。

私のコードは次のようなものです:

まず、古い(処理された)イベントのインデックスをループ内で見つけ、それを起点として、新しいイベントを最後までループします。つまり、1ティックで指値注文が設定され、striggerenが設定に関するイベントを1つ受信するような状況で...コメントをお願いします。

engine.OnTick(rates_data)の後のOnTick()でProcessTradeEvents()を呼んでいます。

注文はあなたのエンジンによって出されました。もしかしたら、まだ有効化されていないのに呼んでいたのかもしれません・・・。手動注文で確認してみます。

 
leonerd:

注文は自分のエンジンで行った。もしかしたら、まだアクティベーションが行われていないのに、まだ呼んでしまったのかもしれない......。今マニュアルオーダーで確認してみます。

そうですね、手が曲がっているんだと思います...。

 
leonerd:

ああ、手が曲がっている気がする...。

いや、図書館にあるんだ。正確には、ライブラリーにあるのではなく、端末の注文履歴を 記録する特殊性にある。ライブラリの後のバージョンでは、この機能が考慮され、すべてが正しく追跡されます。30日頃のバージョンを試してみてください。今はどこが修正されたのか覚えていません。しかし、私はそれについて後の記事に書きました - そこに修正がありました。
 

こんにちは。

TestDoEasyPart08.mq5をテスト中にこの問題に遭遇しました - StopLossとTakeProfitが機能しません。StopLossとTakeProfitは設定されていますが、対応するラインがチャートに表示され、ジャーナルへのメッセージも表示されます。TrailStopをオンにすると、TakeProfitはトリガーされますが、StopLossはまだトリガーされません。何が原因でしょうか?

追伸:同じコードを別のコンピュータ(ラップトップ)で実行したところ、問題なく動作しました。同じメタトレーダーがインストールされていますが。

 
MQL_User #:

こんにちは。

TestDoEasyPart08.mq5をテスト中にこの問題に遭遇しました - StopLossとTakeProfitが機能しません。StopLossとTakeProfitは設定されていますが、対応するラインがチャートに表示され、ジャーナルへのメッセージも表示されます。TrailStopをオンにすると、TakeProfitはトリガーされますが、StopLossはまだトリガーされません。何が原因でしょうか?

追伸:同じコードを別のコンピュータ(ラップトップ)で実行したところ、問題なく動作しました。同じメタトレーダーがインストールされていますが。

こんばんは!まず、ログに表示されるメッセージだけでも表示してください。

よろしく、ウラジミール。

 
MQL_User #:

こんにちは。

TestDoEasyPart08.mq5をテスト中にこの問題に遭遇しました - StopLossとTakeProfitが機能しません。StopLossとTakeProfitは設定されていますが、対応するラインがチャートに表示され、ジャーナルへのメッセージも表示されます。TrailStopをオンにすると、TakeProfitはトリガーされますが、StopLossはまだトリガーされません。何が原因でしょうか?

追伸:同じコードを別のコンピュータ(ラップトップ)で実行したところ、問題なく動作しました。同じメタトレーダーがインストールされていますが。

ストップ(指値)注文が発注された場合、そのトリガーはプログラムではなくブローカーに依存します。逆指値(リミット)注文の発注はプログラムからサーバーに送られ、そのトリガーはブローカーに依存します。逆指値注文は発注され(チャート上にラインが表示され)、プログラム側にエラーはありません。ほとんどの場合、価格はストップ(指値)注文に到達しません。

 
MrBrooklin #:

こんばんは、せめてログに残るメッセージを表示してください。

よろしく、ウラジミール。

MrBrooklin、Artem。

ストラテジー・テスターでやってみました(私の理解では、ブローカーは関係ありません)。

メッセージは以下の通りです:

2022.07.03 11:16:39.380 2022.01.03 07:00:00 instant buy 0.1 @Si at 81011 sl: 80960 tp: 81060 (81010 / 81011 / 81010)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 ディール #2 buy 0.1 @Si at 81011 done (based on order #2)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 取引成立 [#2 buy 0.1 @Si at 81011]
2022.07.03 11:16:39.380 2022.01.03 07:00:00 注文成立 0.1 @Si at 81011 [#2 buy 0.1 @Si at 81011] 取引成立。

しかし、StopLossとTakeProfitが正しく動作する別のコンピュータ(ラップトップ)では、メッセージは次のようになります:

2022.07.03 11:23:18.383 2022.01.03 07:00:12 instant buy 0.1 @Si at 81047 sl: 80996 tp: 81096 (81046 / 81047 / 81046)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal #2 buy 0.1 @Si at 81047 done (based on order #2)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal performed [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.383 2022.01.03 07:00:12 注文約定 買い 0.1 at 81047 [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.514 2022.01.03 07:00:12 - ポジションオープン: 2022.01.03 07.03 07:00:12.490 -
2022.07.03 11:23:18.514 2022.01.03 07:00:12 @Si Open 0.10 Buy #2 [0.10 成行注文 Buy #2] at 81047, sl 80996, tp 81096, magik 123

確かに、あと2行...。

物事を少し単純化するために、私はこの単純なコードでExpert Advisorを書きました:

#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
#import "user32.dll"
  int GetAsyncKeyState(int a0);
#import
bool ZPressed, ZPress = false;
bool APressed, APress = false;
CTrade trade;

int OnInit()  {   return(INIT_SUCCEEDED);  }

void OnDeinit(const int reason)  {  }

void OnTick()
  {
  // Z」ボタンが押される
  if(MathAbs(GetAsyncKeyState(90))>1) ZPressed = ZPress = true;
  else ZPress = false;
  if(ZPressed && !ZPress)
    {
    ZPressed = false;
    double Price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
    double sl = Price - 30, tp = Price + 50;
    trade.Buy(1,Symbol(),0,sl,tp);
    printf("Buy"); 
    }
  // A」ボタンが押される
  if(MathAbs(GetAsyncKeyState(65))>1) APressed = APress = true;
  else APress = false;
  if(APressed && !APress)
    {
    APressed = false;
    double Price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
    double sl = Price + 30, tp = Price - 50;
    trade.Sell(1,Symbol(),0,sl,tp);
    printf("Sell");    
    }
  }

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {  }
//+------------------------------------------------------------------+

要は、「Z」キーを押すと(というか離すと)「買い」が開き、「A」キーを押すと「売り」が開くというもの。

テスターで動かしてみた。結果は同じで、デスクトップPCではStopLossとTakeProfitは機能しませんが、ラップトップPCでは機能します。

また、この記事の最後にリンクされているコードをテスターでPCとラップトップで動かしてみましたが、同じことが起こりました-PCでは動きませんが、ラップトップでは動きます。

つまり、テスターにslとtpのトリガーを可能にする何らかの設定があるか(それは私にはわからない)、テスター自体が正しく動作していないかのどちらかだ。

 
MQL_User #:

Mr.ブルックリン、アルテム

私はストラテジーテスターで行いました(私の理解では、ブローカーは関係ありません)。

メッセージは以下の通りです:

2022.07.03 11:16:39.380 2022.01.03 07:00:00 Instant buy 0.1 @Si at 81011 sl: 80960 tp: 81060 (81010 / 81011 / 81010)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 ディール #2 buy 0.1 @Si at 81011 done (based on order #2)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 ディール実行 [#2 buy 0.1 @Si at 81011]
2022.07.03 11:16:39.380 2022.01.03 07:00:00 オーダー実行 buy 0.1 at 81011 [#2 buy 0.1 @Si at 81011].

しかし、StopLoss と TakeProfit が正しく動作する別のコンピュータ(ラップトップ)では、メッセージは次のようになります:

2022.07.03 11:23:18.383 2022.01.03 07:00:12 instant buy 0.1 @Si at 81047 sl: 80996 tp: 81096 (81046 / 81047 / 81046)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal #2 buy 0.1 @Si at 81047 done (based on order #2)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal performed [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.383 2022.01.03 07:00:12 注文約定 買い 0.1 at 81047 [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.514 2022.01.03 07:00:12 - ポジションオープン: 2022.01.03 07:00:12.490 -
2022.07.03 11:23:18.514 2022.01.03 07:00:12 @Si Open 0.10 Buy #2 [0.10 成行注文 Buy #2] at 81047, sl 80996, tp 81096, magik 123

確かに、あと2行...

物事を少し単純化するために、私はこのシンプルなコードでExpert Advisorを書いた:

ポイントは、「Z」キーを押すと(というか離すと)「買い」が開き、「A」キーを押すと「売り」が開くということ。

テスターで動かしてみた。結果は同じで、デスクトップPCではStopLossとTakeProfitは機能しないが、ノートPCでは機能する。

また、この記事の最後にリンクされているコードをPCとラップトップの両方でテスターで実行してみましたが、同じことが起こりました-PCでは動作しませんが、ラップトップでは動作します。

つまり、テスターにslとtpのトリガーを可能にする何らかの設定があるか(それは私にはわからない)、テスター自体の動作が正しくないか......という結論になる。

テスターのスプレッドを教えてください。
 

テスターでのスプレッドは1.PCでもラップトップでも。シンボル@Si。

何か影響があるのでしょうか?

スリッページ(滑り)が何かしら影響しているのではと思い、変えてみました。でもうまくいかない。

 
MQL_User #:

テスターでのスプレッドは1.PCでもラップトップでも。記号 @Si.

これは何か効果があるのでしょうか?

スリッページ(滑り)が何かしら影響しているのかと思い、変えてみました。でもうまくいかない。

あるケースでは、価格がストップ・レベルに達しない。