記事"MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第22部): 取引クラス - 基本取引クラス、制限の検証"についてのディスカッション

 

新しい記事 MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第22部): 取引クラス - 基本取引クラス、制限の検証 はパブリッシュされました:

この記事では、ライブラリベースの取引クラスの開発を開始し、最初のバージョンに取引操作を行うためのアクセス許可の初期検証を追加します。さらに、基本取引クラスの機能とコンテンツをわずかながら拡張します。

取引制限を確認するメソッドの動作を確認するには、制限を人為的に作成する必要があります。
以下は例です。

  1. インターネットサービスを無効にする(取引サーバへの接続の損失をシミュレートするため)。
  2. EA設定で取引を無効にする(F7を押し、EA設定ウィンドウの[共通]タブで[自動取引を許可する]をオフにする)。
  3. ターミナルで自動取引を無効にする(AutoTradingボタン)。

EA取引パネルでポジションを開くボタンをクリックすると、操作ログに以下が表示されます。

2019.09.26 15:07:55.582 CTrading::OpenBuy: Request rejected before being sent to server due to:
2019.09.26 15:07:55.582 1. No permission to conduct trading operations in terminal ("AutoTrading" button disabled)
2019.09.26 15:07:55.582 2. No connection to trade server
2019.09.26 15:07:55.582 3. EA does not have permission to conduct trading operations (F7 --> Common --> "Allow Automatic Trading")


制限を1つずつ取り除きましょう。

インターネット接続を有効にした後でポジションを開こうとすると、次のメッセージが表示されます。

2019.09.26 15:10:36.766 CTrading::OpenBuy: Request rejected before being sent to server due to:
2019.09.26 15:10:36.766 1. No permission to conduct trading operations in terminal ("AutoTrading" button disabled)
2019.09.26 15:10:36.766 2. EA does not have permission to conduct trading operations (F7 --> Common --> "Allow Automatic Trading")


ターミナルで[AutoTrading]ボタンをクリックして、自動取引を有効にします。ポジションを開こうとすると、以下が表示されます。

2019.09.26 15:13:03.424 CTrading::OpenBuy: Request rejected before being sent to server due to:
2019.09.26 15:13:03.424 EA does not have permission to conduct trading operations (F7 --> Common --> "Allow Automatic Trading")


F7を押して、EAの設定でEAが取引できるようにします。ポジションを開句試みはようやく成功します。

2019.09.26 15:14:32.619 - Position is open: 2019.09.26 11:14:32.711 -
2019.09.26 15:14:32.619 EURUSD Opened 0.10 Buy #455179802 [0.10 Market-order Buy #455179802] at price 1.09441, Magic number 123


他の制限は、制限の1つがアクティブになったときに状況を作成することによってテスターまたはデモ口座で確認できます。例は、口座での未決注文の上限です。

作者: Artyom Trishkin

 

Artemさん、mql4でポジションをオープンした後、または注文を有効化した後に、そのポジションのプロパティを 取得する必要があります。イベントのインデックスを取得する方法を見つけました。

ENUM_TRADE_EVENT engine.LastTradeEvent()

この時点で利用可能なプロパティを取得する必要があります。

enumも見つけたのですが、どうやって取得するのでしょうか?

 
Alexey Viktorov:

Artemさん、mql4でポジションをオープンした後、または注文を有効化した後に、そのポジションのプロパティを 取得する必要があります。イベントのインデックスを取得する方法を見つけました。

現時点では、利用可能なプロパティを取得する必要があります。

enumも見つけたのですが、どうやって取得するのでしょうか...。

最後のイベントがポジションをオープンすることだとしたら?最後にオープンしたポジションを取得し、そのすべてのプロパティにアクセスする必要があるのでしょうか?そうですよね?

もしそうなら、それは簡単です(リストとオブジェクトの取得結果をチェックすることなく):


 
ありがとう、残りのくだらない質問は、通行人を怖がらせないように内緒で聞いておくよ。)
 

何とかなりそうだ。ありがとう。

次の質問(バカバカしいものではありません):2つの未決注文があります。そのうちのひとつがアクティベートされるとイベントが発生し、その後もうひとつがアクティベートされました。そして2つ目が起動されました...。イベントを受信した後、番人を戻すにはどうすればいいのでしょうか?試してみた

last_event = WRONG_VALUE;
イベントを処理した 後、ナンセンスを得ました...。
 
Alexey Viktorov:

何とかなりそうだ。ありがとう。

次の質問(バカバカしいものではありません):2つの未決注文があります。そのうちのひとつがアクティベートされるとイベントが発生し、その後もうひとつがアクティベートされました。そして2つ目が起動されました。イベント受信後、番人を戻すにはどうすればいいのでしょうか?試してみました。

イベントを処理した 後、番人を戻すにはどうしたらいいでしょうか?

イベントを正しく制御できていない。ライブラリはすべてのイベントをキャッチし、テストEAは過去のイベントと現在のイベントの違いをチェックします。そして、同じイベントが2つある。

原則的に、イベントを送信した後、ライブラリはイベント自体をリセットします。イベントを受信した後、もう一度イベントを受信してみてください。イベントがないことが変数に書き込まれ、次のイベントがキャッチされるはずです。

しかし、トレード・イベントはシンボルや口座のイベントと同じように行うべきだと、私はずっと前に計画に書いていた。そして、プログラムの中で、そのイベントが何であるかを見ることができる。Expert AdvisorのOnDoEasyEvent()関数では、フラグがまだ返されていないため、取引イベントだけがストッパーになっています:

//--- 貿易イベントの処理
   else if(idx>TRADE_EVENT_NO_EVENT && idx<TRADE_EVENTS_NEXT_CODE)
     {
      event=EnumToString((ENUM_TRADE_EVENT)ushort(idx));
      int digits=(int)SymbolInfoInteger(sparam,SYMBOL_DIGITS);
     }
     
 
Artyom Trishkin:

イベントコントロールがおかしくなっています。ライブラリーはそれらをすべてキャッチし、テストEAは過去のイベントと現在のイベントの違いをチェックする。そして、同じイベントが2つある。

原則的に、イベントを送信した後、ライブラリはイベント自体をリセットします。イベントを受信した後、もう一度イベントを受信してみてください。イベントがないことが変数に書き込まれ、次のイベントがキャッチされるはずです。

しかし、トレード・イベントはシンボルや口座のイベントと同じように行うべきだと、私はずっと前に計画に書いていた。そして、プログラムの中で、そのイベントが何であるかを見ることができる。Expert AdvisorのOnDoEasyEvent()関数では、フラグがまだ返されていないため、取引イベントだけがストッパーになっています:

確かに、朝より晩の方が賢いですね...。イベントを受信した場合、私の特定のケースでは、我々は何らかの形でそれに反応する必要があります。特に、別の保留中の注文を 入れる。新しいイベントはここまで。

 
いや、結局はイベントフラッグをリセットしなければならない。
 
Artyom Trishkin:

イベントコントロールがおかしくなっています。ライブラリーはそれらをすべてキャッチし、テストEAは過去のイベントと現在のイベントの違いをチェックする。そして、同じイベントが2つある。

原則的に、イベントを送信した後、ライブラリはイベント自体をリセットします。イベントを受信した後、もう一度イベントを受信してみてください。イベントがないことが変数に書き込まれ、次のイベントがキャッチされるはずです。

しかし、トレード・イベントはシンボルや口座のイベントと同じように行うべきだと、私はずっと前に計画に書いていた。そして、プログラムの中で、そのイベントが何であるかを見ることができる。Expert AdvisorのOnDoEasyEvent()関数では、フラグがまだ返されていないため、取引イベントだけがストッパーになっています:

しかし、eventはOnChartEventでのみ 利用可能な変数で、テスターでは処理されません。

OnTick()でこのようなことをしたいのです:

//--- 最後の取引イベントが変更された場合
 if(engine.LastTradeEvent() != last_event)
  {
   switch(last_event)
    {
     case TRADE_EVENT_PENDING_ORDER_PLASED :
      // 対応する関数を呼び出す
     break;
     case TRADE_EVENT_PENDING_ORDER_REMOVED :
      // 対応する関数を呼び出す
     break;
     case TRADE_EVENT_PENDING_ORDER_ACTIVATED :
      // 対応する関数を呼び出す
     break;
     case TRADE_EVENT_POSITION_OPENED :
      // 対応する関数を呼び出す
     break;
     case TRADE_EVENT_POSITION_CLOSED :
      // 対応する関数を呼び出す
     break;
     
     default :
      break;
    }
 
Alexey Viktorov:

しかし、eventはOnChartEventでのみ利用可能な変数であり、テスターでは処理されない。

OnTick()でこのようなことをしたい:

イベント処理の 後、つまりイベント・タイプ・チェック・モジュールの最後で、last_event変数に何が入っていますか?この変数はExpert Advisorでリセットする必要があります。ライブラリの最後のイベントをリセットするメソッドを強制的に呼び出すのではなく、イベントをチャートに送信し、イベントのリストに書き込んだ直後に、ライブラリ自身がそれを呼び出します。

 
Alexey Viktorov:

しかし、eventはOnChartEventでのみ利用可能な変数であり、テスターでは処理されない。

OnTick()でこのようなことをしたい:

テストEAの関数OnDoEasyEvent()に注目してください。トレードイベントを スイッチで処理したい場合は、そこで行ってください。