記事"MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第24部): 未決取引リクエストの使用 - 初期実装(ポジションのオープン)"についてのディスカッション

 

新しい記事 MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第24部): 未決取引リクエストの使用 - 初期実装(ポジションのオープン) はパブリッシュされました:

本稿では、注文の値にいくつかのデータを格納し、マジックナンバーを配置し、保留中リクエストの実装を開始します。概念を確認するために、サーバエラーを受信して、待機後に繰り返しリクエストを送信する必要がある際にマーケットポジションを開くための最初のテスト保留中リクエストを作成しましょう。

コンパイルしてEAを起動します。インターネットをオフにして、端末の右下隅に次の画像が表示されるまで待ちます。



インターネットを無効にして[売]をクリックすると、取引サーバはエラーを返し、次のエントリが操作ログに表示されます。

2019.11.26 15:34:48.661 CTrading::OpenPosition<uint,uint>: Invalid request:
2019.11.26 15:34:48.661 No connection with the trade server
2019.11.26 15:34:48.661 Correction of trade request parameters ...
2019.11.26 15:34:48.661 Trading attempt #1. Error: No connection with the trade server


エラーを受け取った後、ライブラリは、ショートポジションを開けなかったときにパラメータが設定された保留中リクエストを作成します。
保留中リクエストには、試行回数と20秒の待機時間も含まれます。

次に、取引サーバへの接続を復元できるようにインターネットを有効にします。


接続が復元されるとすぐに、ライブラリはサーバに送信する保留中リクエストの処理を開始します。その結果、操作ログエントリにポジションが表示されます。

2019.11.26 15:35:00.853 CTrading::OpenPosition<double,double>: Invalid request:
2019.11.26 15:35:00.853 Trading is prohibited for the current account
2019.11.26 15:35:00.853 Correction of trade request parameters ...
2019.11.26 15:35:00.853 Trading operation aborted
2019.11.26 15:35:01.192 CTrading::OpenPosition<double,double>: Invalid request:
2019.11.26 15:35:01.192 Trading is prohibited for the current account
2019.11.26 15:35:01.192 Correction of trade request parameters ...
2019.11.26 15:35:01.192 Trading operation aborted
2019.11.26 15:35:01.942 - Position is open: 2019.11.26 10:35:01.660 -
2019.11.26 15:35:01.942 EURUSD Opened 0.10 Sell #486405595 [0.10 Market-order Sell #486405595] at price 1.10126, sl 1.10285, tp 1.09985, Magic number 17629307 (123), G1: 13
2019.11.26 15:35:01.942 OnDoEasyEvent: Position is open


ご覧のとおり、取引サーバへの接続を復元した後、現在のアカウントの取引は遅れて有効になりました
しかし、保留中リクエストはとにかく機能しました。
...

また、操作ログの実際のマジックナンバー(17629307)に続いて、括弧(123)のEA設定で定義されたマジックナンバーに加えたエントリ「G1: 13」があって、最初のグループIDが13であることが分かります。2番目のグループは値がゼロなので、IDはありません。よって「G2: XX」2番目のグループIDエントリはありません。

作者: Artyom Trishkin

 
こんにちは!最新版のライブラリと Expert Part_26 をダウンロードし、テスターでビジュアルモードにしたところ、成行注文はオープンされますが、すべての未決注文はオープンされません。

注文は発注されますが、保留中の注文は発注されません。

取引所シンボル、ブローカーOtkritie、バージョン5.00ビルド2190。

 
Alexander:
こんにちは!最新版のライブラリとExpert Part_26をダウンロードし、テスターにビジュアルモードとマーケットモードを入れました。

注文はオープンされましたが、すべての保留中の注文がオープンされません。

取引所シンボル、ブローカーOtkritie、バージョン5.00ビルド2190。

取引、自動取引システム、取引戦略のテストに関するフォーラム

記事「MetaTrader用プログラムを簡単かつ迅速に作成するためのライブラリ(パートXXV)」の議論:取引サーバーから返されるエラーの処理"

アルチョム・トリシキン, 2019.11.28 09:39 AM

このバージョンのライブラリでも、次の バージョンでもそうですが、注文の充填タイプと注文の有効期限タイプをチェックしていませんでした。次回(27日)の記事で修正する予定です。

今のところ提案できるのは、取引リクエストを送信する際に、有効期限タイプを明示的に指定することです。例えば、指値売り注文を発注するには、テスト用Expert Advisorにそれを追加する必要があります

//--- BUTT_SELL_LIMIT ボタンが押された場合: SellLimit を設定する。
else if(button==EnumToString(BUTT_SELL_LIMIT))
  {
   //--- 売り指値注文を設定する
   engine.PlaceSellLimit(lot,Symbol(),distance_pending,stoploss,takeprofit,magic,TextByLanguage(「保留中の売りリミット,"Pending order SellLimit"),0,ORDER_TIME_DAY);
  }

そして、保留注文を設定 するメソッドの呼び出しを含むすべての行で同じことを行います。


 
はい、ありがとうございます。
 
//--- マジックナンバー内のデータ位置 int値
      //-----------------------------------------------------------
      // ビット 32|31 24|2316|15 8|7 0|
      //-----------------------------------------------------------
      // バイト|3|2| 1 | 0 |
      //-----------------------------------------------------------
      // データ|uchar|uchar| ushort
      //-----------------------------------------------------------
      // descr|pend req id|id2|id1|magic||...
      //----------------------------------------------------------- 
//--- (1)指定されたマジックナンバーバー、(2)第1グループのID、(3)第2グループのID、(4)マジックナンバーバー値からの保留中のリクエストを返す。
   ushort            GetMagicID(void)                                const { return ushort(this.Magic() & 0xFFFF);                                 }
   uchar             GetGroupID1(void)                               const { return uchar(this.Magic()>>16) & 0x0F;                                }
   uchar             GetGroupID2(void)                               const { return uchar((this.Magic()>>16) & 0xF0)>>4;                           }
   uchar             GetPendReqID(void)                              const { return uchar(this.Magic()>>24) & 0xFF;                                }

数値からビットを抽出する便利な関数が ある。

//--- k番目のビット位置のcntビットを抽出する。
   uint              _getBits(const uint number,uint pos,uint cnt=1) const { return (number >> pos) & ((1 << cnt) - 1);                            }
      
   ushort            GetMagicID(void)                                const { return ushort(_getBits(this.Magic(),0,16));                           }
   uchar             GetGroupID1(void)                               const { return uchar(_getBits(this.Magic(),16,4));                            }
   uchar             GetGroupID2(void)                               const { return uchar(_getBits(this.Magic(),20,4));                            }
   uchar             GetPendReqID(void)                              const { return uchar(_getBits(this.Magic(),24,8));                            }
 
amrali:

数値からビットを抽出する便利な関数が ある。

ありがとう
 
即座に市場取引を 開始するための実装はライブラリにありますか?
 
iabbott:
即座に市場取引を 開始するための実装はライブラリにありますか?
あります。
 

ペンディング・リクエストのエンコードされたマジックを、具体的にどこで、どのような方法でデコードしているのか教えてください。

ポジションをオープンする際にエラー(資金不足)が発生し、その後ペンディングリクエストをトリガーした後、全く異なるマジック(明らかにエンコードされたもの)でポジションが作成されました。

どこでデコードするのですか?新しいマジックではなく、ネイティブのマジックが欲しいのですが。

 
void CTradingControl::OnPReqByErrCodeHandler()

ここで元のマジックを返すメソッドを呼び出すことになっている。GetMagicID()?

 
//+------------------------------------------------------------------+
//| 注文の利益をpips単位で返す。|
//+------------------------------------------------------------------+
int COrder::ProfitInPoints(void) const
  {
   MqlTick tick={0};
   string symbol=this.Symbol();
   if(!::SymbolInfoTick(symbol,tick))
      return 0;
   ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)this.TypeOrder();
   double point=::SymbolInfoDouble(symbol,SYMBOL_POINT);
   if(type==ORDER_TYPE_CLOSE_BY || point==0) return 0;
   if(this.Status()==ORDER_STATUS_HISTORY_ORDER)
      return int(type==ORDER_TYPE_BUY ? (this.PriceClose()-this.PriceOpen())/point : type==ORDER_TYPE_SELL ? (this.PriceOpen()-this.PriceClose())/point : 0);
   else if(this.Status()==ORDER_STATUS_MARKET_POSITION)
     {
      if(type==ORDER_TYPE_BUY)
         return int((tick.bid-this.PriceOpen())/point);
      else if(type==ORDER_TYPE_SELL)
         return int((this.PriceOpen()-tick.ask)/point);
     }
   else if(this.Status()==ORDER_STATUS_MARKET_PENDING)
     {
      if(type==ORDER_TYPE_BUY_LIMIT || type==ORDER_TYPE_BUY_STOP || type==ORDER_TYPE_BUY_STOP_LIMIT)
         return (int)fabs((tick.bid-this.PriceOpen())/point);
      else if(type==ORDER_TYPE_SELL_LIMIT || type==ORDER_TYPE_SELL_STOP || type==ORDER_TYPE_SELL_STOP_LIMIT)
         return (int)fabs((this.PriceOpen()-tick.ask)/point);
     }
   return 0;
  }

なぜ ORDER_STATUS_DEAL タイプの計算がないのですか?


そして、それは常に0です:

deal_profit_pts=(int)deal.GetProperty(ORDER_PROP_PROFIT_PT)