Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
2018.08.0710:47:20.3402018.08.0100:00:00 instant buy 1.00 EURUSD at 1.16905 (1.16895 / 1.16905 / 1.16895)
2018.08.0710:47:20.3402018.08.0100:00:00 deal #2 buy 1.00 EURUSD at 1.16905 done (based on order #2)
2018.08.0710:47:20.3402018.08.0100:00:00 deal performed [#2 buy 1.00 EURUSD at 1.16905]
2018.08.0710:47:20.3402018.08.0100:00:00 order performed buy 1.00 at 1.16905 [#2 buy 1.00 EURUSD at 1.16905]
2018.08.0710:47:20.3472018.08.0100:00:00voidOnTick(), Line = 8: OrderSend(_Symbol,OP_BUY,1,Ask,100,0,0) = 22018.08.0710:47:20.3472018.08.0100:00:00voidOnTick(), Line = 8: OrderSelect(_P(OrderSend(_Symbol,OP_BUY,1,Ask,100,0,0)),SELECT_BY_TICKET) = true2018.08.0710:47:20.3472018.08.0100:00:00#22018.08.0100:00:00 buy 1.00 EURUSD 1.169050.000000.000001.168950.000.00 -10.0002018.08.0710:47:20.3472018.08.0100:00:00voidOnTick(), Line = 11: OrdersTotal() = 12018.08.0710:47:20.3472018.08.0100:00:00ExpertRemove() function called
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
すみません、ロシア語は話せません。
数日前、とても興味深いライブラリを見つけました。 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 はゼロではなく、注文の注文ビットと等しいことがわかります。
どのようなヘルプでも歓迎します。
数日前、とても興味深いライブラリを見つけました。 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
例
結果
結果は、あるポジションが ticket == 2 でオープンされたことを示しています。その後、2回クローズしたため、取引履歴にクローズした「ポジション」が2つ作成されています。チケットは異なりますが、これらの「ポジション」は両方とも OrderTicketOpen == 2 です。つまり、MT5 でポジションをクローズした場合、その履歴チケットはリアルタイムのものと一致しないことに気づく必要があります。
MT5 では、同じリアルタイムのポジションをクローズするときのコメントでさえ、「Hello World!
すみません、ロシア語は話せません。
数日前、とても興味深いライブラリを見つけました。 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 を返す)がある理由がわかりません:
以下に私のテストコードを添付します:
PrintChangesOfMQL5OrderSystemState()は、変更が検出されるたびにMQL5注文システムの状態を表示するストレートフォワード関数です。
テストコードの出力は以下のとおりです(テスターで実行):
HistoryOrderGetInteger(Ticket、ORDER_POSITION_ID)が0ではなく2を返していることがわかります。これが MT4HISTORY::IsMT4Order() が false を返す理由です。
どのようなヘルプでも結構です。つまり、MT4HISTORY::IsMT4Order() 関数の中で、なぜ以下のコード(ポジション ID がゼロの場合、true を返す)があるのか理解できません:
以下に私のテストコードを添付します:
PrintChangesOfMQL5OrderSystemState() は、変更が検出されるたびに MQL5 オーダーシステムの状態を表示する、素直な関数です。
以下はテスト・コード(テスター上で実行)の出力です:
HistoryOrderGetInteger(Ticket、ORDER_POSITION_ID)が0ではなく2を返していることがわかります。これがMT4HISTORY::IsMT4Order()がfalseを返す理由です。
MT5 と MT4 の注文が異なるエンティティであることに気づいていません。
上記で回答 済みです。
MT5での注文とMT4での注文は異なるものであることを理解していない。
MQL5とMQL4の注文システムとその違いは理解しています。
したがって、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 ヘッジの (将来の) ポジション識別子に等しい注文チケットを代入します。これは次のコードで確認できます。
関数MT4OrderSend()のコードをご覧ください。次のように返されます:
コードを実行するときにライブラリが行うことを分析すると、次のようになります。
関数 SelectByHistoryTicket() が、変数 'ticket' に格納したチケットで実行されていることがわかります。
この関数の中でHistoryOrderSelect(ticket)関数が呼び出されます。
私のMQL4のOrderSelect()呼び出しでは 、HistoryOrderSelect(ticket)を自分では呼び出しません。
私のテストコードでのみ、ライブラリ内部で何が起こるかを確認するために、HistoryOrderSelect(ticket)とHistoryDealSelect(ticket)を直接呼び出します:
簡単に言うと、OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)の戻り値によると、ライブラリはMQL4注文システムをエミュレートしていません。
MQL4のオーダーシステムをMQL5上で正しくエミュレートしていません。
MQL4では、関数OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)は期待通りtrueを返します。
私の知る限り、ライブラリの目的はMQL4の注文システムをMQL5で可能な限りエミュレートすることです。ですから
このライブラリを使用すると、関数OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)もtrueを返すと予想されます。
コードを見て、なぜfalseを返す のか調べてみました。
あなたは間違っています。このExpert Advisorをテスターで実行します。
結果
はい、ポジションのオープン後に直接OrderSelect()を 呼び出すとtrueが返されることは知っています。
この場合、私たちはMQL5のポジションをオープンしており、ライブラリはOrderSelect()を 呼び出す際にポジションを見つけます。
これはライブラリの内部関数SelectByExistingTicket()で行われます。
しかし、重要なポイントは、MQL5のポジションがストップロスまたはテイクプロフィットによって クローズされた場合、OrderSelect(ticket)はfalseを返すという ことです。
私のテストコードを実行して確認してください(ブローカーがそれほど近いSLとTPを受け入れない場合は、OrderSend()の拒否を避けるためにそれらを広くしてください)。
しかし、重要なポイントは、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
// 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でこのコード片は関係ありません。