初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 815

 
pivomoe:
ただ、それが普通なのかどうかがわからないんです。

ここはわかりにくいところが多いですね。特に、取引の順序を扱う場合、いくつかのケースで矛盾があることがわかりました。
例えば、ポジションを建てる場合、正式にはまず成行注文を出し、それがポジションに変わる。しかし、このマシンガンのような一連の取引の中で、すでにポジションが開設されているにもかかわらず、まだ注文が閉じられていない状況がある。これは明らかに同じ事象であるが、取引は断片的に整理され、順次発行されており、このアプローチでは市場注文がポジションに変わることを正しく反映することは原理的に不可能である。

私の考えでは、取引管理を整理するのが一番です。取引注文を 記憶し、関連リストに存在するという事実だけで、注文とポジションの構成を監視することができます。
 

鳥といえば。

このような取引では、価格がゼロの成行注文が発行されることをご存知でしょうか。
例えば、1.2000、Sl=1.1000、Tr=1.3000で買いポジションを持ち たい場合。
この取引が実行されると、まず、次のデータで成行注文が表示されます:
Sl= 1.1000, Tr= 1.3000、すなわち指定された数字と Price=0 (ゼロに等しい)です。価格ゼロの成行注文のようなものです :)そして、好きなように考えてください。

 
pivomoe:

便宜上。MqlTradeTransactionから 小さな関数が呼び出されます。必要な要素は、クラスの要素を検索してそこで見つかります。そして、この要素に対して、何か役に立つことをするクラス関数の一つが呼び出されます。


具体的にどのようなものを手に入れたいのか、もう少し詳しく教えてください。なぜ OnTradeTransaction から何かを呼び出しているのですか?

まずは言葉だけ、そして正しい方向に修正する。

 
User_mt5:
ユーザが作成した関数Abc()が実行され、長い(時間的に)アルゴリズムを実装しています。
この機能の実行 中に、例えば、トレード、タイマーなど、いくつかのイベントが発生します。
Abc()関数の実行が終了しなくても、これらのイベントが発生したことを知ることは可能ですか?

1つの機能がカウントされている間、他の機能はすべてスキップされます。

これは、Sleep()関数に似て います。つまり、関数が非常に長い時間カウントしている間、その動作はSleepに似ています - 他のすべてのイベントがスキップされます

 
User_mt5:

...


OnTradeTransactionでは、絶対にすべてが透明です。

第一:MqlTradeTransaction構造体は、取引タイプ(ENUM_TRADE_TRANSACTION_TYPE)に応じて異なる方法で入力さ れます

こちらをご覧ください:貿易取引(MqlTradeTransaction)の仕組み

2つ目:結果を可視化するために、OrderSendAsyncの 例から次のコードブロックを抽出します。

//+------------------------------------------------------------------+ 
//| TradeTransaction function                                        | 
//+------------------------------------------------------------------+ 
void OnTradeTransaction(const MqlTradeTransaction &trans, 
                        const MqlTradeRequest &request, 
                        const MqlTradeResult &result) 
  { 
//--- получим тип транзакции в виде значения перечисления  
   ENUM_TRADE_TRANSACTION_TYPE type=(ENUM_TRADE_TRANSACTION_TYPE)trans.type; 
//--- если транзакция является результатом обработки запроса, выведем только её название 
   if(type==TRADE_TRANSACTION_REQUEST) 
     { 
      Print(EnumToString(type)); 
      //--- выведем строковое описание обработанного запроса 
      Print("------------RequestDescription\r\n",RequestDescription(request)); 
      //--- выведем описание результата запроса 
      Print("------------ResultDescription\r\n",TradeResultDescription(result)); 
      //--- запомним тикет ордера для его удаления на следующей обработке в OnTick() 
      if(result.order!=0) 
        { 
         //--- удалим этот ордер по его тикету при следующем вызове OnTick() 
         order_ticket=result.order; 
         Print(" Тикет отложенного ордера ",order_ticket,"\r\n"); 
        } 
     } 
   else // для транзакций другого типа выведем полное описание 
//--- выведем описание полученной транзакции в Журнал 
      Print("------------TransactionDescription\r\n",TransactionDescription(trans));
 
//---      
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание транзакции                         | 
//+------------------------------------------------------------------+ 
string TransactionDescription(const MqlTradeTransaction &trans) 
  { 
//---  
   string desc=EnumToString(trans.type)+"\r\n"; 
   desc+="Symbol: "+trans.symbol+"\r\n"; 
   desc+="Deal ticket: "+(string)trans.deal+"\r\n"; 
   desc+="Deal type: "+EnumToString(trans.deal_type)+"\r\n"; 
   desc+="Order ticket: "+(string)trans.order+"\r\n"; 
   desc+="Order type: "+EnumToString(trans.order_type)+"\r\n"; 
   desc+="Order state: "+EnumToString(trans.order_state)+"\r\n"; 
   desc+="Order time type: "+EnumToString(trans.time_type)+"\r\n"; 
   desc+="Order expiration: "+TimeToString(trans.time_expiration)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",trans.price)+"\r\n"; 
   desc+="Price trigger: "+StringFormat("%G",trans.price_trigger)+"\r\n"; 
   desc+="Stop Loss: "+StringFormat("%G",trans.price_sl)+"\r\n"; 
   desc+="Take Profit: "+StringFormat("%G",trans.price_tp)+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",trans.volume)+"\r\n"; 
   desc+="Position: "+(string)trans.position+"\r\n"; 
   desc+="Position by: "+(string)trans.position_by+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание торгового запроса                  | 
//+------------------------------------------------------------------+ 
string RequestDescription(const MqlTradeRequest &request) 
  { 
//--- 
   string desc=EnumToString(request.action)+"\r\n"; 
   desc+="Symbol: "+request.symbol+"\r\n"; 
   desc+="Magic Number: "+StringFormat("%d",request.magic)+"\r\n"; 
   desc+="Order ticket: "+(string)request.order+"\r\n"; 
   desc+="Order type: "+EnumToString(request.type)+"\r\n"; 
   desc+="Order filling: "+EnumToString(request.type_filling)+"\r\n"; 
   desc+="Order time type: "+EnumToString(request.type_time)+"\r\n"; 
   desc+="Order expiration: "+TimeToString(request.expiration)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",request.price)+"\r\n"; 
   desc+="Deviation points: "+StringFormat("%G",request.deviation)+"\r\n"; 
   desc+="Stop Loss: "+StringFormat("%G",request.sl)+"\r\n"; 
   desc+="Take Profit: "+StringFormat("%G",request.tp)+"\r\n"; 
   desc+="Stop Limit: "+StringFormat("%G",request.stoplimit)+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",request.volume)+"\r\n"; 
   desc+="Comment: "+request.comment+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание результата обработки запроса       | 
//+------------------------------------------------------------------+ 
string TradeResultDescription(const MqlTradeResult &result) 
  { 
//--- 
   string desc="Retcode "+(string)result.retcode+"\r\n"; 
   desc+="Request ID: "+StringFormat("%d",result.request_id)+"\r\n"; 
   desc+="Order ticket: "+(string)result.order+"\r\n"; 
   desc+="Deal ticket: "+(string)result.deal+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",result.volume)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",result.price)+"\r\n"; 
   desc+="Ask: "+StringFormat("%G",result.ask)+"\r\n"; 
   desc+="Bid: "+StringFormat("%G",result.bid)+"\r\n"; 
   desc+="Comment: "+result.comment+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  }

を作成し、チャートに貼り付けることができるExpert Advisorに貼り付けます。その後、手動でポジションをオープン/クローズし、Experts タブで結果のプリントアウトを見ることができます。

 
Vladimir Karputov:

1つの機能がカウントされている間、他の機能はすべてスキップされます。

これは、Sleep()関数に似て います。つまり、関数が非常に長い時間をカウントしている間、その動作はSleepと非論理的で、すべての残りのイベントがスキップ されます。

ありがとうございます、残念でしたね。
そして、その時にPCのリソースを有効に使うにはどうしたらいいのか。再びループしたコードと、パラメータの定期的なポーリング?

 
Vladimir Karputov:

OnTradeTransactionでは、絶対にすべてが透明です。

返信ありがとうございます、ほぼその通りです。今のところ、洞察よりも疑問の方が多い...。

 
Vladimir Karputov:

具体的にどのようなものを手に入れたいのか、もう少し詳しく教えてください。なぜ OnTradeTransaction から何かを呼び出しているのですか?

まずは言葉だけ、そして正しい方向に修正する。

OnTradeTransactionに問題があるわけではないことが理解できました。見てください、この惨状を。

以下はそのコードです。

 CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
 
 if( !PositionInfoKotiryemii.Select("SBRF-3.18") )Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
 if( !PositionInfoVedygii.Select("SBRF-12.17")   )Print("Не удалось выбрать позицию по символ SBRF-12.17 ");

 Print(PositionInfoKotiryemii.Symbol()," Объем ",PositionInfoKotiryemii.Volume()," ",PositionInfoVedygii.Symbol()," Объем ",PositionInfoVedygii.Volume());

そして、その実行結果がこちらです。

2017.09.22 10:30:12 Failed to select position by symbol SBRF-12.17
2017.09.22 10:30:12Volume 0.0 Volume 0.0

2行目と3行目を入れ替えると、次のようなコードになります。

CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
 
 if( !PositionInfoVedygii.Select("SBRF-12.17")   )Print("Не удалось выбрать позицию по символ SBRF-12.17 ");
 if( !PositionInfoKotiryemii.Select("SBRF-3.18") )Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
 
 Print(PositionInfoKotiryemii.Symbol()," Объем ",PositionInfoKotiryemii.Volume()," ",PositionInfoVedygii.Symbol()," Объем ",PositionInfoVedygii.Volume());

こんな結果が出るんです。

2017.09.22 10:30:12 シンボルによる位置の選択に失敗 SBRF-12.17
2017.09.22 10:30:12SBRF-3.18 Volume 1.0 SBRF-3.18 Volume 1.0

どちらの場合も、コンパイラによる警告は 発生しません。80行のExpert Advisorのコードとテストの設定を添付します。ブローカーBCSバージョン1730です。

Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
  • www.metatrader5.com
На данной вкладке отображается журнал компиляции программ, содержащий сообщения об использованных при компиляции файлах, а также ошибки и предупреждения, возникшие в этом процессе. — описание события. Иконки, расположенные слева от описания свидетельствуют о типе события. означает ошибку, — предупреждение, а — информационное сообщение; Если...
ファイル:
temp.mq5  7 kb
1.png  11 kb
 
pivomoe:

OnTradeTransactionに問題があるわけではないことに気づきました。見てください、この惨状を。

以下はそのコードです。

そして、その実行結果がこちらです。

2017.09.22 10:30:12 Failed to select position by symbol SBRF-12.17
2017.09.22 10:30:12Volume 0.0 Volume 0.0

2行目と3行目を入れ替えると、次のようなコードになります。

こんな結果が出るんです。

2017.09.22 10:30:12 シンボルによる位置の選択に失敗 SBRF-12.17
2017.09.22 10:30:12SBRF-3.18 Volume 1.0 SBRF-3.18 Volume 1.0

どちらの場合も、コンパイラによる警告は 発生しません。80行のExpert Advisorのコードとテストの設定を添付します。ブローカーBCSバージョン1730です。

今週末に返信します。すみません。

 

1行(Print)で、複数のポジションの情報を取得しようとすると、エラーが発生するようです。

1(選択された)ポジションの情報のみ、いつでも利用可能です。

- 2番目のケースでは、最後の Selectがtrueを返すので、正しいです。

- そして、最初のケースでは、最後のSelectがfalseを返すので、これもチェックしておらず、結果は予測不可能です。

......明らかにSelect==falseは、直前のSelect==trueの情報をリセットします。

理由: