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

 

すみません、ロシア語は話せません。

数日前、とても興味深いライブラリを見つけました。 OrderSend()で成行注文を送信し、OrderSend()で返されたチケットを保存しています。 しばらくすると、ストップロスがヒットしたり、利益が出たりします。 次に、このチケットを使ってOrderSelect(ticket, SELECT_BY_TICKET)で注文を選択しようとします。 MQL4では、注文は履歴で見つかる。

MT4ORDERS.mqhのコードを少し見てみました。 MT4ORDERS::SelectByTicket()はSelectByExistingTicket()を呼び出し、これは失敗し、次にSelectByHistoryTicket()を呼び出します。 SelectByHistoryTicket()では、チケットはトランザクションチケットではなくポジション識別子であるため、HistoryDealSelect() は通常falseを返します(テストの場合を除く)。 ::HistoryOrderSelect()は、チケットが注文チケット(およびポジションID)と同じであるため、trueを返します(私はヘッジモードでMT5を使用しています)。 しかし、MT4HISTORY::IsMT4Order(Ticket) は false を返します。 trueを返すことを期待しています。 この関数は、ポジションIDがゼロの場合にtrueを返します。 しかし、テストと実際の請求書の両方で、アイテム ID はゼロではなく、注文の注文ビットと等しいことがわかります。

どのようなヘルプでも歓迎します。

 
winloosewin:

数日前、とても興味深いライブラリを見つけました。 OrderSend()で成行注文を送信し、OrderSend()で返されたチケットを保存しています。 しばらくすると、ストップロスがヒットしたり、利益が出たりします。 次に、このチケットを使ってOrderSelect(ticket, SELECT_BY_TICKET)で注文を選択しようとします。 MQL4では、注文は履歴で見つかる。 しかし、このライブラリをMQL5で使用すると、OrderSelectは失敗します。

これは正しい。詳細はこちらに 記載されています。

PositionTicket= OrderSend(OP_BUY, 2 lots) and OrderClose(0.2 lots) + OrderClose(0.3 lots)とすることができます。そうすると、2つのクローズした「ポジション」(0.2ロット/0.3ロット)と1つのオープンポジション(1.5ロット)が、PositionTicketと 同じチケットで得られます。これはMT5の特殊性です。したがって、SELECT_BY_TICKET+MODE_HISTORY モードで、取引履歴の POSITION_ID でポジションを選択するのは正しくありません。


チケットの暗記は一般的ではありますが、悪いスタイルです。正しい方法は、イベントごとに取引ロボットが環境全体を一から読み直すことです。


ZY ここでは、上記とほぼ同じ状況を見ることができます。

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

ライブラリ: MT4Orders

fxsaber, 2018.04.14 09:10 AM

#include <MT4Orders.mqh>

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

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnInit()
{
  long Ticket;
  
  PRINT((Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Bid - 100 * _Point, Bid + 100 * _Point, "Hello World!", 12345)));
  
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
    PRINT(OrderClose(OrderTicket(), 0.3, OrderClosePrice(), 0));
}

void OnDeinit( const int )
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 1; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      OrderPrint();
      
      PRINT(OrderTicket());
      PRINT(OrderMagicNumber());
      PRINT(OrderComment());
      PRINT(OrderTicketOpen());
    }
}


結果

2018.03.25 00:00:00   instant buy 1.00 EURUSD at 1.23527 sl: 1.23414 tp: 1.23614 (1.23514 / 1.23527)
2018.03.25 00:00:00   deal #2  buy 1.00 EURUSD at 1.23527 done (based on order #2)
2018.03.25 00:00:00   deal performed [#2  buy 1.00 EURUSD at 1.23527]
2018.03.25 00:00:00   order performed buy 1.00 at 1.23527 [#2  buy 1.00 EURUSD at 1.23527]
2018.03.25 00:00:00   (Ticket=OrderSend(_Symbol,OP_BUY,1,Ask,0,Bid-100*_Point,Bid+100*_Point,Hello World!,12345)) = 2
2018.03.25 00:00:00   instant sell 0.30 EURUSD at 1.23514, close #2 (1.23514 / 1.23527)
2018.03.25 00:00:00   deal #3  sell 0.30 EURUSD at 1.23514 done (based on order #3)
2018.03.25 00:00:00   deal performed [#3  sell 0.30 EURUSD at 1.23514]
2018.03.25 00:00:00   order performed sell 0.30 at 1.23514 [#3  sell 0.30 EURUSD at 1.23514]
2018.03.25 00:00:00   OrderClose(OrderTicket(),0.3,OrderClosePrice(),0) = true
2018.03.26 01:04:40   take profit triggered #2  buy 0.70 EURUSD 1.23527 sl: 1.23414 tp: 1.23614 [#4  sell 0.70 EURUSD at 1.23614]
2018.03.26 01:04:40   deal #4  sell 0.70 EURUSD at 1.23614 done (based on order #4)
2018.03.26 01:04:40   deal performed [#4  sell 0.70 EURUSD at 1.23614]
2018.03.26 01:04:40   order performed sell 0.70 at 1.23614 [#4  sell 0.70 EURUSD at 1.23614]
final balance 10000046.11 EUR
2018.03.26 23:59:59   #3 2018.03.25 00:00:00 buy 0.30 EURUSD 1.23527 1.23414 1.23614 2018.03.25 00:00:00 1.23514 0.00 0.00 -3.16 Hello World! 12345
2018.03.26 23:59:59   OrderTicket() = 3
2018.03.26 23:59:59   OrderMagicNumber() = 12345
2018.03.26 23:59:59   OrderComment() = Hello World!
2018.03.26 23:59:59   OrderTicketOpen() = 2
2018.03.26 23:59:59   #4 2018.03.25 00:00:00 buy 0.70 EURUSD 1.23527 0.00000 1.23614 2018.03.26 01:04:40 1.23614 0.00 0.00 49.27 tp 1.23614 12345
2018.03.26 23:59:59   OrderTicket() = 4
2018.03.26 23:59:59   OrderMagicNumber() = 12345
2018.03.26 23:59:59   OrderComment() = tp 1.23614
2018.03.26 23:59:59   OrderTicketOpen() = 2

結果は、あるポジションが ticket == 2 でオープンされたことを示しています。その後、2回クローズしたため、取引履歴にクローズした「ポジション」が2つ作成されています。チケットは異なりますが、これらの「ポジション」は両方とも OrderTicketOpen == 2 です。つまり、MT5 でポジションをクローズした場合、その履歴チケットはリアルタイムのものと一致しないことに気づく必要があります。


MT5 では、同じリアルタイムのポジションをクローズするときのコメントでさえ、「Hello World!

 
winloosewin:

すみません、ロシア語は話せません。

数日前、とても興味深いライブラリを見つけました。 OrderSend()で成行注文を送信し、OrderSend()で返されたチケットを保存しています。 しばらくすると、ストップロスがヒットしたり、利益が出たりします。 次に、このチケットを使ってOrderSelect(ticket, SELECT_BY_TICKET)で注文を選択しようとします。 MQL4では、注文は履歴で見つかる。

MT4orders.mqhのコードを少し見てみました。 MT4ORDERS::SelectByTicket()はSelectByExistingTicket()を呼び出し、これは失敗し、次にSelectByHistoryTicket()を呼び出します。 SelectByHistoryTicket()では、チケットはトランザクションチケットではなくポジション識別子であるため、HistoryDealSelect() は通常falseを返します(テストの場合を除く)。 ::HistoryOrderSelect()は、チケットが注文チケット(およびポジション識別子)と同じであるため、trueを返します(私はヘッジモードでMT5を使用しています)。 しかし、MT4HISTORY::IsMT4Order(Ticket) は false を返します。 trueを返すことを期待しています。 この関数は、ポジション ID がゼロの場合、true を返します。 しかし、テストと実際の請求書の両方で、アイテムIDはゼロではなく、注文の注文ビットと等しいことがわかります。

何でも結構です。

機械翻訳を完全に理解するために、英語のテキストを添付してください

 

数日前にこの非常に興味深いライブラリを見つけました。OrderSend()で成行注文を送信し、OrderSend()で返されたチケットを保存しています。しばらくして、ストップロスまたはテイクプロフィットが ヒットしました。次に、このチケットを使って
OrderSelect(ticket, SELECT_BY_TICKET)で注文を選択しようとします。MQL4では、注文は履歴で見つかるだろう。しかし、このライブラリをMQL5で使用すると、OrderSelectは成功しない。

MT4orders.mqhのコードを少し見てみた。MT4ORDERS::SelectByTicket()は、失敗するSelectByExistingTicket()を呼び出し、次に成功すると予想されるSelectByHistoryTicket()を呼び出します。SelectByHistoryTicket()では、関数HistoryDealSelect()は、チケットがポジション識別子でありディールチケットではないため、一般的に(テスターを除いて)falseを返します。しかし、MT4HISTORY::IsMT4Order(Ticket) は false を返します。私はそれがtrueを返すと期待しています。ポジション識別子がゼロの場合、この関数はtrueを返します。しかし、テスターでも実際の口座でも、ポジション識別子はゼロではなく、注文中の注文チケットと等しいことがわかります。

言い換えれば、MT4HISTORY::IsMT4Order() 関数に以下のコード(ポジション ID がゼロの場合、true を返す)がある理由がわかりません:

    return(/*(::HistoryOrderGetDouble(Ticket, ORDER_VOLUME_CURRENT) > 0) ||*/. !::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID));

以下に私のテストコードを添付します:

void OnTick()
{
   PrintChangesOfMQL5OrderSystemState();

   int total=OrdersTotal();

   double bid = MarketInfo(Symbol(), MODE_BID);
   double ask = MarketInfo(Symbol(), MODE_ASK);

   static int state=0;
   static ulong ticket = 0;

   switch(state)
   {
      case 0:
         ticket = OrderSend(Symbol(), OP_BUY, 1.0, ask, 10, bid - 3*Point, bid + 3*Point);
         state=1;
         break;

      case 1:
         if(0==total)
         {
            bool res = OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
            if(false==res)
            {
               Print("OrderSelect failed with ticket: ", (string)ticket);
               Print("ORDER_POSITION_ID = ", (string)HistoryOrderGetInteger(ticket, ORDER_POSITION_ID));
               HistoryDealSelect(ticket);
               Print("HistoryDealSelect", (string)HistoryDealSelect(ticket), "   MT4HISTORY::IsMT4Deal", (string)MT4HISTORY::IsMT4Deal(ticket));
               HistoryOrderSelect(ticket);
               Print("HistoryOrderSelect", (string)HistoryOrderSelect(ticket), "   ORDER_POSITION_ID", ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID));
               
               ExpertRemove();
            }
         }
         break;
   }
}

PrintChangesOfMQL5OrderSystemState()は、変更が検出されるたびにMQL5注文システムの状態を表示するストレートフォワード関数です。

テストコードの出力は以下のとおりです(テスターで実行):

EURUSD  bid=1.087360   ask=1.087860
263207 EURUSD 2016.01.03 00:00:00  

HistDeal: ticket: 1  position_id: 0  MAGIC: 0  balance  open_price: 0.000000  volume: 0.000000  opened by order: 0  type=balance  reason=client  entry=in


--------------------
EURUSD  bid=1.087350   ask=1.087850
263207 EURUSD 2016.01.03 00:00:00  

HistDeal: ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  opened by order: 2  type=buy  reason=expert  entry=in
HistDeal: ticket: 1  position_id: 0  MAGIC: 0  balance  open_price: 0.000000  volume: 0.000000  opened by order: 0  type=balance  reason=client  entry=in

HistOrder ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  cur_vol=0.000000  type=buy  reason=expert
Order:    ticket: 0  position_id: 0  MAGIC: 0  buy  open_price: 0.000000  volume: 0.000000  cur_vol=0.000000  type=buy  reason=client

Position: ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  reason=expert

--------------------
EURUSD  bid=1.087330   ask=1.087830
263207 EURUSD 2016.01.03 00:00:16  

HistDeal: ticket: 3  position_id: 2  MAGIC: 0  sell  open_price: 1.087330  volume: 1.000000  opened by order: 3  type=sell  reason=stop loss  entry=out
HistDeal: ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  opened by order: 2  type=buy  reason=expert  entry=in
HistDeal: ticket: 1  position_id: 0  MAGIC: 0  balance  open_price: 0.000000  volume: 0.000000  opened by order: 0  type=balance  reason=client  entry=in

HistOrder ticket: 3  position_id: 2  MAGIC: 0  sell  open_price: 1.087330  volume: 1.000000  cur_vol=0.000000  type=sell  reason=stop loss
HistOrder ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  cur_vol=0.000000  type=buy  reason=expert

--------------------

OrderSelect failed with ticket:  2
ORDER_POSITION_ID =  2
HistoryDealSelect true    MT4HISTORY::IsMT4Deal false
HistoryOrderSelect true    MT4HISTORY::IsMT4Order false    ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) 2


HistoryOrderGetInteger(Ticket、ORDER_POSITION_ID)が0ではなく2を返していることがわかります。これが MT4HISTORY::IsMT4Order() が false を返す理由です。



どのようなヘルプでも結構です。
Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 
winloosewin:
上記で回答 されています。


つまり、MT4HISTORY::IsMT4Order() 関数の中で、なぜ以下のコード(ポジション ID がゼロの場合、true を返す)があるのか理解できません:

以下に私のテストコードを添付します:

PrintChangesOfMQL5OrderSystemState() は、変更が検出されるたびに MQL5 オーダーシステムの状態を表示する、素直な関数です。

以下はテスト・コード(テスター上で実行)の出力です:


HistoryOrderGetInteger(Ticket、ORDER_POSITION_ID)が0ではなく2を返していることがわかります。これがMT4HISTORY::IsMT4Order()がfalseを返す理由です。

MT5 と MT4 の注文が異なるエンティティであることに気づいていません。

 
fxsaber:
上記で回答 済みです。


MT5での注文とMT4での注文は異なるものであることを理解していない。

MQL5とMQL4の注文システムとその違いは理解しています。


fxsaber:
したがって、SELECT_BY_TICKET+MODE_HISTORY モードの取引履歴で POSITION_ID によってポジションを選択するのは間違っています。

MQL5関数HistoryOrderSelect()がポジション識別子ではなくチケットを想定している ことは知っています。

しかし、私のテストコードは有効なMQL4コードです(MQL5関数HistoryOrderSelect()とHistoryDealSelect()の 呼び出しを除く)。

MQL4では、関数OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)は期待通りtrueを返します。

私の知る限り、ライブラリの目的はMQL4の注文システムをMQL5で可能な限りエミュレートすることです。ですから

ライブラリのOrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)関数もtrueを返します。

コードを見て、なぜfalseを返すのか調べてみました。

第一に、私はMQL5のヘッジ・システムに取り組んでいるため、関数

ticket =OrderSend(Symbol(),OP_BUY,1.0, ask,10, bid -3*Point, bid +3*Point);

は、変数 'ticket' に、MQL5 ヘッジの (将来の) ポジション識別子に等しい注文チケットを代入します。これは次のコードで確認できます。

    return((arrow_color == INT_MAX) ? (MT4ORDERS::NewOrderCheck() ? 0 : -1) :
           ((((int)arrow_color != INT_MIN) || MT4ORDERS::NewOrderCheck()) &&
            MT4ORDERS::OrderSend(MT4ORDERS::LastTradeRequest, MT4ORDERS::LastTradeResult) ?
            (MT4ORDERS::IsHedging ? (long)MT4ORDERS::LastTradeResult.order : // PositionID == Result.orderはMT5-Hedgeの機能です。
             ((MT4ORDERS::LastTradeRequest.action == TRADE_ACTION_DEAL) ?
              (MT4ORDERS::IsTester ? (::PositionSelect(MT4ORDERS::LastTradeRequest.symbol) ? PositionGetInteger(POSITION_TICKET) : 0) :
                                      // MT4ORDERS::OrderSendのHistoryDealSelect
                                      ::HistoryDealGetInteger(MT4ORDERS::LastTradeResult.deal, DEAL_POSITION_ID)) :
              (long)MT4ORDERS::LastTradeResult.order)) : -1));

関数MT4OrderSend()のコードをご覧ください。次のように返されます:

(long)MT4ORDERS::LastTradeResult.order : // PositionID == Result.orderはMT5-Hedgeの機能です。

コードを実行するときにライブラリが行うことを分析すると、次のようになります。

bool res = OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);

関数 SelectByHistoryTicket() が、変数 'ticket' に格納したチケットで実行されていることがわかります。

この関数の中でHistoryOrderSelect(ticket)関数が呼び出されます。

私のMQL4のOrderSelect()呼び出しでは 、HistoryOrderSelect(ticket)を自分では呼び出しません。

私のテストコードでのみ、ライブラリ内部で何が起こるかを確認するために、HistoryOrderSelect(ticket)とHistoryDealSelect(ticket)を直接呼び出します:

/* 以下はMQL5のコードであり、MQL4のコードではない:*/
               Print("ORDER_POSITION_ID = ", (string)HistoryOrderGetInteger(ticket, ORDER_POSITION_ID));
               HistoryDealSelect(ticket);
               Print("HistoryDealSelect", (string)HistoryDealSelect(ticket), "   MT4HISTORY::IsMT4Deal", (string)MT4HISTORY::IsMT4Deal(ticket));
               HistoryOrderSelect(ticket);
               Print("HistoryOrderSelect", (string)HistoryOrderSelect(ticket), "   ORDER_POSITION_ID", ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID));


簡単に言うと、OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)の戻り値によると、ライブラリはMQL4注文システムをエミュレートしていません。

MQL4のオーダーシステムをMQL5上で正しくエミュレートしていません。

 
winloosewin:

MQL4では、関数OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)は期待通りtrueを返します。

私の知る限り、ライブラリの目的はMQL4の注文システムをMQL5で可能な限りエミュレートすることです。ですから

このライブラリを使用すると、関数OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)もtrueを返すと予想されます。

コードを見て、なぜfalseを返す のか調べてみました。

あなたは間違っています。このExpert Advisorをテスターで実行します。

#include <MT4Orders.mqh>
#include <Debug.mqh> //https://c.mql5.com/3/173/Debug.mqh

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  if (_P(OrderSelect(_P(OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, 0)), SELECT_BY_TICKET)))
  {
    OrderPrint();
    _P(OrdersTotal());    
  }
  
  ExpertRemove();  
}


結果

2018.08.07 10:47:20.340 2018.08.01 00:00:00   instant buy 1.00 EURUSD at 1.16905 (1.16895 / 1.16905 / 1.16895)
2018.08.07 10:47:20.340 2018.08.01 00:00:00   deal #2  buy 1.00 EURUSD at 1.16905 done (based on order #2)
2018.08.07 10:47:20.340 2018.08.01 00:00:00   deal performed [#2  buy 1.00 EURUSD at 1.16905]
2018.08.07 10:47:20.340 2018.08.01 00:00:00   order performed buy 1.00 at 1.16905 [#2  buy 1.00 EURUSD at 1.16905]
2018.08.07 10:47:20.347 2018.08.01 00:00:00   void OnTick(), Line = 8: OrderSend(_Symbol,OP_BUY,1,Ask,100,0,0) = 2
2018.08.07 10:47:20.347 2018.08.01 00:00:00   void OnTick(), Line = 8: OrderSelect(_P(OrderSend(_Symbol,OP_BUY,1,Ask,100,0,0)),SELECT_BY_TICKET) = true
2018.08.07 10:47:20.347 2018.08.01 00:00:00   #2 2018.08.01 00:00:00 buy 1.00 EURUSD 1.16905 0.00000 0.00000 1.16895 0.00 0.00 -10.00 0
2018.08.07 10:47:20.347 2018.08.01 00:00:00   void OnTick(), Line = 11: OrdersTotal() = 1
2018.08.07 10:47:20.347 2018.08.01 00:00:00   ExpertRemove() function called
 

はい、ポジションのオープン後に直接OrderSelect()を 呼び出すとtrueが返されることは知っています。

この場合、私たちはMQL5のポジションをオープンしており、ライブラリはOrderSelect()を 呼び出す際にポジションを見つけます。

これはライブラリの内部関数SelectByExistingTicket()で行われます。


しかし、重要なポイントは、MQL5のポジションがストップロスまたはテイクプロフィットによって クローズされた場合、OrderSelect(ticket)はfalseを返すという ことです。

私のテストコードを実行して確認してください(ブローカーがそれほど近いSLとTPを受け入れない場合は、OrderSend()の拒否を避けるためにそれらを広くしてください)。

Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 
winloosewin:

しかし、重要なポイントは、MQL5のポジションがストップロスやテイクプロフィットによって クローズされたときに、OrderSelect(ticket)がfalseを返すという ことです。

私の詳細な回答の一部をもう一度お読みください。

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

ライブラリ: MT4Orders

fxsaber, 2018.08.06 14:21

その通りでございます。詳細はこちらに書いて あります。

PositionTicket= OrderSend(OP_BUY, 2 lots) and OrderClose(0.2 lots) + OrderClose(0.3 lots)とできます。すると、2つのクローズした「ポジション」(0.2ロット/0.3ロット)と1つのオープンポジション(1.5ロット)が、PositionTicketと 同じチケットで得られます。これはMT5の特殊性です。 したがって、SELECT_BY_TICKET+MODE_HISTORY モードで、取引履歴の POSITION_ID でポジションを選択するのは正しくありません。


チケットの暗記は一般的ではありますが、悪いスタイルです。正しい方法は、イベントごとに取引ロボットが環境全体を一から読み直すことです。


ZY ここでは、上記とほぼ同じ状況を見ることができます。


結果は、あるポジションが ticket == 2 でオープンされたことを示しています。その後、2 回クローズしたため、取引履歴に 2 つのクローズした「ポジション」が作成されています。チケットは異なりますが、これらの「ポジション」は両方とも OrderTicketOpen == 2 です。つまり、MT5 でポジションをクローズした場合、その履歴チケットはリアルタイムのものと一致しない ことに気づく必要があります。


MT5 では、同じリアルタイムのポジションをクローズするときのコメントでさえ、「Hello World!」と「tp 1.23614」というように異なることに注意してください。

同じ POSITION_ID を持つ MT4 ポジションが同時に複数存在する可能性があるため、MT5 で POSITION_ID によってクローズした MT4 ポジションを一意に選択することはできません。

 

MT4からMT5への変換のためにMT4Ordersからmql4_to_mql5.mqh ファイルを使用している人は、そこからこのコードの部分を削除してください。

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

CopyTicks」のテスト

fxsaber, 2016.10.19 07:59

// MT4と同様に、Open[Pos]、High[Pos]、Low[Pos]、Close[Pos]、Time[Pos]、Volume[Pos]。
// iOpen、iHigh、iLow、iClose、iTime、iVolume。
#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));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)

公式にはMT5 buiild 1860でこのコード片は関係ありません

Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий
Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий
  • 2018.06.14
  • www.mql5.com
Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий15 июня 2018 года будет опубликов...