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

 
if(OrderSelect(ticket, SELECT_BY_TICKET)){
      double lots;
      string symbol = OrderSymbol(); 
      while(true){
         RefreshRates();
         double price;
         parseClosePrice(OrderType(), symbol, price);
         if(OrderClose(OrderTicket(), OrderLots(), price, 500)){
            break;
         }else{
            Print(GetLastError());
         }              
         Sleep(1000);
      }   

エラー4108を返すことがあります - OrderCloseのチケットが間違っています。OrderTicket()がOrderSelectの チケットと一致しない可能性はありますか?チケット変数はゼロに等しいことができます。

エラーの再現に時間がかかる、問い合わせがしやすい。
 
Dmitri Custurov:

エラー4108を返すことがあります - OrderCloseのチケットが間違っています。OrderTicket()がOrderSelectのチケットと一致しない可能性はありますか? チケット変数はゼロに等しいことができます。

エラーの再現に時間がかかる、問い合わせがしやすい。

チケットで注文を選択 します。選択した注文がすでに終了していないことを確認していますか?しかし、もう一度閉じようとすると・・・。チケット選択成功後、終了時刻を確認してください。

 
Artyom Trishkin:

チケットに記載されている順番を選択して います。また、選択した注文がすでに終了していないことは確かですか?でも、また閉めようとしているんですね。チケットで選択成功後の終了時刻を確認する。

エラーが再現されたら確認してみます。私はすべてのチケットをグローバル変数に格納しています。注文が終了すると、それらは削除されます。OrderSelect()の前に、グローバル変数からチケットを取得します。チケットが変数にない場合 - この変数は0になり、したがって、注文は選択されるべきでなく、OrderSelect()はfalseを返すでしょう。しかし、一般的には、そう、確認する価値があります。ありがとうございます。

 
Dmitri Custurov:

エラーが再現されたら確認してみます。私はすべてのチケットをグローバル変数に格納しています。注文が終了すると、それらは削除されます。OrderSelect()の前に、グローバル変数からチケットを取得します。チケットが変数にない場合 - この変数は0になり、したがって、注文は選択されるべきでなく、OrderSelect()はfalseを返すでしょう。しかし、一般的には、そう、確認する価値があります。ありがとうございます。

チケットで注文が選択された場合、終値を確認するのが標準的です。注文がクローズされてクローズドオーダーのリストから選択されているのか、それともまだオープンされていてマーケットオーダーのリストから選択されているのか、他の方法ではわからないでしょう。

最も近視眼的な方法は、グローバル 変数にチケットを格納することです。取引環境から取得する必要があります - 現在の情報はそこにあります。

 
Artyom Trishkin:

チケットで注文が選択された場合、終値を確認するのが標準的です。注文がクローズされクローズドリストから選択されたのか、それともまだオープンされていてマーケットリストから選択されたのかは、他の方法ではわかりません。

グローバル 変数にチケットを格納するのは最も短絡的である。取引環境から取得する必要があります - 現在の情報はそこにあります。

OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)のように選択すると、部分的に解決するのでしょうか。私は別の理由でチケットをグローバル変数に保存しているのですが、まあ、今回もそれを使いました。

 
Dmitri Custurov:

OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)のように選択すると、部分的に解決するのでしょうか。私は別の理由でチケットをグローバル変数に保存していますが、今回もそれを使いました。

プール(MODE_TRADES)は、チケットによる選択時に無視されます。

 
Dmitri Custurov:

エラー4108を返すことがあります - OrderCloseのチケットが間違っています。OrderTicket()がOrderSelectのチケットと一致しない可能性はありますか? チケットの変数がゼロになる場合があります。

エラーの再現に時間がかかるので、問い合わせる方が楽です。

通常、成行注文の有無を確認する程度で十分です。

OrderCloseTime() == 0 //注文がオープンされている

OrderCloseTime() > 0 //オーダーがクローズされる

指値注文の場合、終値も 確認する必要があります。終値が0であれば、指値注文はキャンセルされたことになります。

 
皆さん回答ありがとうございました、了解です ))
 

こんにちは。

できれば、PositionClosePartialメソッドを使ったコードを共有してください。

理論的には理解できるのですが、実際に動くコードが見たいのです。

あるいは、どこを見ればいいのかアドバイスしてください。

よろしくお願いします。

 
odyn:

こんにちは。

できれば、PositionClosePartialメソッドを使ったコードを共有してください。

理論的には理解できるのですが、実際に動くコードが見たいのです。

あるいは、どこを見ればいいのかアドバイスしてください。

事前に感謝しています。

実はこれ、たった1行のコードなんです。でも、そのためにはポジションチケットを手に入れなければならない。ここでは、OnInitから0.2ロットのポジションをオープンし、OnTickでポジションの半分をクローズするExpert Advisorを紹介します。

//+------------------------------------------------------------------+
//|                                                           00.mq5 |
//|                                          © 2020, Alexey Viktorov |
//|                     https://www.mql5.com/ru/users/alexeyvik/news |
//+------------------------------------------------------------------+
#property copyright "© 2020, Alexey Viktorov"
#property link      "https://www.mql5.com/ru/users/alexeyvik/news"
#property version   "1.00"

#include <Trade\Trade.mqh>
CTrade trade;
ulong posTicket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
 {
  trade.SetExpertMagicNumber(111);
  trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, 0.2, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0.0, 0.0);
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 {
//---
 }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
 {
  if(PositionSelectByTicket(posTicket) && PositionGetDouble(POSITION_VOLUME) > 0.1)
    trade.PositionClosePartial(posTicket, 0.1);
 }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
 {
//---
  if(trans.type == TRADE_TRANSACTION_HISTORY_ADD)
   {
    if(PositionSelectByTicket(trans.position) && PositionGetInteger(POSITION_MAGIC) == 111 && PositionGetString(POSITION_SYMBOL) == _Symbol)
      posTicket = PositionGetInteger(POSITION_TICKET);
   }
 }
//+------------------------------------------------------------------+

また、以下はCTrade クラスのフルコードです。

//+------------------------------------------------------------------+
//| Partial close specified opened position (for hedging mode only)  |
//+------------------------------------------------------------------+
bool CTrade::PositionClosePartial(const ulong ticket,const double volume,const ulong deviation)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- for hedging mode only
   if(!IsHedging())
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean
   ClearStructures();
//--- check filling
   if(!FillingCheck(symbol))
      return(false);
//--- check
   if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      //--- prepare request for close BUY position
      m_request.type =ORDER_TYPE_SELL;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_BID);
     }
   else
     {
      //--- prepare request for close SELL position
      m_request.type =ORDER_TYPE_BUY;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
     }
//--- check volume
   double position_volume=PositionGetDouble(POSITION_VOLUME);
   if(position_volume>volume)
      position_volume=volume;
//--- setting request
   m_request.action   =TRADE_ACTION_DEAL;
   m_request.position =ticket;
   m_request.symbol   =symbol;
   m_request.volume   =position_volume;
   m_request.magic    =m_magic;
   m_request.deviation=(deviation==ULONG_MAX) ? m_deviation : deviation;
//--- close position
   return(OrderSend(m_request,m_result));
  }
ファイル:
00.mq5  5 kb