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

 

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

mql4言語の特徴、仕事の機微とテクニック

fxsaber, 2017.09.11 20:29

以下では、MT4だけでなく、MT5や他のプラットフォームにも関係するトピックに触れます。しかし、簡単に認識するために、ロジックはMQL4で書かれますので、このスレッドで。

ライブラリに直接関係する議論。

 

未決済ポジションの SL/TP/SOレベルがトレードサーバーによって受け入れられると、対応する成行注文が生成され、それが約定するまでMT5の未決済注文のテーブルにあることを明確に示していました。


したがって、MT5では、純粋なMQL5であっても、このような注文の変更/削除は不可能であり、MT5の取引ロジックでは、未決済注文が実際に凍結されているかどうかを確認する必要があります。


以下は、MT4Ordersで取引ロジックを記述する際に、そのような注文を識別するための条件と、そのトリガーの例を示しています。

// トリガーSL/TP/SO
void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest &Request, const MqlTradeResult &Result )
{ 
  if ((Trans.type == TRADE_TRANSACTION_ORDER_ADD) && OrderSelect(Trans.order))
  {
    const ENUM_ORDER_REASON Reason = (ENUM_ORDER_REASON)OrderGetInteger(ORDER_REASON);
    
    if (Reason == ORDER_REASON_TP)
      Print("Position #" + (string)Trans.position + " - triggered TP.");    
    else if (Reason == ORDER_REASON_SL)
      Print("Position #" + (string)Trans.position + " - triggered SL.");    
    else if (Reason == ORDER_REASON_SO)
      Print("Position #" + (string)Trans.position + " - triggered StopOut.");    
  }
}

#include <MT4Orders.mqh>

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnInit()
{
  EventSetMillisecondTimer(1);
  
  OrderSend(_Symbol, OP_BUY, 1, Ask, 100, Bid - _Point, Ask + _Point);    
}

// SL/TP/SO注文が現在のMT5オープン注文のテーブルに存在することを示す
void OnTimer()
{
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) &&
        (OrderCloseReason() >= (int)ORDER_REASON_SL)) // この条件が発生した場合、注文の変更/削除はできません!
    {
      OrderPrint();
      
      const long Position = OrderGetInteger(ORDER_POSITION_ID); // MT4OrdersはMQL5取引APIと並行して動作するように設定されているため、可能性があります。
      
      const ENUM_ORDER_REASON Reason = (ENUM_ORDER_REASON)OrderCloseReason();
      
      if (Reason == ORDER_REASON_TP)
        Print("Position #" + (string)Position + " - in the process of execution TP.");    
      else if (Reason == ORDER_REASON_SL)
        Print("Position #" + (string)Position + " - in the process of execution SL.");    
      else if (Reason == ORDER_REASON_SO)
        Print("Position #" + (string)Position + " - in the process of execution StopOut.");
    }
}


結果

2017.09.14 09:35:11.565 Position #1060283 - triggered TP.
2017.09.14 09:35:11.575 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.575 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.595 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.595 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.607 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.607 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.617 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.617 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.637 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.637 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.657 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.657 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.667 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.667 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.680 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.680 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.700 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.700 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.710 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.710 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.730 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.730 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.757 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.757 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.760 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.760 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.780 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.780 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.790 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.790 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.810 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.810 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.820 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.820 Position #1060283 - in the process of execution TP.


TP注文が未決済注文の中に4分の1秒以上ぶら下がっていることがわかります。この注文を変更/削除しようとすると、エラーが発生します。

MT5のこの機能を考慮してください(MT4Ordersで作業するときだけではありません)。

 
fxsaber:

未決済ポジションの SL/TP/SOレベルがトレードサーバーによって受け入れられると、対応する成行注文が生成され、それが約定するまでMT5の未決済注文のテーブルにあることを明確に示していました。


したがって、MT5では、純粋なMQL5であっても、このような注文の変更/削除は不可能であり、MT5の取引ロジックでは、未決済注文が実際に凍結されているかどうかをチェックする必要があります。

以下に、MT4Ordersで取引ロジックを記述する際に、そのような注文を識別するための条件と、そのトリガーの例を示します。

TP注文が未決済注文の中に4分の1秒以上ぶら下がっていることがわかります。これを変更/削除しようとすると、エラーが発生します。

MT5 のこの機能を考慮してください (MT4Orders を使用しているときだけではありません)。

この条件のチェックは現在ライブラリに組み込まれており、MT4 と同様に作業できます。

// 変更リスト:
// 14.09.2017:
// 修正:ORDER_STATE_PLACED状態を持たない現在のMT5注文がライブラリに表示されないようになりました。.
// ライブラリにMT5のすべての未決済注文を表示させるには、次の行をライブラリの前に記述する必要があります。
//
// #define MT4ORDERS_SELECTFILTER_OFF // MT4Orders.mqhに現在のMT5注文をすべて表示させる
 
mt5では、これらのポジション/注文で非常に多くのものを作成する必要がありました。)
 
Maxim Dmitrievsky:
他のプラットフォームでは、このような多様性は見たことがない)。

ORDER_STATEパラメータはさらに大きな役割を果たします。SL/TP注文ではORDER_STATE_STARTED です。しかし、すべてのORDER_STATE_STARTEDを無視してはいけません(説明するのに時間がかかります)。そのため、ORDER_STATEに依存するのは間違いであり、ORDER_REASONが必要である。

ORDER_STATEは別の話である。保留中の注文から部分的にポジションがオープンされ、残りの注文がまだぶら下がっているとする。その場合、ヒストリには取引があるが、注文自体はまだない。その注文が完全に成立した場合、その注文によって発生した最初の取引が部分的にオープンされたことを理解するためには、その注文の元となった注文のORDER_STATEを見ることはできない。


とにかく、この状態には非常に多くの状況があります。人間のOrderOpenState()とOrderCloseSate()を導入しなければならないが、頭の痛い問題だ(そして、それを使う人は限られている)。もちろん、単純なパズルであることに変わりはない。たくさんあるし、中には疑われることすらないものもある。全体として、生産性をほとんど落とすことなく、部分的に作業状態と人間の形に解けるのはいいことだ。ニーズの半分以上は、ライブラリーが満たしていると思う。

 
fxsaber:

ORDER_STATEパラメータはさらに大きな役割を果たします。SL/TP注文ではORDER_STATE_STARTED です。しかし、すべてのORDER_STATE_STARTEDを無視してはいけません(説明するのに時間がかかります)。そのため、ORDER_STATEに依存するのは間違いであり、ORDER_REASONが必要である。

ORDER_STATEは別の話である。保留中の注文から部分的にポジションがオープンされ、残りの注文がまだぶら下がっているとする。その場合、ヒストリには取引があるが、注文自体はまだない。その注文が完全に成立した場合、その注文によって発生した最初の取引が部分的にオープンされたことを理解するためには、その注文の元となった注文のORDER_STATEを見ることはできない。


いずれにせよ、このような状態は、実際には非常に多く存在する。人間のOrderOpenState()とOrderCloseSate()を導入する必要があるが、頭が痛くなる(一部の人しか使わない)。もちろん、単純なパズルであることに変わりはない。たくさんあるし、中には疑われることすらないものもある。全体として、ほとんど生産性を落とすことなく、部分的に作業状態や人間の形に解けるのはいいことだ。このライブラリーは私のニーズの半分以上を満たしていると思う。

テスターでも実機でもボットで使っていますが、オープニングとFXのFortsでは、まだエラーは起きていないようです。dtsが突然ゆっくりと注文を実行し始めたときに問題がありました(裁定取引に対するプラグイン)、私は覚えていない、私はリバがポジションがすでに市場にあるかどうかを計算する時間がなかったと思う、(私が覚えている限りでは、履歴の同期の問題)、一列に多くの注文をスタンプが、その後、あなたは更新を行い、それは時計のようになりました。だから、少なくとも半分以上は)
 

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

エキスパートアドバイザー: Quantum 103

fxsaber, 2017.09.26 09:55.

エキスパートアドバイザーのクロスプラットフォーム版
// MQL4&5コード

#ifdef __MQL5__

bool RefreshRates( void ) { return(true); }

double MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )  { return(SymbolInfoDouble(Symb, Property)); }
int    MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_INTEGER Property ) { return((int)SymbolInfoInteger(Symb, Property)); }

bool IsTesting(void)            { return(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)); }
bool IsTradeContextBusy( void ) { return(false); }
bool IsTradeAllowed(void)       { return(MQLInfoInteger(MQL_TRADE_ALLOWED)); }
bool IsExpertEnabled(void)      { return(AccountInfoInteger(ACCOUNT_TRADE_EXPERT)); }

int    ObjectFind( const string Name )   { return(ObjectFind(0, Name)); }
int    ObjectsTotal( void )              { return(ObjectsTotal(0)); }
bool   ObjectDelete( const string Name ) { return(ObjectDelete(0, Name)); }
string ObjectName( const int Pos )       { return(ObjectName(0, Pos)); }

double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume)
{
 double Margin;

 return(OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume,
        SymbolInfoDouble(Symb, (Cmd == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID), Margin) ?
        AccountInfoDouble(ACCOUNT_MARGIN_FREE) - Margin : -1);
}

#define False false
#define True  true

#define Digits _Digits
#define Point  _Point

#define MODE_BID       SYMBOL_BID
#define MODE_ASK       SYMBOL_ASK
#define MODE_POINT     SYMBOL_POINT
#define MODE_DIGITS    SYMBOL_DIGITS
#define MODE_STOPLEVEL SYMBOL_TRADE_STOPS_LEVEL
#define MODE_SPREAD    SYMBOL_SPREAD

#define StrToTime    StringToTime
#define StrToInteger StringToInteger
#define TimeToStr    TimeToString
#define DoubleToStr  DoubleToString

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define   MT4_TICKET_TYPE // OrderSendとOrderTicketがMT4と同じ型(int)の値を返すようにします。
#include <MT4Orders.mqh> //https://www.mql5.com/ja/code/16006

// レポートのグラフに必要
// #include <TypeToBytes.mqh> //https://www.mql5.com/ja/code/16280

#define  REPORT_TESTER // テスターは自動的にレポートを記録します。
#include <Report.mqh> //https://www.mql5.com/ja/code/18801

#endif // MQL5__

#include "Quantum 103.mq4" //https://www.mql5.com/ja/code/19133

MT5のリアルティックでのバックテスト結果

標準MT5レポート

カスタムレポート(MT4スタイル)


標準レポートが見づらいので、MT4スタイルのMT5バックテストレポートを添付しました - 予告編で両方ご覧ください。

このEAのMT5バックテスト結果にスリッページと手数料が影響していることがよくわかります。

 

(この場合、"ヴォルフガング "は "ヴォルフガング "を意味します)

Советники:量子103

fxsaber, 2017.09.26 09:55

エキスパートアドバイザーのクロスプラットフォーム版
// MQL4&5コード

#ifdef __MQL5__

bool RefreshRates( void ) { return(true); }

double MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )  { return(SymbolInfoDouble(Symb, Property)); }
int    MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_INTEGER Property ) { return((int)SymbolInfoInteger(Symb, Property)); }

bool IsTesting(void)            { return(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)); }
bool IsTradeContextBusy( void ) { return(false); }
bool IsTradeAllowed(void)       { return(MQLInfoInteger(MQL_TRADE_ALLOWED)); }
bool IsExpertEnabled(void)      { return(AccountInfoInteger(ACCOUNT_TRADE_EXPERT)); }

int    ObjectFind( const string Name )   { return(ObjectFind(0, Name)); }
int    ObjectsTotal( void )              { return(ObjectsTotal(0)); }
bool   ObjectDelete( const string Name ) { return(ObjectDelete(0, Name)); }
string ObjectName( const int Pos )       { return(ObjectName(0, Pos)); }

double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume)
{
 double Margin;

 return(OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume,
        SymbolInfoDouble(Symb, (Cmd == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID), Margin) ?
        AccountInfoDouble(ACCOUNT_MARGIN_FREE) - Margin : -1);
}

#define False false
#define True  true

#define Digits _Digits
#define Point  _Point

#define MODE_BID       SYMBOL_BID
#define MODE_ASK       SYMBOL_ASK
#define MODE_POINT     SYMBOL_POINT
#define MODE_DIGITS    SYMBOL_TRADE_STOPS_LEVEL
#define MODE_STOPLEVEL SYMBOL_TRADE_STOPS_LEVEL
#define MODE_SPREAD    SYMBOL_SPREAD

#define StrToTime    StringToTime
#define StrToInteger StringToInteger
#define TimeToStr    TimeToString
#define DoubleToStr  DoubleToString

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define   MT4_TICKET_TYPE // Обязываем OrderSend и OrderTicket возвращать значение такого же типа, как в MT4 - int.
#include <MT4Orders.mqh> //https://www.mql5.com/ru/code/16006

// Нужно для графиков в отчетах
// #include <TypeToBytes.mqh> //https://www.mql5.com/ru/code/16280

#define  REPORT_TESTER // В тестере будут автоматически записываться отчеты
#include <Report.mqh> //https://www.mql5.com/ru/code/18801

#endif // MQL5__

#include "Quantum 103.mq4" //https://www.mql5.com/ru/code/19133

MT5でのリアルティックでのバックテスト結果

MT5の標準レポート

カスタムレポート(MT4スタイル)


標準レポートでは読みにくいため、MT4スタイルのレポートMT5-backtestを添付しました。

このアドバイザーのスリッページと手数料がMT5-backtestの結果に与える影響がよくわかります。

 

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

エキスパート・アドバイザー:注文の表示

fxsaber, 2017.10.09 13:22

クロスプラットフォームのバリエーション
// MQL4&5コード

#ifdef __MQL5__

bool RefreshRates( void ) { return(true); }

double MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )  { return(SymbolInfoDouble(Symb, Property)); }

string AccountCurrency( void ) { return(AccountInfoString(ACCOUNT_CURRENCY)); }
double AccountProfit( void )   { return(AccountInfoDouble(ACCOUNT_PROFIT)); }
double AccountBalance( void )  { return(AccountInfoDouble(ACCOUNT_BALANCE)); }

bool ObjectSet( const string Name, const ENUM_OBJECT_PROPERTY_INTEGER Index, long Value ) { return(ObjectSetInteger(0, Name, Index, Value)); }
bool ObjectDelete( const string Name )   { return(ObjectDelete(0, Name)); }

bool ObjectCreate( const string Name, const ENUM_OBJECT Type, const int SubWindow, const datetime Time1, const double Price1 )
{
  return(ObjectCreate(0, Name, Type, SubWindow, Time1, Price1));
}

bool ObjectSetText( const string Name, const string Text, const int FontSize = 0, const string FontName = NULL, const color TextColor = clrNONE )
{
  return(ObjectSetString(0, Name, OBJPROP_TEXT, Text) && ObjectSetString(0, Name, OBJPROP_FONT, FontName) && ObjectSetInteger(0, Name, OBJPROP_COLOR, TextColor));
}

void OnInit( void ) { init(); }
void OnDeinit( const int Reason ) { deinit(); }

#define extern input

#define MODE_BID       SYMBOL_BID
#define MODE_ASK       SYMBOL_ASK
#define MODE_POINT     SYMBOL_POINT
#define MODE_TICKVALUE SYMBOL_TRADE_TICK_VALUE

#define DoubleToStr DoubleToString

#define  DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get(const string Symb,const int TimeFrame,const int iShift)                                      \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator[](const int iPos) const                                                                        \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  } NAME;                                                                                                     

DEFINE_TIMESERIE(Time,Time,datetime)

#define   MT4_TICKET_TYPE // OrderSendとOrderTicketがMT4と同じ型(int)の値を返すようにします。
#include <MT4Orders.mqh> //https://www.mql5.com/ja/code/16006

#endif // MQL5__

#include "Display orders.mq4"
 

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

エキスパートアドバイザー:Xarax

fxsaber, 2017.10.11 13:44

クロスプラットフォームのバリアント

// MQL4&5コード

#ifdef __MQL5__

bool RefreshRates( void ) { return(true); }

double MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )  { return(SymbolInfoDouble(Symb, Property)); }
int    MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_INTEGER Property ) { return((int)SymbolInfoInteger(Symb, Property)); }

bool IsTesting(void)            { return(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)); }
bool IsTradeContextBusy( void ) { return(false); }
bool IsTradeAllowed(void)       { return(MQLInfoInteger(MQL_TRADE_ALLOWED)); }
bool IsExpertEnabled(void)      { return(AccountInfoInteger(ACCOUNT_TRADE_EXPERT)); }

double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume)
{
 double Margin;

 return(OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume,
        SymbolInfoDouble(Symb, (Cmd == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID), Margin) ?
        AccountInfoDouble(ACCOUNT_MARGIN_FREE) - Margin : -1);
}

#define False false
#define True  true

#define Digits _Digits
#define Point  _Point

#define MODE_BID       SYMBOL_BID
#define MODE_ASK       SYMBOL_ASK
#define MODE_POINT     SYMBOL_POINT
#define MODE_DIGITS    SYMBOL_DIGITS
#define MODE_STOPLEVEL SYMBOL_TRADE_STOPS_LEVEL
#define MODE_LOTSTEP   SYMBOL_VOLUME_STEP

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define   MT4_TICKET_TYPE // OrderSendとOrderTicketがMT4と同じ型(int)の値を返すようにします。
#include <MT4Orders.mqh> //https://www.mql5.com/ja/code/16006

#endif // __MQL5__

#include "Xarax.mq4"