フォルツァ執行上の問題点 - ページ 7

 

こんにちは。

キングダムがおかしい

1

作業に進展はありますか?

 
Mikalas:

こんにちは。

キングダムで何かが起こっている

作業に進展はありますか?

そうですね、いろいろと進歩がありますね。

今週、新しいビルドをリリースします。サーバーが更新されると、加速が見られるようになります。作品はまだ進行中です。

 
Renat:

そうですね、進歩は素晴らしいです。

今週中に新しいビルドをリリースし、サーバーが更新されると、加速度が表示されるようになる予定です。作品はまだ進行中です。

よくぞ言ってくれました。楽しみにしています。
 

レナートさん、こんにちは。

米国でMT5を使用しているブローカーはありますか?

先物取引?

 
まだです。
 
Renat:
まだです。
その計画は遠いものですか、それとも近い将来のものですか?
 
Mikalas:
その計画は遠いものですか、それとも近い将来のものですか?
ニュースが入り次第、掲載する予定です。
 

レナートさん、こんにちは。

OnTradeTransaction ハンドラの改良は予定されていますか?

 
具体的にはどのようなことでしょうか?
 
Renat:
具体的にはどのようなことでしょうか?

こんにちは。

画像は、注文を保留 した状態での動作のログを表示しています。

void OnTradeTransaction( const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result )
{
  Print( "Type = ", EnumToString(trans.type), "; State = ", EnumToString( trans.order_state ), "; Retcode = ", result.retcode );
}

設置→変更→撤去

なぜ重複しているのか(赤丸で囲った部分)?

また、リターンコードもありません。

例えば、注文は私が削除することもできますが、ブローカーが削除することもできますし、注文の有効期限が切れていることもあるかもしれません。

なぜわかるのか?

次に、保留中の注文を設定する方法を見てみましょう。

OrderSendAsyncコマンドを送信することで、リクエスト番号を取得する req_id = result.request_id

if ( OrderSendAsync( request, result ) )
  {
    if ( result.retcode == TRADE_RETCODE_PLACED ) 
    {
      req_id = result.request_id;
    }
  }

OnTradeTransactionでは、注文が設定された(チケットを取得した)かどうかの回答(result.retcode)を即座に得ることができます。

void OnTradeTransaction( const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result )
{
 // Print( "Type = ", EnumToString(trans.type), "; State = ", EnumToString( trans.order_state ), "; Retcode = ", result.retcode );

  switch( trans.type )
  {
    case TRADE_TRANSACTION_REQUEST:      if ( trans.order_state == ORDER_STATE_STARTED )
                                         {
                                           if ( ( req_id != 0 ) && ( result.request_id == req_id ) )
                                           {
                                             if ( result.retcode == TRADE_RETCODE_PLACED )
                                             {
                                               ticket = result.order;
                                             }
                                             req_id = 0;   
                                           }
                                         }
                                         break; 
}    

なぜ、あと3つもメッセージが必要なのでしょうか。

EI      0       20:45:15.932    Forts_trader (SBRF-3.15,H1)     Type = TRADE_TRANSACTION_ORDER_ADD; State = ORDER_STATE_STARTED; Retcode = 0
GD      0       20:45:15.932    Forts_trader (SBRF-3.15,H1)     Type = TRADE_TRANSACTION_ORDER_UPDATE; State = ORDER_STATE_REQUEST_ADD; Retcode = 0
KI      0       20:45:15.961    Forts_trader (SBRF-3.15,H1)     Type = TRADE_TRANSACTION_ORDER_UPDATE; State = ORDER_STATE_PLACED; Retcode = 0

もし、もう全部わかっているのなら

次に、改造です。

なぜ、メッセージが必要なのか。

KI      0       20:45:36.879    Forts_trader (SBRF-3.15,H1)     Type = TRADE_TRANSACTION_ORDER_UPDATE; State = ORDER_STATE_REQUEST_MODIFY; Retcode = 0

もし、このアクションの結果がどうせわからない(Retcode = 0)のなら?

注文を変更するコマンドを送信することで、設定する場合と同様に、変更されることが既に分かっている(繰り返しチケットを取得し、result.retcode == TRADE_RETCODE_PLACED )。

Retcode = MODIFY_DONE をメッセージに 追加すると、より有益な情報が得られます。

RN      0       20:45:36.895    Forts_trader (SBRF-3.15,H1)     Type = TRADE_TRANSACTION_ORDER_UPDATE; State = ORDER_STATE_PLACED; Retcode = MODIFY_DONE
Ну и с удалением ордера та же история, получив TRADE_TRANSACTION_REQUEST и result.retcode == TRADE_RETCODE_PLACED мы уже знаем, что ордер в состоянии удаления.
Да и вообще, зачем знать переходные состояния ордера, если с ним, в этот момент, ничего нельзя сделать? 
Т.е для отслеживания команд и состояния ордера
достаточно Type = TRADE_TRANSACTION_REQUEST и  result.retcode == TRADE_RETCODE_PLACED для понимания, что команда исполнена и происходит действие
А для результата действия достаточно   Type = TRADE_TRANSACTION_ORDER_UPDATE; State = ORDER_STATE_PLACED; Retcode = PLACE_DONE | MODIFY_DONE | CANCELED_DONE | OTHER_ERRORS
理由: