ライブラリ: MT4Orders - ページ 13

 
fxsaber:

アップデート

// 変更リスト:
// 14.06.2017:
// 追加:SL/TPのクローズドポジション検出の 初期実装を有効にする。 (закрытых через OrderClose).

動作例

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

MT5とMT4のターミナル画面 - MT 5の変更に失望

fxsaber, 2017.07.07 08:46 AM

最初にこのスクリプトを実行します。

#include <MT4Orders.mqh> //https://www.mql5.com/en/code/16006

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define  SLIPPAGE 100
#define  OFFSET (SLIPPAGE * _Point)

void OnStart()
{
  if (OrderSelect(OrderSend(_Symbol, OP_BUY, 1, Ask, SLIPPAGE, 0, 0), SELECT_BY_TICKET))
  {
    OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - OFFSET, OrderOpenPrice() + OFFSET, 0);
    
    if (OrderSelect(OrderTicket(), SELECT_BY_TICKET))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), SLIPPAGE);
  }
}

結果

'6145767': instant buy 1.00 EURUSD at 1.14156 (deviation: 100)
'6145767': accepted instant buy 1.00 EURUSD at 1.14156 (deviation: 100)
'6145767': deal #140159795 buy 1.00 EURUSD at 1.14156 done (based on order #156755661)
'6145767': order #156755661 buy 1.00 / 1.00 EURUSD at 1.14156 done in 252.283 ms
'6145767': modify #156755661 buy 1.00 EURUSD sl: 0.00000, tp: 0.00000 -> sl: 1.14056, tp: 1.14256
'6145767': accepted modify #156755661 buy 1.00 EURUSD sl: 0.00000, tp: 0.00000 -> sl: 1.14056, tp: 1.14256
'6145767': modify #156755661 buy 1.00 EURUSD -> sl: 1.14056, tp: 1.14256 done in 109.586 ms
'6145767': instant sell 1.00 EURUSD at 1.14147, close #156755661 buy 1.00 EURUSD 1.14156 (deviation: 100)
'6145767': accepted instant sell 1.00 EURUSD at 1.14147, close #156755661 buy 1.00 EURUSD 1.14156 (deviation: 100)
'6145767': deal #140159796 sell 1.00 EURUSD at 1.14147 done (based on order #156755662)
'6145767': order #156755662 sell 1.00 / 1.00 EURUSD at 1.14147 done in 219.817 ms


次にこのスクリプトを実行します。

#include <MT4Orders.mqh> //https://www.mql5.com/en/code/16006

void OnStart()
{
  if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
    OrderPrint();
}

結果

#140159796 2017.07.07 09:38:31 buy 1.00 EURUSD 1.14156 1.14056 1.14256 2017.07.07 09:38:32 1.14147 0.00 0.00 -7.88 0


このようにして、クローズしたポジションのSL/TPを知ることができます。

 

MT4はMT5よりも情報が少ない。しかし、MT4/5の取引APIを同時に使用することを妨げるものはありません。

// スクリプトは、すべてのクローズポジションの理由フィールドを 表示する。
#include <MT4Orders.mqh>

void OnStart()
{
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      OrderPrint();
      
      Print(EnumToString((ENUM_DEAL_REASON)HistoryDealGetInteger(OrderTicket(), DEAL_REASON)));
    }      
}


取引結果

#141705115 2017.07.18 15:02:37 sell 0.01 EURUSD 1.15508 0.00000 0.00000 2017.07.19 13:04:05 1.15309 0.00 -0.01 1.99 0
DEAL_REASON_CLIENT

#140517682 2017.07.11 12:06:48 buy 0.01 EURUSD 1.13941 1.13926 0.00000 2017.07.11 12:07:10 1.13926 0.00 0.00 -0.15 [sl 1.13926] 0 DEAL_REASON_SL

#137746488 2017.06.20 01:22:26 sell 2.00 EURUSD 1.11474 0.00000 0.00000 2017.06.20 01:22:41 1.11484 0.00 0.00 -20.00 0 DEAL_REASON_EXPERT
 

OrderSendがターミナルの取引環境と同期されていなかったとき、自動同期が MT4Ordersに組み込まれました。

しばらくして、開発者が同期を組み込み古い同期コードは わずかな例外を除いてライブラリに残されました - 同期を行うだけでなく、開発者からのOrderSend同期が正しく機能しているかどうかもチェックするようになりました。エラーが発生した場合、アラートがポップアップします。

    if (MT4ORDERS::OrderSendBug)
    {
      Alert("BUG!!!!!!");


このアラートは、まれに(CPUがビジー状態のときに)発動され、開発者のOrderSendが取引環境と同期する際にバグがあることを知らせるという報告がある。私はこれを再現できないので、SDの開発者にどのように報告すればよいかわかりません。しかし、事実は変わりません。


したがって、選択肢は2つあります。

  1. そのままにしておく - アラートは開発者のバグについて報告します。
  2. アラートを拒否する。
どちらの場合も、ライブラリはOrderSendを分単位で強制的に同期させます。
 
// 変更リスト:
// 03.08.2016:
// リリース - オフラインテスターのみで執筆、テスト。
// ....
//03.08.2017:
// Add: OrderCloseByを追加。
// 追加: MODE_TRADESモードでのOrderSelect操作が高速化されました。これにより、選択された注文のデータを
MT5 のポジション/注文(履歴にない)が MT4Orders を介して選択されていない場合でも、 // 対応する MT4-Order は機能します。
// たとえば、MT5-PositionSelect*-function または MT5-OrderSelect を使用します。
// 追加: OrderOpenPriceRequest() および OrderClosePriceRequest() を追加。
// これらの関数を使えば、注文のスリッページを計算することができる。

図書館は1年前のものだが...。

 
fxsaber:

開館1周年

おめでとう!素敵な包装紙ですね。

 
fxsaber:

開館1周年


おめでとうございます!

私は2つのEAを試しましたが、その経験は否定的なものでした。最初の試みはコンパイルがうまくいきませんでした -取引関数の 理解が不十分だったため、理解できませんでした。

2つ目の変種の理由は何なのか言いにくいのですが、たぶんクラスのせいではないのでしょう - レベル・ブレイクアウトで取引する半自動があります - レベルは手作業で構築されます。

 

お祝いの言葉をありがとう!皆さんのコメントにはいつも感謝しています。

Aleksey Vyazmikin:

EAがひどく遅くなった - カーネルリソースをすべて消費してしまうが、コンパイルは成功した。

コードを見てみたい。PMに送ってください。

 
fxsaber:

お祝いのコメント、ありがとう!コメントは常に考慮に入れている。

コードを見せてほしい。私にPMを送ることができます。


あなたのPMにコードを送りました。

 
Aleksey Vyazmikin:

コードをPMに送りました。

残念ながら、元々ライブラリはMQL4取引関数だけ でなく、MT4->MT5変換のすべてに責任を負うものではありません。

あなたの場合、Expert Advisorの動作が遅いのは、このライブラリが原因ではなく、MT4->MT5変換の私的な実装が原因であり、時系列やインジケータなどの動作に影響を及ぼしています。

 
fxsaber:

残念ながら、当初このライブラリは、MQL4の取引機能だけ でなく、MT4からMT5へのすべての変換に対応していませんでした。


しかし、現在は責任を負っている?

fxsaber:

あなたの場合、Expert Advisor の動作が遅いのは、このライブラリが原因ではなく、MT4->MT5 変換の私的な実装が原因です。

プライベート - それは私のライブラリですか、それとも別のライブラリですか?

私は誰もが知っている記事に従ってすべてのことをしましたし、そこには特別なインジケータはありません。

このコードがカーネルのオーバーロードの原因になるとは思えません:

double iMAMQL4(string symbol,
               int tf,
               int period,
               int ma_shift,
               int method,
               int price,
               int shift)
  {
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   ENUM_MA_METHOD ma_method=MethodMigrate(method);
   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);
   int handle=iMA(symbol,timeframe,period,ma_shift,
                  ma_method,applied_price);
   if(handle<0)
     {
      Print("Объект iMA не создан: Ошибка ",GetLastError());
      return(-1);
     }
   else
      return(CopyBufferMQL4(handle,0,shift));
  }

それともそれが原因なのでしょうか?