デベロッパーズ!作ったものをテストしたりもするのですか? - ページ 6

 
Mikalas:

注文が変更された場合、どのように制御するのか(サーバーの応答なしで)教えていただけませんか?

注文を変更すると、いくつかのイベントが発生します。私はこれらのイベントをすべてコントロールし、保留中のタスクが保留リストにある時間もコントロールします。

私はフォートロボットで1セッションあたり500-600の取引をしていますが、今のところイベントの損失はありません。つまり、待機中のタスクはすべて実行され、タイマーチェックに達することはありません。

 
Yurich:

イベントモデルは定義上、完全に信頼できるものではありません。イベントが到達しなかったとしても、それが起こらなかったというわけではありません。

イベントの一部が到達し、一部が到達しない場合、コマンド結果の処理を保証するために、前回と比較して状態を確認するようなコードのブロックが重複して必要になる、などです。では、重複するコードが絶対に確実に動作するのであれば、なぜイベントに基づいて構築されたコードを使うのか、という疑問があります。なぜ、イベントドリブンではない1つのコードではなく、2つのコードを使用するのですか?冗長性を持たせるため?
 
Yurich:

注文を変更すると、いくつかのイベントが発生します。私はこれらのイベントをすべてコントロールし、また待機中のタスクが待機リストにある時間もコントロールします。

私のフォートロボットは1セッションあたり500~600回の取引を行いますが、今のところ損失イベントはありません。つまり、待機中のタスクはすべて実行され、タイマーチェックに達することはありません。

今の方が面白い...。では、期待した事象が結局来なかったというケースはないのですか?
 
C-4:
今の方が面白い...。では、これまで予想された事象が来なかったケースはないのですか?
イベントの損失がないと言ったのは、待機リストに入れられたタスクは、そのイベント(重要なイベントの連鎖の少なくとも1つ)を待つという意味です。もしかしたら、Michaelが言うようなイベントのロスがあるかもしれません。私はイベントのログをとっていませんが、私のイベントモデルの全体的な機能には影響しません。
 

to:マイケル

一般的に、何らかの形で状況が解決するまでは、追加チェックをした方が楽です。

int dealsCount = 0;
///
/// С заданной периодичностью синхронизируем количество обработанных и поступивших трейдов.
///
void OnTimer(void)
{
   if(dealsCount != HistoryDealsTotal())
   {
      //Пришли новые трейды. их нужно обработать
      for(int i = dealsCount; i < HistoryDealsTotal(); i++)
      {
          ulong ticket = HistoryDealGetTicket(i);
          DealChecking(ticket);
      } 
   }
}

///
/// Поступило новое событие о поступлении трейда.
///
void  OnTradeTransaction(
      const MqlTradeTransaction&    trans,
      const MqlTradeRequest&        request,
      const MqlTradeResult&         result
   )
{
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
     DealChecking(trans.deal);
   ...
}

///
/// Обработчик трейдов.
/// \param ticket - Уникальный идентификатор трейда, который надо обработать.
void DealChecking(int ticket)
{
   
   // Далее идет нужная обработка.
   ...
   //Трейд обработан - увеличиваем количество обработанных трейдов.
   dealsCount++;
}

この実装では、"new trade "イベントの実際のハンドラは1つだけなので、冗長になることはありません。しかし、それはタイマー経由とOnTradeTransaction イベント経由の2つの異なる方法で呼び出されます。何らかの理由で新規取引が OnTradeTransaction イベントを呼び出して いない場合、合計金額と処理済 みの取引金額の非同期が 発生します。この場合、未処理の取引はすべてforループでDealCheckingハンドラに到達することになります。

この方式はTRADE_TRANSACTION_DEAL_ADDに 限らず、あらゆるイベントに対して制限 することが可能である。
 
Mikalas:

...

P/S そして、「文章を切り取る」必要はなく、全体の文章はこのように始まります。

取引の種類を知ること で、取引口座の注文、ポジション、取引の現在の状況を分析することを決定できます。

詳細はいつでもヘルプで確認することができます。

それ以外のことは、ゆりっちさ んと同じ意見です。スキームも考え直した方がいいでしょうね。

 

同業者の皆様へ

皆様、ご意見ありがとうございました。

じゃあ、プラットフォームは何のためにあるんだ」と、虫唾が走る。

 

Mikalas:

では、なぜ "PLATFORM "が必要なのでしょうか?

それは多分、修辞的な質問だったのでしょう :)そうでない場合は、このスレッドですでに答えが出されています。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

デベロッパーズ!作ったものをテストしたりもするのですか?

C-4, 2013.12.10 12:08

おすすめしません。このバグをMQと一緒に修正するのは、プラザ用の新ターミナルを自前で作るよりずっと簡単です。延々とバグフィックスに追われ、「標準機能」を書いていると、泥沼にはまります。自分の経験から言っているんです。私は、Stock#をベースにした自作コンプレックスの1つを開発しました。サポートサービスと一緒に戦ったほうが、楽だし、安上がりだよ。
私も端末の全てに不満があります。例えば、「ラストプライス」の姿勢です。しかし、証券会社の人たちが集まってくれば、MQは彼らのニーズに耳を傾けるようになるでしょうね。
 
MT5の本当の代替品は何ですか?
 
Armen:
MT5の本当の代替品は何ですか?

このようなスレッドを立てる前に、まさに自問自答する必要があるのです。MT5が登場する以前は、FORTSで取引するためには、少なくとも自分で取引端末を書く必要があったのです。この分野で既製のソリューションがないとすれば、アルゴリズム取引にほとんど適用できないQuickは別として(かつてQPileで1000行以上のプログラムを書いた人なら、私が何を言っているか理解できるでしょう)、そのようなものはありません。Stock#のライブラリの補助セットもありますが、本格的な取引端末の「箱から出して取引する」(run and trade)には発展していないようです。実際、Stock#を使用して取引プラットフォームを作成するには、平均的または高いスキルを持つプログラマーでも6ヶ月はかかると言われています。プログラマー初心者は、この製品に圧倒されるでしょう。Kofite、TSLab、WealthLabなどの端末もあります。しかし、これらはブローカーによって直接サポートされていないため、Quick +お使いのSuper Trading Platform(DDEによるデータ転送のすべての関連問題を含む)で対応しなければならないことを明確に理解する必要があります。そして、あなたはプロトコルPlazaIIを介して動作するようにしたい場合 - 月額3 000ルーブルのために、ブローカーは、このような機会を提供します。

ブルジョア層では、状況は良くはない。すべてのアメリカのブローカーが、アルゴトレーディングが可能な取引プラットフォームを提供しているわけではありません。すべてのアメリカのブローカーがロシアから仕事をすることが可能なわけではありません。APIを渡されると良いですね。そしてまた、このAPIのために自分たちで自転車を書くことになるのです。それだけでなく、提供するプラットフォームも、異なる市場セグメントに向けられ、あまりにも異なっています。Wealth-LabとThinkOrSwimを比べてみてください。規格がなく、統一されたインターフェースもない。

一般的に、あなたのモットーが「平和を夢見るだけ」または「新しいソフトウェアをテストし、次の自転車を書くためにトレードする」のであれば、MetaTrader5以外のプラットフォームを探す必要があります。