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

 

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

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

fxsaber, 2018.02.19 08:39 AM

同じシンボルで同時にネット上でオープンポジションと任意の方向のいくつかの成行注文をすることができます。例えば、買いポジションと買い注文です。

MT5 ライブラリでは、MT5 注文と MT5 ポジションは MT4 注文という 1 つのエンティティです。このため、この状況では、ネッティング口座の 1 つのシンボルで複数の BUY/SELL-MT4 注文を取得することが可能です。これはエラーではなく、悪いことにはなりません。しかし、この状況に驚いている人がいるかもしれないので、書いておきます。

実際、私はそのようなデモ口座を見つけることができなかった。

これは理論的な警告に過ぎない。私は実際にはそれに出会っていない。

 
これらの注文は、図書館が 意図的に入札履歴を見ないようにしている(非常にまれな)注文で ある。以前のバージョンのbiblaでは見られました。現在の動作を同じにすべきという意見があれば、教えてください。
 
// 変更リスト:
// 06.03.2018
// 追加: TICKET_TYPEとMAGIC_TYPEを追加し、統一されたクロスプラットフォームのコードを記述できるようにしました。
// MQL4 strict-modeを含む)。

以下は、MQL4/5で警告なしにコンパイルできるコードです。

#property strict

#include <MT4Orders.mqh>

void OnStart()
{
// 長いチケット = 0;
// long Magic = 0;
  TICKET_TYPE Ticket = 0;
  MAGIC_TYPE  Magic = 0;
  
  long Tmp = OrderSelect(Ticket, SELECT_BY_TICKET) + 
             OrderDelete(Ticket) +
             OrderCloseBy(Ticket, Ticket) +
             OrderClose(Ticket, 1, 0, 0) +    
             OrderSend(_Symbol, OP_BUY, 1, 0, 0, 0, 0, NULL, Magic);
}

この解決策を提案してくれた@Andrey Voytenkoに 感謝する!

 
fxsaber:

以下は、MQL4/5で警告なしにコンパイルできるコードです。

この解決策を提案してくれた@Andrey Voytenkoに 感謝する!

このハックは何のためですか?

 
Rashid Umarov:

このハックは何のため?

長い型は例ではコメントアウトされている。そのままにしておくと、MQL5やNoStrict-MQL4では警告が発生しない。しかしstrict-MQL4では警告が発生する。

対応する警告なしでクロスプラットフォーム・ライブラリを記述できるようにするため、この機能が追加されました。

使用する必要はまったくありません。これは、この種のクロスプラットフォーム・タスクに直面する可能性のある人々のための追加的な利便性です。

 

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

MT4からMT5へのロボット

fxsaber, 2018.03.08 09:27.

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

int Hour( void )
{
  return((int)((TimeCurrent() % (24 * 3600)) / 3600));
}

int Minute( void )
{
  return((int)((TimeCurrent() % 3600) / 60));
}

#include "super-signals-channel.mq4" //https://www.mql5.com/ru/forum/231135#comment_6751304
 

あるストラテジー(MT4では当然問題なく機能する)を実装しようとしているのですが、レンガの壁にぶつかっています。

EAは新しいシグナルが発生するたびに新しい取引のシーケンスを開始するので、各取引ペアには通常複数のシーケンスが実行されます。

すべての取引にはSLとTPがあり、EAは注文履歴をチェックすることで、各シーケンスで直近の取引に何が起こったか(SLまたはTP)を追跡する必要があります。

残念ながら、ライブラリノート(下記)やシステムを動作させるための様々な試みから、これは不可能なようです:

// MT4 では、SELECT_BY_TICKET モードの OrderSelect は MODE_TRADES / MODE_HISTORY に関係なくチケットを選択します。
// 「チケット番号は一意の注文 ID」であるため。

//
// MODE_TRADES: 既存のポジション> 既存の注文> 取引> キャンセルされた注文
// MODE_HISTORY: 取引> キャンセルされた注文> 既存のポジション> 既存の注文

実験の結果、SL/TP イベントが発生すると、チケット番号は常に変更され、共通情報はマジック・ナンバーのみで、注文コメントさえも保持されないことを確認した。

テストでは、SL、TP、マジックナンバー、取引コメントを指定して最初の注文を出すと、チケット#2が返され、期待されるすべての情報が表示されます。

しかし、SLまたはTPがヒットすると、チケット#2は消えてしまい、SELECT_BY_POSまたはSELECT_BY_TICKETを使用しても検索できません。

代わりに、(他の取引活動がないと仮定して)注文コメントが設定されていないチケット#3が存在することになります。

チケット番号に関する一貫性がなく、参照する注文コメントもないため、指定されたシーケンスの最後の注文を識別する簡単な方法はないようです :(

うまくいけば、@fxsaber が解決策を見つけるか、回避策を提案してくれるかもしれない :)

 
SysFX:

残念ながら、私はこの問題を理解していなかった。

 

返信が遅くなり申し訳ありません :(

問題は、'MODE_HISTORY' のトレード情報が基本的に使えないということです:

1) トレードがクローズすると、チケット番号が変更される ...これをテストするには、TP と SL を指定した売買をオープンすることで簡単にできます。

2) マジックナンバーが失われる

3) チケットコメントが失われる

そのため、EA コードがトレードが利益で決済されたか損失で決済されたかをチェック する必要がある場合、トレードを識別するための情報がないため、それは不可能です。

マジックナンバーを保持し、取引コメントを MT4 のように動作させるように微調整できることを期待しています。

 
SysFX:

返事が遅くなって申し訳ない。

問題は、'MODE_HISTORY'のトレード情報が基本的に使えないことです:

1) 取引が終了すると、チケット番号が変更される ...これをテストするには、TP と SL を設定した売買取引をオープンすることで簡単にできます。

2) マジック・ナンバーが失われる

3) チケットのコメントが失われる

つまり、EAコードが取引を利益で決済したか損失で決済したかをチェックする必要がある場合、取引を特定するための情報がないため、不可能なのです。

マジックナンバーを保持し、トレードコメントをMT4のように動作させるように微調整できることを期待しています。

#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

損切りによって クローズされた場合、[tp]や[sl]でコメントを置き換えるものもあります!


PSロシアの議論スレッド