Açık pozisyonları gruplara ayırma - sayfa 6

 
Yeni bir işlev eklendi, artık danışman bir grup pozisyonun dökümünü belirtilen başka bir pozisyonla değiştirebilir.
 //+------------------------------------------------------------------+
//Перевод отобранных по тикетам позиций в указанную касту
//array_base[][observations] основная база, в которой нужно провести изменения
//array_change[]             массив с тикетами позиций, касту которых нужно изменить
//array_change[]             номер касты, к которой нужно приписать позиции
//+------------------------------------------------------------------+
int Transfer_Positions_Specified_Caste_by_Tickets( int &array_base[][observations], 
                                                   int &array_change[], 
                                                   int new_caste){
int size_change = ArraySize (array_change);
int size_base   = ArrayRange (array_base, 0 );

   for ( int i= 0 ; i<size_change; i++){
       int ticket_change = array_change[i];
       for ( int a= 0 ; a<size_base; a++){
         if (array_base[a][ 0 ] == ticket_change ||
            array_base[a][ 1 ] == ticket_change){
            array_base[a][ 2 ]  = new_caste;
             break ;}}}    
   ArrayFree (array_change);
       
return (size_change);
}
//+------------------------------------------------------------------+
 

İyi akşamlar. Profesyonellerin cevap vermesini rica ediyorum.

Lütfen böyle bir görevi gerçekleştirmeniz gerekiyorsa hangi işlevlerin en iyi şekilde kullanılacağını söyleyin:

birkaç pozisyon açmanız (piyasadan, emirsiz) ve hemen bir diziye biletlerini yazmanız gerekir.

Zorluk bu biletleri almakta, pozisyon açan VE biletini iade eden fonksiyonlar bulamadım (MT4'te olduğu gibi).

Sadece bir döngüde, parametrelerde vb. Açık anlaşmalar - soru sormaz, ancak yeni açılan bir pozisyon için bir bilet BULAMADIM!

Lütfen söyle.

Bunun gibi bir şey:

Bilet = Function.OpenPosition(By, 0.01, ......);

 
Sergey Voytsekhovsky :

bir pozisyon açmak VE biletini iade etmek (MT4'te olduğu gibi).

.................... ama yeni açılan bir pozisyon için bilet BULAMAYACAĞIM!!!

Lütfen söyle.

Akla sadece tarihteki son açık pozisyonun biletini istemek geliyor. Ama bir şekilde bana beceriksiz geliyor, çok belirsiz, koddaki sıra ile açık pozisyon arasında doğrudan katı bir bağlantı yok. Elbette daha sadık yöntemler vardır.Kimin herhangi bir fikri veya belki yeterli deneyimi var, pliz paylaşın ???

 
Sergey Voytsekhovsky :

Akla gelen tek şey, tarihteki son açık pozisyonun biletini talep etmektir. Ama bir şekilde bana beceriksiz geliyor, çok belirsiz, koddaki sıra ile açık pozisyon arasında doğrudan katı bir bağlantı yok. Elbette daha sadık yöntemler vardır.Kimin herhangi bir fikri veya belki yeterli deneyimi var, pliz paylaşın ???

Bütün bunları makalelerde anlattım. mql5 ve mql4 için her şey orada yapılır. Bir fikir alabilir ve bir işlev yapabilirsiniz.

Yine de. Konum kimliğinin atandığı bir anlaşmanız var. Belgelerdeki işlemler ve özellikleri hakkında bilgi edinin.

 
Sergey Voytsekhovsky :

İyi akşamlar. Profesyonellerin cevap vermesini rica ediyorum.

Lütfen böyle bir görevi gerçekleştirmeniz gerekiyorsa hangi işlevlerin en iyi şekilde kullanılacağını söyleyin:

birkaç pozisyon açmanız (piyasadan, emirsiz) ve hemen bir diziye biletlerini yazmanız gerekir.

Zorluk bu biletleri almakta, pozisyon açan VE biletini iade eden fonksiyonlar bulamadım (MT4'te olduğu gibi).

Sadece bir döngüde, parametrelerde, vs. açık anlaşmalar - soru sorulmadı, ama sadece açık bir pozisyon için bir bilet BULAMAYACAĞIM!!!

Lütfen söyle.

Bunun gibi bir şey:

Bilet = Function.OpenPosition(By, 0.01, ......);

 void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
 {
   if (trans.type == TRADE_TRANSACTION_DEAL_ADD )
   {
     ulong ticket = trans.position; // тикет позиции
     if ( HistoryDealGetInteger (trans.deal, DEAL_ENTRY ) == DEAL_ENTRY_IN ) // открылась позиция
      {
      }
     if ( HistoryDealGetInteger (trans.deal, DEAL_ENTRY ) == DEAL_ENTRY_OUT ) // закрылась позиция
     {
       if ( HistoryDealGetInteger (trans.deal, DEAL_REASON ) == DEAL_REASON_SL )
       if ( HistoryDealGetInteger (trans.deal, DEAL_REASON ) == DEAL_REASON_TP )
     }
   }
 }
 
Artyom Trishkin :

Bütün bunları makalelerde anlattım. mql5 ve mql4 için her şey orada yapılır. Bir fikir alabilir ve bir işlev yapabilirsiniz.

Yine de. Konum kimliğinin atandığı bir anlaşmanız var. Belgelerdeki işlemler ve özellikleri hakkında bilgi edinin.

Çok teşekkür ederim, kazmaya gidiyorum.

 
Alexey Viktorov :

Harika, şimdi yapacak bir şey var :-). Bunu çözeceğim ve sonucu gönderdiğinizden emin olacağım, belki birisine de yardımcı olur.

 
Sergey Voytsekhovsky :

Harika, şimdi yapacak bir şey var :-). Bunu çözeceğim ve sonucu gönderdiğinizden emin olacağım, belki birisine de yardımcı olur.

Çok az insan bunu bilmiyor. Ve bilmeyenler bu konuyu okuduktan sonra bilmelidir. Başarısız olursa, o zaman bu kraliyet işi değil ... ortalığı karıştırmak.

 
Artyom Trishkin :

Bütün bunları makalelerde anlattım. mql5 ve mql4 için her şey orada yapılır. Bir fikir alabilir ve bir işlev yapabilirsiniz.

Teşekkür ederim, hangi makalelerinizde? Sende o kadar çok var ki...

 

Tünaydın.

Yine bu forumun gurularına dönüyorum.

Küçük bir fonksiyon yazdı. Çalışıyor ama çok yavaş. Algoritmanın son derece verimsiz olduğunu anlıyorum. Burada okuyun:

https://www.mql5.com/ru/articles/567

bir dizinin sonuna ekleme işlevi nedir

Nasıl kullanacağımı anlamadım, sıkışmış hayal gücünü yerden kaldırmaya yardım et, ilgimi çeken yeri renklerle vurgulayacağım.

 //+------------------------------------------------------------------+
//| Заполняем структуру своих позиций
//+------------------------------------------------------------------+
int Fill_Position_Structure( int kodclana)
{
   int n = 0 ;
   if (!Refresh_Rates()) return ( false );
   int SizeTotalPosition = PositionsTotal ();
   int SizeArrayPosition = ArraySize (ArrayPosition);
//---Запись новых позиций в структуру        
   for ( int i= 0 ; i < SizeTotalPosition; i++)
      { //---Из списка открытых позиций выбираю очередную, предполагаю что она НОВАЯ, определяю ее ВремяЖизни, 
       //----проверяю есть ли она в массиве позиций, если есть, значит СТАРАЯ, обновляю ВремяЖизни, считаю, выхожу. 
         bool   new_pos  = true ;
         ulong ticket   = PositionGetTicket (i);
         int    lifetime = DatetimeToInteger( TimeCurrent () - m_position.Time());
         SizeArrayPosition = ArraySize (ArrayPosition);
         for ( int y = 0 ; y < SizeArrayPosition; y++)
            {
               if (ArrayPosition[y].ticket_pos == ticket)
                  {
                     ArrayPosition[y].lifetime_candle = lifetime/ 60 * _Period ;
                     ArrayPosition[y].lifetime_sek    = lifetime;
                     ArrayPosition[y].profit          = m_position.Profit() + m_position.Commission() + m_position.Swap();    
                     new_pos = false ;
                     n++;
                     break ;
                  }
            }
         if (new_pos)
             { //---Если НОВАЯ, забиваю позицию в массив со всеми параметрами
               ArrayResize (ArrayPosition, SizeArrayPosition+ 1 , 1 );
               ArrayPosition[SizeArrayPosition].lifetime_candle = lifetime/ 60 * _Period ;
               ArrayPosition[SizeArrayPosition].lifetime_sek    = lifetime;
               ArrayPosition[SizeArrayPosition].ticket_pos      = ticket;
               ArrayPosition[SizeArrayPosition].kod_clana       = kodclana;
               ArrayPosition[SizeArrayPosition].profit          = m_position.Profit() + m_position.Commission() + m_position.Swap();    
               ArrayPosition[SizeArrayPosition].type            = m_position.PositionType();
               n++;
            }
      }   
//---Удаление закрытых позиций из структуры  
      SizeArrayPosition = ArraySize (ArrayPosition);
      SizeTotalPosition = PositionsTotal ();
      
       for ( int z = 0 ; z < SizeArrayPosition; z++)
         {
             ulong ticket_cl   = ArrayPosition[z].ticket_pos;
             bool   cl_position = true ;
            
             for ( int i = 0 ; i < SizeTotalPosition; i++)
               {
                   if (ticket_cl == PositionGetTicket (i))
                     {
                        cl_position = false ;
                        n++;
                         break ;
                     }
                }
             if (cl_position)
               {
               ArrayRemove (ArrayPosition,z, 1 );
               Sleep (SLEEPTIME*slp);
               SizeArrayPosition = ArraySize (ArrayPosition);
               }
         }
return (n);
}
Neden: