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

 

ごあいさつ有能なビデオ「MQL4からMQL5へ~メタトレーダー5用EAの書き換え 方~」を拝見しました。
著者に感謝します。自分でもやってみようと思いました。自分でもやってみようと思ったんです。考え方は次のとおりです。
1.入力-買いが開くでdtriger = 1としました。
2.dtriger = -1 - Sell opensに設定しました。
3.dtriger = 0に設定したところ、開いているものはすべて閉じられました。
MT5のマニュアルには、反対のポジションを持つことはできないと書いてあったのですが。
と持っています。
質問:既存のポジションの決済を正しく規定する方法について
問題は、既存のポジションのクローズと逆のポジションのオープンをどのように正しく登録するかということです。
ありがとうございました。

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo   o_position;
CTrade        o_trade;
CSymbolInfo        o_symbol;
COrderInfo         o_order;

input int          triger            = 0;
input double    StartLot             = 0.01;
input double    lpos_volume       = 1.0;
input int          Step         = 10;
input int          MagicNumber    = 12345;      //      Magic   nuaber
input int          Slippage          = 30;         //   slippage

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   dStep = Step ;
   dtriger = triger ;

   if (!o_symbol.Name(Symbol()))
     return(INIT_FAILED);
   
   RefreshRates();
   
   o_trade.SetExpertMagicNumber(MagicNumber) ;

   if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
   { 
      o_trade.SetTypeFilling(ORDER_FILLING_FOK);
   }
   else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
   { 
      o_trade.SetTypeFilling(ORDER_FILLING_IOC);
   }
   else 
   {
      o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
   }
      o_trade.SetDeviationInPoints(Slippage);
   
   if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
   {
      dStep = 10 ;
   }
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      datetime              lpos_time          =        0;
      double                lpos_price_open    =        0.0;
      ENUM_POSITION_TYPE   lpos_type           =        -1;
      int                      pos_count               =        0;
      double                sum_profit         = 0;
 
   for (int i = PositionsTotal() - 1; i>=0; i--)
   {
      if (o_position.SelectByIndex(i))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            if (o_position.Time() > lpos_time)
            {  
               lpos_time       = o_position.Time();            //OrderOpenTime();
               lpos_price_open = o_position.PriceOpen();       //OrderOpenPrice();
               lpos_type       = o_position.PositionType() ;   //OrderTipe();
             }  
            
            pos_count++;
            sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
          }     
       }     
    }          

   // Считаем кол-во отложенных ордеров
  int stop_count=0;

   for (int i=OrdersTotal()-1; i >=0; i--) 
   {
      if (o_order.SelectByIndex(i)) 
      {
         if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber) 
           stop_count++;
      }
   }

   if (!RefreshRates())
     return ;
     
   if(dtriger == 0 )
   {
      CloseAll();
      return;               
   } 
   
  // + -----    Откраваем Первый ордер   ++++++++++
 if (pos_count == 0  && stop_count == 0    )
   {
      if ( dtriger == -1 &&  lpos_type != POSITION_TYPE_SELL)
      {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());  //   S E L L   11111
      }
      
      if ( dtriger == 1 &&  lpos_type != POSITION_TYPE_BUY )
      {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());   //   B U Y    11111
      }
   }
                          

// +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count>0)
   {
      if(lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == -1 )
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

      if (lpos_type==POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }


   if(pos_count>0 && stop_count>0) 
     DeleteStopOrders() ;
  
} 
//-----------------------------------------------------------
bool RefreshRates()
{
   if (!o_symbol.RefreshRates())
     return(false) ;
     
    if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
      return(false);
      
    return(true);
}  
//---  --------------------------------------------------------- 
 bool IsFillingTypeAllowed (string symbol, int fill_type)
{ 
   int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE); 
 
   return((filling && fill_type) == fill_type) ;
} 
 
 //  -------------------------------------------------- 
   void CloseAll()
{
   for (int index = PositionsTotal()-1; index >=0; index--)
   {
      if (o_position.SelectByIndex(index))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            o_trade.PositionClose(o_position.Ticket());
         }
      }  
    } 
 } 
  
 //----------------------------------------------------------- 
 // Delete all pending orders
 //-------------------------------------
 void DeleteStopOrders()
 {
    for (int i = OrdersTotal() - 1; i >= 0; i-- ) 
   {
      if (o_order.SelectByIndex(i))
         if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
            o_trade.OrderDelete(o_order.Ticket());
   }
 } 
 
//+------------------------------------------------------------------+
 
procom:

ごあいさつ参考クリップ「MQL4からMQL5へ - メタトレーダー5用のEAを書き換える 方法」を拝見させていただきました。
著者にお祝いを申し上げたい。自分でもやってみようと思いました。書いたのは私です。私の考えは次のようなものです。
1.私はdtriger = 1を設定 - 購入を開きます。
2.dtriger = -1 - Sell opensに設定しました。
3.dtriger = 0に設定したところ、開いているものはすべて閉じられました。
FAQにMT5では反対方向のポジションを持つことができないと書いてありましたが、本当ですか?
と持っています。
質問:既存のポジションの決済を正しく規定する方法について
問題は、既存のポジションのクローズと逆のポジションのオープンをどのように正しく登録するかということです。
ありがとうございました。

ファクトシートを読むときに、よほど不注意だったのでしょう。

参考:一般原則 - トレーディング業務

結論:MetaTrader 5はネッティングシステムと ヘッジシステムの 両方を備えています。

Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 

私は、あなたの課題を別の方法で定式化します。


2. dtriger = -1 - 売りのオープン。
3. dtriger = 0 - すべてのオープンのものはクローズ されます。

Expert Advisorは以下のことを行う必要があります。

  • 買いポジションを建てる必要がある場合、まず売りポジションを決済する必要があります(売りポジションを決済するコマンドを発行します。)
  • 売りを建てる必要がある場合、まず買いを決済する必要があります(買いのポジションを決済するためのコマンドが発行されます。)
  • クライアントがすべてを決済する必要がある場合、すべてのポジションを決済すればよい(買いか売りかに関係なく)。

実装には2つのアルゴリズムが必要(ここではマジックナンバーも貢献) - 無効にすることも可能。

//+------------------------------------------------------------------+
//| Close positions                                                  |
//+------------------------------------------------------------------+
void ClosePositions(const ENUM_POSITION_TYPE pos_type)
  {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positions
      if(m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
            if(m_position.PositionType()==pos_type) // gets the position type
               m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
  }

и

//+------------------------------------------------------------------+
//| Close all positions                                              |
//+------------------------------------------------------------------+
void CloseAllPositions(void)
  {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positions
      if(m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
            m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
  }


一般的なアイデアは、PositionsTotal()-1 から 0 までのすべてのポジションをループすることです。PositionsTotal()-1 から 0 までであり、0 から PositionsTotal()-1 までではありません。これは重要なことです。

 
また、MetaTrader 5 で作業する場合、注文はREMOVED ORDER(削除済み注文)です。ですから、この最初の段階で「注文」という言葉を持ち出さないことが、あなたの心に混乱を生じさせないために、強く推奨されるのです。
 
Vladimir Karputov:
また、MetaTrader 5 で作業する場合、注文はREMOVED ORDER(削除済み注文)です。したがって、この最初の段階では、頭の中で混乱が生じないように、「注文」という言葉すら覚えないことを強くお勧めします。

また、成行注文のBuyとSell、CloseByの注文もあります。

 

音楽と同じように、ありがとうございました。

 
procom:

音楽と同じように、ありがとうございました。

私のコードについて説明が必要な場合は、お尋ねください。
 

まあ、そんなに親切にしてくれるなら、もっともっと。
エントリーを入れて、プリクローズを規定しましたが、やはり注文はそこそこ掛かっています。

// +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count>0)
   {
      if(lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == -1 )
         {
         o_trade.PositionClose(o_symbol.Name());
         }
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

      if (lpos_type==POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.PositionClose(o_symbol.Name());
         }
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }
 
procom:

まあ、そんなに親切にしてくれるなら、もっともっと。
エントリーを挿入し、プリクローズを規定しましたが、やはりあちこちでハンギングオーダーが発生しています。

閉じる操作と開く操作を分離する必要があります。つまり、これらの操作をヒープで行わないようにします。
プラン例:OnTick()は、まずExtNeedCloseBuy、ExtNeedCloseSell、ExtNeedCloseAllの3つのフラグをチェックします。
そして、ExtNeedOpenBuyとExtNeedOpenSellという2つのフラグを確認します。
こうすることで、すべてが厳密な順序で実行されるようになるのです。
そして、そう、注文はない。オープンポジションが あるのだ。
 
procom:

ノートと同じように、ありがとうございました。

開封の合図は何ですか?コードが完全ではないので、ポジションを閉じるだけ ですが、ポジションを開くことも必要です。


トレードコマンド.mq5
#プロパティバージョン "1.000"

今のところ、3つの動作しかしていません。

  • すべてのバイを閉じる
  • すべての売り物を閉じる
  • すべての購入と売却を閉じる
テイクプロフィット、ストップロス、トレーリングはすでに組み込まれています。唯一足りないのは、ポジションをオープンするためのシグナルの記述です。
Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
ファイル: