記事についてのディスカッション

 

新しい記事「DoEasyライブラリでのその他のクラス(第70部): チャットオブジェクトコレクショの機能拡張と自動更新」はパブリッシュされました:

本稿では、チャートオブジェクトの機能を拡張し、チャートのナビゲーション、スクリーンショットの作成、チャートの保存と適用を行います。また、チャートオブジェクトのコレクション、それらのウィンドウ、およびその中の指標の自動更新を実装します。

次に、現在のチャートのスクリーンショットの作成をテストします。ボタンをクリックするたびに、特定のサイズのチャートのスクリーンショットが作成されます。最初のクリック — 800x600、2番目 — 750x562、3番目 — 現在のチャートサイズです。


異なる解像度で3つのスクリーンショットを作成した後(適切な操作ログエントリを伴う)は、

CChartObj::ScreenShot800x600: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.25.png (800 x 600)
CChartObj::ScreenShot750x562: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.28.png (750 x 562)
CChartObj::ScreenShotWndSize: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.29.png (726 x 321)

これらのスクリーンショットが保存されているフォルダの内容も表示しました。
スクリーンショットを作成する前に、現在のチャートの2つのウィンドウの異なる領域にカーソルを合わせると、チャートのコメントにサブウィンドウの時間、価格、インデックス、カーソルのピクセル単位のX/Y座標が表示されます。カーソルのY座標には2つの値があります。最初の値は、銘柄メインウィンドウの初期座標のY座標を表示します。表示される2番目の値(括弧内)は、カーソルが置かれているウィンドウの上部境界線を基準にしたY座標を示しています。

作者: Artyom Trishkin

 

指値注文で、DeletePending ボタンを使用すると、多くの同じOnChartEvent イベントが発生します。

一括操作で指値注文を削除する場合も、同じイベントが多数 発生します。

手動で決済する場合、イベントは連続します。


2023.03.07 14:58:31.385 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:59.055 -
2023.03.07 14:58:31.385 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090285  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 4718715 (123), G1: 8, G2: 4
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:58.395 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090282  at price 1.19640, sl 1.19490, tp 1.19790, Magic number 10223739 (123), G1: 12, G2: 9
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:58:00.613 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090287  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 6357115 (123), G1: 1, G2: 6
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:59.669 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090286  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 393339 (123), G1: 6
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
 
BillionerClub OnChartEvent イベントを与える。

また、一括操作で指値注文を削除すると、同じイベントが多数発生します

手動で決済すると、イベントは連続する。

おっしゃっている意味がよくわかりません。
 
Artyom Trishkin OnChartEventで 異なるイベントが発生します。
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {


//--- テスターで作業している場合は、終了する。
//if(MQLInfoInteger(MQL_TESTER))
// を返す;
   int idx=id-CHARTEVENT_CUSTOM;
//--- lparamから(1)イベント時刻のミリ秒、(2)原因、(3)イベントの発生源、(4)イベントの正確な時刻を取り出す。
   ushort msc=engine.EventMSC(lparam);
   ushort reason=engine.EventReason(lparam);   ushort source=engine.EventSource(lparam);
   long time=::TimeCurrent()*1000+msc;
//--- 貿易イベントの処理
   if(idx>TRADE_EVENT_NO_EVENT && idx<TRADE_EVENTS_NEXT_CODE)
     {
      //--- 全取引イベントのリストを取得
      CArrayObj *list=engine.GetListAllOrdersEvents();
      if(list==NULL)
         return;
      //--- リストの最後からの相対的なイベントインデックスのオフセットを取得する。
      //--- テスターでは、オフセットはlparamパラメータによってイベントハンドラに渡されます。
      //--- 各イベントは一度に1つずつ送信され、OnChartEvent()で処理される。
      int shift=(engine.IsTester() ? (int)lparam : 0);
      CEvent *event=list.At(list.Total()-1-shift);

このように修正しました。


      int shift=(engine.IsTester() ? (int)lparam : 0);
      static int NEvents =list.Total()-1-shift;
      CEvent *event=list.At(NEvents);
      NEvents++;
 
BillionerClub OnChartEventで 異なるイベントが発生します。

これは私が修正した方法です。


ライブラリがイベント・ハンドラに間違ったイベントを送っているということですか?
 
Artyom Trishkin #:
ライブラリが間違ったイベントをイベント・ハンドラに送ってしまうということですか?

はい、そういう意味です。 直したつもりですが、デメリットがどこにあるのかよくわからないので、解決策についてはよくわかりません。


      int shift=(engine.IsTester() ? (int)lparam : 0);
      static int NEvents =list.Total()-1-shift;
      CEvent *event=list.At(NEvents);
      NEvents++;
      if(event==NULL)
      {
      event=list.At(list.Total()-1-shift);
      if(event==NULL)return;
      }
 
BillionerClub #:

ああ、そういうことだ。 一応修正したんだが、どこにデメリットがあるのかよく分からないので、解決策が分からない。


ありがとう。