受注サイクルの整理 - ページ 5

 
Vasiliy Sokolov:

ループは最も危険なプログラミング技術の1つです。解析がほとんど不可能な、頻度の低い奇妙なエラーが発生します。

逆に、ループさせるのではなく、できるだけ早くユーザースレッドを終了させるようにする必要があります。もし、あなたが脈拍を保ちたいなら - MT5でOnTradeTransactionを分析してください。MT4は一般に、「単純は窃盗にあらず」と言われるように、このようなゲームには不向きです。

具体的な実感ではなく、どんな間合いでもTSが揺らぐという原理を意味したのです。まあ、どこにひどいこだわりがあるのか、それはわからない。なぜ、ユーザースレッドの終了を急ぐのか、その理由は不明です。

 
fxsaber:

では、そこで怖いのはどこでループしているのか......それは不明です。

OnTickからOnTickを呼び出すと、再帰による非自明なループが発生します。

// Редкий, но правильный костяк модификации ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
  if (OrderSelect(i, SELECT_BY_POS))
    if (OrderModify(OrderTicket(), Price, SL, TP, OrderExpiration()))     
    {
      i = OrdersTotal(); // Хотя бы так
      
      // А лучше так
      // OnTick(); break; // вместо строки выше лучше делать такой вызов (переполнения стека от рекурсивных вызовов быть не должно)
    }

なぜユーザースレッドの終了を急ぐのか、その理由も明らかではありません。

イベントドリブンのモデル で作業しています。そのため、現在のイベントをできるだけ速く処理して、次のイベントを待つ必要があります。スレッドに費やす時間はブラックホール。フローの中で過ごす時間が長くなればなるほど、取引環境は時代遅れになります。

 
Vasiliy Sokolov:

OnTickからOnTickを呼び出すと、再帰による非自明な ループが発生します。

どうやら、これだけが抑止力になっているようだ。

イベントモデルで作業しています。したがって、次のイベントを待つために、現在のイベントをできるだけ速く処理する必要があります。流れの中で過ごす時間は、ブラックホールです。フローの中で過ごす時間が長ければ長いほど、取引環境は時代遅れに なります。

そんなことないですよー。
 
:
void OnTick()
{
   for(int i = 0; i < symbols.Total(); i++)
   {
      request.symbol = symbols.At(i); 
      OrderSendAsynch(request, result); // Начиная с этой строки, анализировать торговое окружение в текущем потоке не имеет смысла
                                        // Единственная верная стратегия - как можно быстрее завершить цикл, и выйти из OnTick
                                        // Для дальнейшего анализа например в OnTransaction
   }
}

s. お互いに全く理解できない。私たちの間に対話はあり得ないと思うんです。

 
Vasiliy Sokolov:
:

コードのどこに間があったのか、その間があるだけでTSを一から揺り戻す理由になるのか。持っていないのか!?

 
fxsaber:

コードのどこに間があったのか、その間があるだけでTSを一から揺り戻す理由になるのか。持っていないのか!?

つまり、このコードは、現在のスレッドをできるだけ早く終了させなければならない理由を説明するものなのです。OnTickで取引環境を要求しようともしないはずです。

void OnTick()
{
   for(int i = 0; i < symbols.Total(); i++)
   {
      request.symbol = symbols.At(i); 
      OrderSendAsynch(request, result); // Начиная с этой строки, анализировать торговое окружение в текущем потоке не имеет смысла
                                        // Единственная верная стратегия - как можно быстрее завершить цикл, и выйти из OnTick
                                        // Для дальнейшего анализа например в OnTransaction      
   }
   // Далее торговое окружение начинает меняться. Мы не можем анализировать его в OnTick
   // Бессмысленно зацикливать OnTick дальше.
   // Результат работы этого кода будет неопределен
   Sleep(50);
   int total_1 = OrdersTotal();
   Sleep(50);
   int total_2 = OrdersTotal();
   //Результат операции не определен
   if(total_1 == total_2)
}

一旦、2つの変数を比較する段階になってしまうと、環境はどんどん変化していくので、比較することはできません。total_1 と total_2 の値が互いに等しくなくなったか、両方とも古くなっているか、既存の注文 数を含んでいないか、正しい値を含んでいます。OnTickで取引環境の変化と戦うことは無意味であり、代わりにforループの直後にOnTickを終了し、取引環境が変化したことを示す新しいイベントを待つだけでよいのです。

 
Vasiliy Sokolov:

つまり、このコードは、現在のスレッドをできるだけ早く終了させるべき理由を説明するものです。OnTickで取引環境の問い合わせを行おうとしてもできません。

一旦、2つの変数を比較する段階になってしまうと、環境はどんどん変化していくので、比較することはできません。total_1 と total_2 の値が互いに等しくなくなったか、両方とも古くなっているか、既存の注文 数を含んでいないか、正しい値を含んでいます。OnTickで取引環境を変えることに苦労するのは無意味で、代わりにforループの直後にOnTickを終了させ、取引環境が変わったことを示す新しいイベントを待てばいいのです。

じゃあ、なんでポーズを入れたんだ!?


もう一度、一時停止(スリップまたは同期取引注文)の後、TCは揺り動かされなければなりません - 取引ロジックはゼロから開始されなければなりません。したがって、非同期売買注文を使用する場合、前述の休止は発生せず、新しいイベントを待ってEvent-Functionからの終了がある。非同期処理がない場合は、取引ロジック全体をループスクリプトにすることも可能です。

 
fxsaber:

じゃあ、なんでポーズを入れたんだ!?

もう一度言いますが、一時停止(スリップまたは同期取引注文)の後、TSを再起動する必要があります - 取引ロジックをゼロから開始する必要があります。したがって、非同期売買注文を使用する場合、前述の休止は発生せず、新しいイベントを待ってEvent-Functionからの終了がある。非同期処理がない場合は、取引ロジック全体をループスクリプトにすることも可能です。

私はトーマスのことを話し、あなたはユーリーのことを話してください。要するに、対話を終わらせようということです。自分だけのループスクリプトを作り続けてください。はい、本当に効きますが、作業方法として推奨はできません。

 

MT4でこのような状況になった場合、どのように対処しているのか、その意見を知りたいです。


Expert AdvisorのToRは、保留中の注文やオープンポジションを、現在の価格から一定の距離に保つことを、1ティックごとに行います。


ブローカーの修正は、価格のティック間の平均時間間隔より少し長くしてください。


そこで、逆サイクル(SELECT_BY_POSの減少方向)で実行し、対応するOrderModifyを作成する。


そのため、OnTickに詰め込まれたこのループの中では、以下のようなことが起こる可能性があります。

  1. OrdersTotalは増加する可能性があります(開封済みや部分的な充填など、手作業による)。
  2. 保留中の注文やポジションの再インデックス化が発生する場合があります(例えば、保留中の注文がサイクル中に実行されたり、保留中の注文が手動で削除されたり、保留中の注文がPingの短いマシンに配置されたりしています)。
  3. 1点目、2点目でもOrderSelect、OrderModifyのエラーは発生しない。ただ、P.1/2のため、サイクル中にいくつかのオーダー/ポジションが欠落してしまいます。

どうすればいいのか?

この質問は、上記の議論と間接的に関連していますが、これはその続きのためではありません(トピックは終了しました)。MT4OrdersをMT5で使用する際、明らかでないニュアンスを解決する必要があります。そこで、具体的にMT4が得意な方から、記載されている状況についてご意見を伺えればと思います。そして、その有用性を実感できるのは、私だけではないでしょう。


OnTimerで問題を解決する - これが最初の提案でしょう。しかし、私たちはそれを必要としません - OnTickのみ。

 
fxsaber:

MT4でこのような状況になった場合、どのように対処しているのか、その意見を知りたいです。


Expert AdvisorのToRは、保留中の注文とオープンポジションを 現在の価格から一定の距離に保つことであり、すべてのティックで。


ブローカーの修正は、価格のティック間の平均時間間隔より少し長くしてください。


そこで、逆サイクル(SELECT_BY_POSの減少方向)で実行し、対応するOrderModifyを作成する。


そのため、OnTickに詰め込まれたこのループの中では、以下のようなことが起こる可能性があります。

  1. OrdersTotalは増加する可能性があります(開封済みや部分的な充填など、手作業による)。
  2. 保留中の注文やポジションの再インデックス化が発生する場合があります(例えば、保留中の注文がサイクル中に実行されたり、保留中の注文が手動で削除されたり、保留中の注文がPingの短いマシンに配置されたりしています)。
  3. 1点目、2点目でもOrderSelect、OrderModifyのエラーは発生しない。ただ、P.1/2のため、サイクル中にいくつかのオーダー/ポジションが欠落してしまいます。

どうすればいいのか?

この質問は、上記の議論と間接的に関連していますが、これはその続きのためではありません(トピックは終了しました)。MT4OrdersをMT5で使用する際、明らかでないニュアンスを解決する必要があります。そこで、具体的にMT4が得意な方から、記載されている状況についてご意見を伺えればと思います。そして、その有用性を実感できるのは、私だけではないでしょう。


OnTimerで問題を解決する - これが最初の提案でしょう。しかし、それをスキップして、OnTickだけにしましょう。

まず、状況が非標準的であり、解決した人がいたとしてもごくわずかであること。

純粋に理論的に。

OrderModifyの逆ループをアレンジする必要はないので、ダイレクトにやってしまいましょう。

int i, total = OrdersTotal();
for(i = 0; i < total; i++)

次に、注文リストの変更を確認します。

if(total != OrdersTotal())
 {
  i = 0;
  total = OrdersTotal();
  continue;
 }

注文量が変化した場合は、新しい注文量で新たにこのループを開始します。

もう1つ質問です。

fxsaber

  1. OrdersTotalは増加する可能性があります(開封済みや部分的な充填など、手作業による)。
  2. 保留中の注文やポジションの再インデックス化が起こる場合があります(例えば、ある保留中の注文がサイクル中に実行された、またはある保留中の注文が手動で削除 された、ある保留中の 注文がショートピンで配置されたなど)。
  3. 1点目、2点目でもOrderSelect、OrderModifyのエラーは発生しない。ただ、P.1/2によるサイクルの間に、いくつかのオーダーやポジションが欠落して しまうのです。

追加された場合、彼らや他の人が寂しくなるのは理解できる。しかし、単に削除されただけだとしたらどうでしょう?注文書から先に進めなくなるのでは?