MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1853

 
EVGENII SHELIPOV #:

わかったわ ロスティスラフ

この関数でフラグをブロックすると、Expert Advisor が一度に 100 ~ 200 件の注文を開いたり閉じたりし始めるのはなぜなのか理解できない。

なぜなら、フラグが "0 "でなければ、常に ClosseAll()関数を呼び出すからです
 
EVGENII SHELIPOV #:

この関数でフラグをブロックすると、EAが一度に100~200の注文を開いたり閉じたりするのはなぜなのか理解できません。

あなたのコードを使って説明しましょう。

初期状態では、フラグが設定されています。

int flag_close=0;
//+------------------------------------------------------------------+

そして、オーダーを開く

//-------------------------------------------------------------------+  Команда на открытие первых ордеров в сетке
   if((UseHour==1 && Hour() >= StartTime && Hour()<=StopTime)||UseHour==0)
     {

クローズオーダー条件が出てきた場合(3つ持っている場合)

//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров при условии (Суммарный профит сетки >=0 и Просадка больше заданного уровня)
   if(CalculiteProfit() >= 0 && Drawdown > DrawdownClosingTakeprofitZero)
     {
      flag_close=1;
//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров
   if((CountTrade(0) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==0)||(CountTrade(1) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==1))
     {
      flag_close=1;
//-------------------------------------------------------------------+  Команда на закрытие первых ордеров
   if((CountTrade(0) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()==0)||(CountTrade(1) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()==1))
     {
      flag_close=1;

このフラグは値 "1 "を取得し、注文の決済を開始します。

//-------------------------------------------------------------------+  Команда на закрытие ордеров
      if(flag_close==1)ClosseAll();

そして、すべての注文が終了すると、フラグは "0 "になる。

   if(CountTrade() == 0)
     {
      flag_close=0;
 
Tretyakov Rostyslav #:
フラグが "0 "でない場合は、常に ClosseAll() 関数を呼び出すからです

この場合、オープン・オーダーというコマンドが与えられていることが条件となります。つまり、一種の「CHECKING」が行われているわけです。

 
EVGENII SHELIPOV #:

この場合、オープン・オーダーというコマンドが与えられていることが条件となります。つまり、一種の「CALCULATION(計算)」が行われているのです。

クレジットカードをお持ちですか?

お店に入ってビールを1本ずつ買い、その都度カードで「0」になるまで支払います。

そして、カードを補充して、またビールを買いに行くのです。

 
Mihail Matkovskij #:

はい、でも同じロットでロックが開くんです。そして、異なる指示の2つの注文が同時に開かれる。そして、ヘッジとは、トレードがドローダウンに入ったときに、トレーダーが同じ方向(私は別の方向と混同しました)に大きなロットで ポジションを開くことで、価格が反転して大きなロットのトレードで利益を上げ、小さなロットのトレードの損失をカバーするか平均0にすることを暗示しています。

ヘッジは絶対にロック、パーシャルロックではなく、全く別のシステムです。

 
Vitaly Muzichenko #:

ヘッジは絶対にロック、パーシャルロックではなく、全く別のシステムです。

でも、ロスクとは言いません。ただ、昨日は混乱しました(私が言ったのは:片方向のポジションではなく、反対方向のポジションを開くべき)。時刻は遅かった。そして今日、自分がどこで間違っていたのかが理解できた。

 
Mihail Matkovskij #:

でも、ロスクとは言いません。ただ、昨日は混乱しました(私が言ったのは:片方向のポジションではなく、反対方向のポジションを開くべき)。時刻はすでに遅かった。そして今日、私は自分の間違いに気づきました。

それなら納得、そんなこともあるんですね :)

 
EVGENII SHELIPOV #:

この場合、オープン・オーダーというコマンドが与えられていることが条件となります。つまり、ある種の "CLICKING "が起こっているのです。

注文のリストを、ティックで、 クローズするために作成する必要があります(すでにここで多くの方がおっしゃっているように)。ロボットが退場のシグナルを検出した場合、対応する注文(チケット)をリストに追加して決済する必要があります。このリストは、終了要求(OrderClose)を送信するサイクルによって渡される。そして、リストに追加されたチケットに未決済の注文があるかどうかを常にチェックする必要があります。もし、1枚以上のチケットが見つからない場合は、リストから削除する必要があります。このようにすることで、存在しない注文の決済要求を送信することがなくなります。

フィルドリストの期間中に現れた新しいシグナルや注文はどうすればいいのですか?また、終了信号で閉じるリストに追加することも可能です。そうすれば、順番に閉じていくこともできます。以上です。このようなリストを作成し、そのチケットで周期的にオーダーをクローズします。サイクルの1パスあたり、1秒や数秒のインターバルで行うことができます。このアルゴリズムさえ実現すれば、すべてがうまくいくのです。

 
Mihail Matkovskij #:

チケットで(すでにここで多くの方がおっしゃっているように)クローズする注文のリストを作成する必要があります。ロボットが終了シグナルを検出したら、対応する注文(チケット)を終了リストに追加します。このリストは、クローズ要求(OrderClose)を送信するループによって渡される。そして、リストに追加されたチケットに未決済の注文があるかどうかを常にチェックする必要があります。もし、1枚以上のチケットが見つからない場合は、リストから削除する必要があります。この方法では、存在しない注文を閉じる要求を送信することはありません。

フィルド・リストの期間中に発生した新しいオーダーはどうするのですか?また、クローズリストに追加することもできます。そうすれば、順番に閉じていくこともできます。以上です。このようなリストを作成し、エチケットの注文を循環的に閉じていく。サイクルの1パスあたり、1秒や数秒のインターバルで行うことができます。このアルゴリズムを実現するだけで、すべてがうまくいくのです。

1つ1つ順番に閉じていくのでしょうか? これだけグリッドが長いと、正しいものを閉じていくことになりますね。
最後のオーダーがクローズするとき、クローズすべきオーダーが10個あることがあり、それを1個ずつクローズしていくので、無限に時間がかかる。

 
Alexander Avksentyev #:

グリッドに時間がかかると、右のものを1つずつ閉じていくことになります。
最後の1つを閉じるとき、閉じるべき注文が10個あることがあるので、それをすべて1つずつ閉じていき、無限に時間がかかる。

というのは、ちょっと違うんです。すべての注文は、端末によって1つずつクローズされる。OrderSend サイクルでは、1秒間に何度もトリガーされることがあります(ハードウェアに依存します)。しかし、OrderSendは、適切なコマンドをクロージングキューに追加するだけ です。そして、端末は これらのコマンドを、指定された時間間隔、または前回のリクエストに対するサーバーの応答を受け取った後に、サーバーに送信する(即時ではない)。つまり、大量の注文(ポジション)は、とにかく1つの注文よりもずっと遅く決済されるのです。