N分後に1つずつポジションをクローズする方法を教えてください。

 

mql4
例えば、注文が開始されてから5分経過したので、この注文は終了する必要があります。
注文ごとに分数を計算するために、クローズまでのチケットと開店 時間を別々に記憶するのは、コードが面倒です。
1,2,3-10のポジションがあり、同時に買ったり売ったりすることがあります。

このデータを配列に格納して、さらに比較し、必要なチケットでクローズするための関数を提案できますか?


 
結局のところ、すべてのチケットと開店 時間は、すでに標準的な配列に存在しています。
タイマーで全てのポジションを調べ、TimeCurrent()-OrderOpenTime()>=300を比較する。
 
Taras Slobodyanik:
結局のところ、すべてのチケットと開店 時間は、すでに標準的な配列に存在しています。
タイマーで全ポジションを列挙し、TimeCurrent()-OrderOpenTime()>=300を比較する。

その標準的なアレイとは?
詳しく教えてください。

 
配列ではなく、MQLの標準的な関数
Торговые функции - Справочник MQL4
Торговые функции - Справочник MQL4
  • docs.mql4.com
Торговые функции могут использоваться в экспертах и скриптах. Торговые функции OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete(), изменяющие состояние...
 

5分後に一斉にポジションを閉じるのではなく、個別に閉じるようにするにはどうしたらよいですか?

最初のオープンポジションが あり、我々は変数に時間とチケット
、次に2番目のポジションが開かれ、我々は最後のものとしてループで見て、変数時間とチケット
、しかし、これらのすべてのアクションが上書きされ、データが最後の位置からだけ格納されていることが判明している。

 
Natalya Dzerzhinskaya:

5分後に一斉にポジションを閉じるのではなく、個別に閉じるようにするにはどうしたらよいですか?

最初のオープンポジションが あり、それを変数timeとチケット
に記録し、次に2番目のポジションがオープンしました。我々はそれを最後のものとしてループで見て、変数timeとチケット
に記録しますが、これらのすべてのアクションは上書きされ、データは最後のポジションからのみ保存されていることが判明しました。

オープンから5分以内にクローズする必要がある注文のうち、1つだけを選択するという条件がよくわからないのですが。

ですから、どう答えていいかわかりません。

条件があれば、まずはそこから始めるべきでしょう。

現時点では、すべて仮想的に選択されており、順次、山積みにされてクローズされる予定です。

一番最初のオープンオーダーには、こう書かれています。TimeCurrent()-OrderOpenTime()は、例えば、そのOrderTicket()が最大となる。

次のループで、すべての成行注文を通過させることができます。

int i;      
     for (i=OrdersTotal()-1; i>=0; i--)
         {
            if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               {
                  ............
               }
         }
 
Natalya Dzerzhinskaya:

mql4
例えば、注文が開始されてから5分が経過したので、この注文をクローズする必要があります。

キム・イゴールの機能をご覧ください。

ここでは、一目でわかるように、最後にポジションが開いてから何秒後かを返す関数になっています。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t=0;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}

自分の課題に合わせて修正する。そこに、1ポジションを 閉じる機能を追加する。

 
Renat Akhtyamov:

開店から5分以上経ってから閉めないといけないのは、1オーダーなのかどうか、よくわからない。

もう少しわかりやすく説明しましょう。

市場には1次があり、2次、3次......と続いていく。
最初の注文の時間が切れたので、それを閉じるべき、次に2番目の注文はシリーズの最初のもので、時間が切れたので、それを閉じるべき、などです。
実際には、>=5*60であれば最も古い注文を選んでクローズするはずです
しかし、チケットによってクローズされるシリーズの中からそれを選択するためには、オープン・オーダーの中でチケットの最小値を何らかの方法で定義し、存在時間を決定する必要があります。

アレクサンドル・ヴォロトコ

キム・イゴールの機能をご覧ください。

ここでは、一目でわかるように、最後にポジションが開いてから何秒後かを返す関数になっています。

フィットしない。一番最初のポジションに興味がある。

 
Natalya Dzerzhinskaya:

簡単に説明します。

市場には1次があり、2次があり、3次があり......という具合です。
最初の注文の時間切れ、次に2番目の注文はシリーズの最初のもので、時間切れ、終了すべき、など。
実際には、>=5*60であれば最も古い注文を選んでクローズするはずです
しかし、チケットによってクローズされるシリーズからそれを選択するためには、オープン・オーダーの中でチケットの最小値を何らかの方法で定義し、存在時間を決定する必要があります。

サイズが合わない市場第一位のポジションに興味がある。


何が問題なのか?

  1. Expert Advisorが開いた最も古い注文を検索します。最も小さいOrderOpenTime()を持つ。
  2. この注文を開始した時点から現在までの 経過時間を比較します。指定された時間以上であれば、閉じる。
int nOlderTicket = -1;
datetime dtOlderOrderTime = D'3000.12.30';
for (int i = OrdersTotal() - 1; i >= 0; --i)
{
   if (!OrderSelect(i, SELECT_BY_POS))
      continue;

   if (OrderSymbol() != Symbol())
      continue;

   if (OrderMagicNumber() != i_nMagicNumber)
      continue;

   if (nOlderTicket < 0 || OrderOpenTime() < dtOlderOrderTime)
   {
      nOlderTicket = OrderTicket();
      dtOlderOrderTime = OrderOpenTime();
   }
}

if (TimeCurrent() - dtOlderOrderTime >= время в секундах)
{
   // Закрыть ордер nOlderTicket
}


 
Natalya Dzerzhinskaya:

簡単に説明します。

1次が市場に出て、2次、3次......と続いていく。
最初の注文の時間が切れたので、それを閉じるべき、次に2番目の注文はシリーズの最初のもので、時間が切れたので、それを閉じるべき、などです。
実際には、>=5*60であれば最も古い注文を選んでクローズするはずです
しかし、チケットによってクローズされるシリーズからそれを選択するためには、オープン・オーダーの中でチケットの最小値を何らかの方法で定義し、存在時間を決定する必要があります。

サイズが合わないあなたは、市場における一番最初のポジションに興味があるのですね。

存在時間では、一番最初のオープンオーダーと一番新しいオーダーの両方を選択することができます。この場合、チケットと存在秒数を記憶しています。例えば

int i, DeltaTimeOpen, prevDeltaMax, prevDeltaMin, TicketFirst, TicketLast, DeltaTimeClose;  
//---------------
prevDeltaMax=0; prevDeltaMin=9999999999999; TicketFirst=0; TicketLast=0; DeltaTimeClose = 5*60;     
     for (i=OrdersTotal()-1; i>=0; i--)
         {            
            if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               { 
                  DeltaTimeOpen = TimeCurrent()-OrderOpenTime();//возраст ордера в секундах
                  if(DeltaTimeOpen>=DeltaTimeClose)
                  {
                     if(DeltaTimeOpen>prevDeltaMax)
                     {                         
                         TicketLast=OrderTicket();//последний  
                         prevDeltaMax=DeltaTimeOpen;//возраст                    
                     }
                     if(DeltaTimeOpen<prevDeltaMin)
                     {
                         TicketFirst=OrderTicket(); //первый
                         prevDeltaMin=DeltaTimeOpen;//возраст                                              
                     }
                  }
               }
         }
if(TicketFirst>0)
{
//ну и пошло-поехало...
}

 

最も簡単な方法は、コメント欄に注文を締め切るべき時刻を入力することです。

あとは、一番近い閉店時間を覚えておくだけです(その場合も最適化です)。

修正」の時間になったら、タイマーでも何でもいいから、未決済の注文をループして、コメントで指定された時間を超える寿命を 持つものを決済する。