N-dakikada pozisyonlar tek tek nasıl kapatılır?

 

mql4
Örneğin bir sipariş açtıktan sonra 5 dakika geçmiştir ve bu siparişin kapanması gerekir.
Her siparişin dakikalarını ayrı ayrı saymak için kapanış biletini ve açılış saatini hatırlamak benim için çok göbekli bir kod gibi görünüyor.
Pozisyonlar 1,2,3-10 olabilir, aynı anda alım ve satım yapabilir.

İstenen bileti daha fazla karşılaştırmak ve kapatmak için bu verileri bir dizide depolamak için bir işlev söyleyebilir misiniz?


 
Sonuçta, tüm biletler ve açılış saatleri zaten standart dizilerde.
Zamanlayıcıya göre tüm konumları yineleyin ve TimeCurrent()-OrderOpenTime()>=300'ü karşılaştırın
 
Taras Slobodyanik :
Sonuçta, tüm biletler ve açılış saatleri zaten standart dizilerde.
Zamanlayıcıya göre tüm konumları yineleyin ve TimeCurrent()-OrderOpenTime()>=300'ü karşılaştırın

Standart diziler nelerdir?
Daha?

 
diziler değil, standart MQL işlevleri
Торговые функции - Справочник MQL4
Торговые функции - Справочник MQL4
  • docs.mql4.com
Торговые функции могут использоваться в экспертах и скриптах. Торговые функции OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete(), изменяющие состояние...
 

5 dakika sonra hepsi birden değil de bu işlevlerden oluşan bir setle pozisyonları tek tek nasıl kapatabilirim?

ilk açık pozisyon var , zamanı ve bileti değişkene kaydettik
sonra ikinci pozisyon açıldı, onu döngüde sonuncusu olarak görüyoruz ve değişkene zamanı ve bileti yazıyoruz
ancak tüm bu eylemlerin üzerine yazılır ve verilerin yalnızca son konumdan depolandığı ortaya çıkar.

 
Natalya Dzerzhinskaya :

5 dakika sonra hepsi birden değil de bu işlevlerden oluşan bir setle pozisyonları tek tek nasıl kapatabilirim?

ilk açık pozisyon var, değişkene saat ve bilet yazılıyor
sonra ikinci pozisyon açıldı, onu döngüde sonuncusu olarak görüyoruz ve değişkene zamanı ve bileti yazıyoruz
ancak tüm bu eylemlerin üzerine yazılır ve verilerin yalnızca son konumdan depolandığı ortaya çıkar.

Açıldıktan sonra en geç 5 dakika içinde kapatılması gerekenlerden tam olarak bir sipariş seçme koşulu tam olarak açık değildir.

Yani, ne cevap vereceğimi bilmiyorum.

Bir koşul varsa, onunla başlamanız gerekir.

Ve şu anda hepsi sanal olarak seçili ve tek tek bir demet halinde kapatılacaklar.

İlk açık sipariş şuna sahiptir: TimeCurrent()-OrderOpenTime() en büyüğü olacaktır, örneğin onun bileti OrderTicket()

Böyle bir döngüde tüm piyasa emirlerinizi gözden geçirebilirsiniz.

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

mql4
Örneğin bir sipariş açtıktan sonra 5 dakika geçmiştir ve bu siparişin kapanması gerekir.

Kim Igor'un özelliklerine göz atın.

Burada vskidku, fonksiyon son pozisyonun açılmasından sonraki saniye sayısını döndürür.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

İhtiyaçlarınıza uyacak şekilde değiştirin. Buna, seçilen bir pozisyonu kapatma işlevini ekleyin.

 
Renat Akhtyamov :

Açıldıktan sonra en geç 5 dakika içinde kapatılması gerekenlerden tam olarak bir sipariş seçme koşulu tam olarak açık değildir.

Daha basit anlatayım:

Piyasada 1. sıra var, ardından 2., 3. vb.
İlk siparişin süresi doldu, kapatılması gerekiyor, ardından 2. sipariş seride ilk oldu, süre doldu, kapatılmalı vb.
Aslında, >=5*60 ise kapatılacak en eski siparişi seçmeniz gerekir.
Fakat bilet ile kapatılacak seriden seçilebilmesi için açık siparişlerde biletin en küçük değerini bir şekilde belirlemek ve kullanım ömrünü belirlemek gerekir.

Aleksandr Volotko :

Kim Igor'un özelliklerine göz atın.

Burada vskidku, fonksiyon son pozisyonun açılmasından sonraki saniye sayısını döndürür.

sığmaz. Piyasadaki ilk pozisyonla ilgileniyor.

 
Natalya Dzerzhinskaya :

Daha basit anlatayım:

Piyasada 1. sıra var, ardından 2., 3. vb.
İlk siparişin süresi doldu, kapatılması gerekiyor, ardından 2. sipariş seride ilk oldu, süre doldu, kapatılmalı vb.
Aslında, >=5*60 ise kapatılacak en eski siparişi seçmeniz gerekir.
Fakat bilet ile kapatılacak seriden seçilebilmesi için açık siparişlerde biletin en küçük değerini bir şekilde belirlemek ve kullanım ömrünü belirlemek gerekir.

sığmaz. Piyasadaki ilk pozisyonla ilgileniyor.


O zaman sorun ne?

  1. Bir uzman tarafından açılan en eski siparişi bulun. En küçük OrderOpenTime()'a sahiptir.
  2. Bu siparişin açıldığı andan şimdiki zamana ne kadar zaman geçtiğini karşılaştırın. Belirtilen değere eşit veya daha büyükse kapatın.
 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 :

Daha basit anlatayım:

Piyasada 1. sıra var, ardından 2., 3. vb.
İlk siparişin süresi doldu, kapatılması gerekiyor, ardından 2. sipariş seride ilk oldu, süre doldu, kapatılmalı vb.
Aslında, >=5*60 ise kapatılacak en eski siparişi seçmeniz gerekir.
Fakat bilet ile kapatılacak seriden seçilebilmesi için açık siparişlerde biletin en küçük değerini bir şekilde belirlemek ve kullanım ömrünü belirlemek gerekir.

sığmaz. Piyasadaki ilk pozisyonla ilgileniyor.

varoluş zamanında, hem ilk açık düzenden hem de en sonuncudan seçim yapabilirsiniz. Aynı zamanda bileti ve varlığın saniye sayısını da hatırlıyoruz. örneğin

 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)
{
//ну и пошло-поехало...
}

 

en basit şey, yorum alanına siparişin ne zaman kapanması gerektiğini yazmaktır.

o zaman sadece kapanmaya en yakın zamanı hatırlamanız gerekir (ve o zaman bile bu bir optimizasyondur).

"Revizyon" zamanı geldiğinde, zamanlayıcı veya istediğiniz herhangi bir şeyle, açık siparişler arasında geçiş yapın ve kullanım ömrü yorumda belirtilen süreyi geçenleri kapatın.