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

 

新しい記事 MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第7部): StopLimit注文発動イベント、注文およびポジション変更イベント機能の準備 はパブリッシュされました:

前の記事では、MetaTrader 5とMetaTrader 4プラットフォーム用のプログラムの開発を単純化するための大規模なクロスプラットフォームライブラリの作成を始めました。第6部分では、ネッティング勘定のポジションを扱うようにライブラリを訓練しました。今回は、StopLimit注文の発動の追跡を実装し、注文とポジションの変更イベントを追跡する関数を準備します。

実装された改善点をテストするには、前の記事のEAを使用します。\MQL5\Experts\TestDoEasy\Part06フォルダのTestDoEasyPart06.mq5 EAの名前をTestDoEasyPart07.mq5に変えて、新しい\MQL5\Experts\TestDoEasy\ Part07サブフォルダに保存します。

EAをコンパイルし、テスターで起動し、StopLimit注文を出して、発動を待ちます。

作者: Artyom Trishkin

 

このライブラリーと代わりのものを使って、いくつかのTCを実装してほしい。

もちろん比較分析も。特に、テスター/オプティマイザーでのパフォーマンス、コード・サイズ、その書き込み速度。

 
fxsaber:

私は、このライブラリや代替案を使ったいくつかのTCの実装を見てみたい。

もちろん比較分析も。特に、テスター/オプティマイザーでのパフォーマンス、コード・サイズ、その記述速度など。

まだ早い。現時点では、独自のプログラムを作成するという宣言されたシンプルさを実現するために必要な機能を準備していません。必要なベースはまだ作成中です。第8部では、注文やポジションの変更、ストップ・レベルなど、その他のイベントを追跡する機能が実装され、説明されている。次の記事では、MQL4との互換性を最終確認する予定です。次のステップでは、本格的な取引クラスを作成し、シンボルと口座を扱う。そして、ライブラリによって収集・管理されるあらゆるデータに簡単かつ迅速にアクセスするためのユーザーケース関数を作成する。そして、これは最終段階ではなく、ライブラリーに統合された新しいグラフィカル・オブジェクトを使用する可能性のセットを準備中で、標準的なものとしてアクセスできるようにする。つまり、ライブラリーは独自のグラフィカル・オブジェクトを作成する能力を持ち、キャンバス上に独自のグラフィカル・シェルを持ち、このセットから番組独自のグラフィカル要素を作成する可能性を持つことになる。これは以前から計画されていたものですが、まだ実装の計画があります。

また、TCの実現は、特にユーザー・ケース・ファンクションの作成後に可能になる。というのも、ポインタによってリストやライブラリ・オブジェクトに直接アクセスする必要があり、これは "テイク・アンド・ゲット "ではないからである。しかし、このようなアクセスは、記事に添付されたアドバイザーの例で 部分的に整理されている。

 
Artyom Trishkin:

...そして、これは最終段階ではなく、ライブラリに統合された新しいグラフィカル・オブジェクトを使用する可能性のセットが準備されており、標準的なものと同様にそれらにアクセスできるようになっている。つまり、ライブラリーは独自のグラフィカル・オブジェクトを作成する能力を持ち、キャンバス上に独自のグラフィカル・シェルを持ち、このセットからプログラム用の独自のグラフィカル要素を作成する能力を持つことになる......。

kanvas上にグラフィカルなライブラリを 書くのですか?
 
Реter Konow:
キャンバス上でグラフィック・ライブラリを書くのですか?

はい、もちろんです。キャンバス上だけではありません。標準的なグラフィカル・オブジェクトのセットからいくつかの「合成」オブジェクトを作成できるようにし、さらに、ライブラリによって収集・制御されるすべてのデータに完全にアクセスできる独自のGUIを作成するためのフォームを提供する予定です。もちろん、ユーザーが1つのライブラリからあらゆるニーズに完全にアクセスできるように、すべてが行われています。1つのライブラリにプラグインするだけで、あなたの望むものを完全に作成するために必要なすべての機能を手に入れることができます。

 
Artyom Trishkin:

ええ、もちろんです。それだけではない。標準的なグラフィカル・オブジェクトのセットからいくつかの "合成 "オブジェクトを作成することができ、さらに、ライブラリによって収集され制御されるすべてのデータに完全にアクセスできる独自のGUIを作成するためのフォームが提供される。もちろん、ユーザーが1つのライブラリからあらゆるニーズに完全にアクセスできるように、すべてが行われています。1つのライブラリにプラグインするだけで、あなたの望むものを完全に作成するために必要なすべての機能を手に入れることができます。

つまり、あらゆるEAを作成するためのフルセットの可能性を備えたマルチプラットフォームのソフトウェア環境を作成することができます。両プラットフォーム用のユニバーサルライブラリ、キャンバス上のグラフィック。

大規模なアイデアだ。最後の部分の実装が興味深い。前のグラフ。ライブラリは1年半かけて書かれたものだが、すでに本格的な基盤があるので、おそらくもっと早くなるだろう。
 
Реter Konow:
つまり、あらゆるEAを作成するためのフルセットの可能性を備えたマルチプラットフォームのソフトウェア環境を作成することになります。両プラットフォーム用のユニバーサル・ライブラリとキャンバス上のグラフィック。

大規模なアイデアだ。最後の部分の実装が興味深い。前のグラフ。ライブラリは1年半かけて書かれたが、すでに本格的な基礎があるので、おそらくもっと早くなるだろう。
すべてがそうなるでしょう。しかし、徐々に - ステップバイステップ。結局のところ、それは単にそのようなライブラリではなく、教材を計画している。ただ使うだけでなく、どのようにすべてが行われるのかを読み、理解することができます。
 
Artyom Trishkin:

...必要な解答がどこかに書かれて公開されているのを見つけることなく。

図書館がスタッフ図書館になるということですか?
 
Реter Konow:
それは図書館がスタッフ図書館になるということですか?
いいえ、1つの図書館で十分だということです。
 
Artyom Trishkin:
いや、1つの図書館で十分だということだ。
幸運を祈る。
 

アルテム、ありがとう!

メソッドでは

//+------------------------------------------------------------------+
//|| 注文リストを更新|
//+------------------------------------------------------------------+
void CMarketCollection::Refresh(void)

成行注文 "が動的に作成されます。

#else 
//--- ポジション
   int total_positions=::PositionsTotal();
   for(int i=0; i<total_positions; i++)
     {
      ulong ticket=::PositionGetTicket(i);
      if(ticket==0) continue;
      CMarketPosition *position=new CMarketPosition(ticket);
      if(position==NULL) continue;
      //--- ポジション・オブジェクトを成行注文とポジションのリストに追加する。
      if(!this.AddToListMarket(position))
         continue;
      //--- チケットとポジション識別子によるコントロールオーダーインデックスの取得
      int index=this.IndexControlOrder(ticket,position.PositionID());
      //--- 注文が管理注文リストにない場合、追加する。
      if(index==WRONG_VALUE)
        {
         if(!this.AddToListControl(position))
           {
            ::Print(DFUN_ERR_LINE,TextByLanguage("コントロールポジションの追加に失敗しました","Failed to add a control position "),position.TypeDescription()," #",position.Ticket());
           }
        }
      //--- オーダーがすでにコントロールオーダーのリストに存在する場合、プロパティが変更されていないかチェックする。
      else if(index>WRONG_VALUE)
        {
         this.OnChangeEvent(position,index);
        }
     }
//--- 注文
   int total_orders=::OrdersTotal();
   for(int i=0; i<total_orders; i++)
     {
      ulong ticket=::OrderGetTicket(i);
      if(ticket==0) continue;
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)::OrderGetInteger(ORDER_TYPE);
      //--- 成行注文
      if(type<ORDER_TYPE_BUY_LIMIT)
        {
         CMarketOrder *order=new CMarketOrder(ticket);
         if(order==NULL) continue;
         //--- 成行注文オブジェクトを成行注文とポジションのリストに追加する。
         if(!this.AddToListMarket(order))
            continue;
        }
      //--- 保留注文
      else
        {
         CMarketPending *order=new CMarketPending(ticket);
         if(order==NULL) continue;
         //--- 保留注文オブジェクトを成行注文とポジションのリストに追加する。
         if(!this.AddToListMarket(order))
            continue;
         //--- チケットとポジション識別子によるコントロールオーダーインデックスの取得
         int index=this.IndexControlOrder(ticket,order.PositionID());
         //--- 注文が管理注文リストにない場合、追加する。
         if(index==WRONG_VALUE)
           {
            if(!this.AddToListControl(order))
              {
               ::Print(DFUN_ERR_LINE,TextByLanguage(「コントロール・オーダーの追加に失敗しました,"Failed to add a control order "),order.TypeDescription()," #",order.Ticket());
              }
           }
         //--- オーダーがすでにコントロールオーダーのリストに存在する場合、プロパティが変更されていないかチェックする。
         else if(index>WRONG_VALUE)
           {
            this.OnChangeEvent(order,index);
           }
        }
     }
#endif 

そして、それはメソッドへの参照によって渡されます:

         //--- 成行注文オブジェクトを成行注文とポジションのリストに追加する。
         if(!this.AddToListMarket(order))
            continue;

メソッド"AddToListMarket"では、成行注文は "hash_sum "に考慮されません。では、なぜ成行注文を入力し、管理する必要があるのでしょうか?
ポジションや保留中の注文からすべての情報を知ることができるのであれば、なぜそれが必要なのか説明してください。