OrderSend() の質問 - ページ 2

 
Yedelkin:
こんな話題は見逃していたようです。KimVのオーダーチェック機能はどこで見ることができますか?
4用ですが、チェックしておくと便利かもしれませんよ。このホームページの「フリーライブラリー」、「ライブラリーの注文」で確認することができます。
 
-Alexey-:
第4版用ですが、参考になるかもしれませんので、ご覧になってみてください。彼のサイトの「フリーライブラリ」という発注用のライブラリで目を通すことができます。

を4から選択してもうまくいきません。を使用しています。

ポジションセレクト

さらに操作するためのオープンポジションを選択します。関数が正常に終了した場合、true を返す。関数が失敗した場合、false を返す。エラーの情報を得るには、GetLastError() 関数を呼び出します。

boolPositionSelect()
文字列記号//ツール名
);

パラメータ

記号

[中略] 金融商品の名称

戻り値

bool 型の値。

備考

各シンボルについて、1つまたは複数の取引の 結果である1つのポジションのみを 常に開くことができます。クライアント端末の「ツールボックス」パネルの「取引」タブにも表示されているポジションと有効な未決済注文を 混在させないようにしてください。

PositionSelect()関数は、位置に関するデータをプログラム環境にコピーし、その後のPositionGetDouble()PositionGetInteger()PositionGetString() 呼び出しは、先にコピーしたデータを返します。つまり、ポジションそのものはもう存在しないかもしれないが(あるいは、ボリュームや方向などが変わっているかもしれない)、このポジションのデータはまだ取り出すことができるのだ。新鮮なポジションデータの取得を保証するために、申請する直前にPositionSelect()関数を呼び出すことを推奨します。

 
sergey1294:

を4つ子から作っても、うまくいきません。PositionSelectを 使用して位置を定義しています。

PositionSelect()関数を使用する際、「...関数が失敗した場合はfalseを返す」というのは気になるところです。つまり、ポジションがない場合だけでなく、PositionSelect()関数が失敗 した場合にも falseが返されます。 つまり、OrderSend()関数がtrueを返し、PositionSelect()関数が falseを返し、それでもポジションが開いているという状況は排除できないのです。
 
papaklass:
このような状況を、1つのティックの前段階、あるいは異なるティックで分析しているのでしょうか?

わかりました、以下から進めていきます。

ティックとは、商品の価格が変化することです。その頻度は、1秒間に数回から1時間に数回と予測不可能である。これに対応して、OrderSend() およびPositionSelect() 関数はティックの動きに依存しないようにしなければなりません。また、そうである以上、ティックの挙動(頻度)とは関係なく、注文が重複しないようにチェックする(対応する状況を分析する)べきだと思うのです。

だから、質問に正確に答えるのは難しいと思うんだ :/。

 
papaklass:

私が質問したのはそういう意味ではないんです。OnTick()イベントハンドラは、次のティックが到着したときに起動されます。このため、質問を言い換えたのです。

これらの状況を1つのOnTick()呼び出しの中で分析するのか、それとも異なる呼び出しで分析するのか?

新しいティック(ユーザーイベント)の到着後、サーバーに取引要求を送信する必要がある場合、この要求の成功の確認は、到着したティック(イベント)の「処理内」で実行されます。つまり、あなたの用語によれば、「1回のOnTick()の呼び出しの中で」です。[また、この処理中に何回ティック(イベント)が来たか(来たはずか)に関係なく]。
 
papaklass:

さて、私はまだ答えを得ることができない1ティックでOrderSend()とPositionSelect()を実行するのでしょうか?

これらのクエリを1ティック内(OnTick()をトリガー)ではなく、2ティックで実行することを提案したいです。

- 一度目は

すなわち、リクエストが正常に応答したら、ポジションオープンのフラグをbuy=trueに設定し、次のティック(OnTick()のトリガー)オペレータが戻るまでOnTick()の実行を中断します。

- 2回目のティック時 - PositionSelect()。

この場合、ポジションオープンの重複はありません。

次のティックで既にポジションがオープンされている保証はありません。 手動で注文を設定した場合に、ポジションがオープンされるまでの時間を測定します。

注文の実行制御をOnTrade()に移すことをお勧めします。このイベントは、取引操作 に対するサーバーの応答としてのみ生成されます。

しかし、なぜ1つの注文につき4つのOnTrade()イベントがあるのか、私にはよくわかりません。

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - Документация по MQL5
 
papaklass:

さて、私はまだ答えを得ることができない1ティックでOrderSend()とPositionSelect()を実行するのでしょうか?

あなたの用語によると、私のOrderSend()とPositionSelect()関数は「1ティック以内」に実行されることが判明しました。

papaklass

...これらのクエリを1ティック(OnTick()のトリガー)内ではなく、2ティック内で実行することを提案したいです。

- 一度目は

つまり、リクエストに成功したら、buy=trueでポジションをオープンするフラグを立て、次のティック(OnTick()のトリガー)オペレータが戻る までOnTick()の実行を中断させるのです。

- 2回目のティック時 - PositionSelect()。

このバリエーションでは、ポジションを重複して開くことはありません。

先ほど、OrderSend()とPositionSelect()関数の実行は、ティックが来る/来ないとは関係ない 、と書きました。そして、その理由を簡単に説明しました。したがって、「2回目のティック時に - PositionSelect()」をチェックしても、すべてのケースで注文が2倍になることはないはずです。

 
Urain:

しかし、なぜ1つの注文につき4つのOnTrade()イベントがあるのか、私にはよくわかりません。

過去にOnTrade()についての記事もありましたね。

ウラン です。

次のティックで既にポジションがオープンしている保証はありません。

というところでしょうか。
 
papaklass:

さて、私はまだ答えを得ることができない1ティックでOrderSend()とPositionSelect()を実行するのでしょうか?

これらのクエリを1ティック内(OnTick()をトリガー)ではなく、2ティックで実行することを提案したいです。

- 一度目は

すなわち、リクエストが正常に応答したら、ポジションオープンのフラグをbuy=trueに設定し、次のティック(OnTick()のトリガー)オペレータが戻る までOnTick()の実行を中断します。

- 2回目のティック時 - PositionSelect()。

この場合、ポジションオープンの重複はありません。

いや~、ダニではありませんね。1秒間に

ここでは簡略化して説明します。

ということで、間髪入れずに2つの注文を立て続けに出すことになります。しかし、私は3秒に設定しました - そして、私はそれを後悔していません )))それでも、順番にオープニングです。


void OnTimer()
{
  while(true)
  {
     zOrderSend (_Symbol,0.1,ORDER_TYPE_BUY);

     Sleep (1); 

   if (PositionSelect(_Symbol)==true) {break;} 
  }
}
 

MT5での注文の会計処理は科学そのもの:OnTrade()関数を使用してExpert Advisorで取引イベントを処理 する

一時停止しても再開の手間が省けるわけではなく、注文の実行に1秒かかるという状況が常に起こり得ます。

ps:そして、マジックも忘れてはいけません。