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

 

Yaşasın, kabul edilebilir bir sonuç elde etmiş görünüyor.

Pozisyonlar açıldıkça dizi gerekli verilerle doldurulur.

Danışmanı test cihazında çalıştırırsanız, ilk dört giriş yorumlarda görünür, test cihazı düşük hızdaysa ve bir duraklama kullanılıyorsa, her şey açıktır.

Kod dosyasını ekliyorum.

İlk koşulla çağrılmaya gitti ve bu koşula karşılık gelen pozisyonlara atama N_Caste = 1;

Eleştiri açığız.

Tüm nazik insanlara teşekkürler.

Dosyalar:
Sower_1_3.mq5  21 kb
 
Nikolay Kositsin :

... Bu tür şeyler ya bağımsız olarak yazılır ya da serbest olarak sipariş edilir.

Üzgünüm, geçemedim. Olmayan şeyler var mı?

 

İyi geceler.

Yukarıdaki mesajların geliştirilmesinde danışmana iki boyutlu bir dizi oluşturmayı, pozisyonlar açıldıkça her pozisyon için bilet ve rank değerlerini girmeyi öğrettim.

Gelecekte, sinyallerin alınması veya koşulların oluşması üzerine, karşılık gelen pozisyonların sıraları değişecektir. Pozisyonları bu şekilde yönetmeyi planlıyorum.

Bir sorun var - profesyonellerden yanıt vermelerini istiyorum. Bir diziden öğelerin kaldırılmasıyla ilgili yardım.

Pozisyonlar kapalı olduğundan, dizi, bileti ve "ölü" zaten kapalı pozisyonun sıralamasını saklayan öğeleri biriktirir, nasıl silineceğini bilmiyorum.

172-173. sayfalardaki işlem çalışmıyor

         if (dead_pos) ArrayRemove (Arr_Position,e, 2 );
         ArrayResize (Arr_Position,All_Position);

OnTick()'te, her mum üzerinde pozisyonlar açılır, durakları değiştirilir, biletleri bir diziye girilir ve ilk sıfır sırası atanır.

Duraklar tetiklendiğinde, dizide fazladan öğeler birikir. Anlaşılır olması için gerekli yorumları çıkardım ve her şey çevrimiçi olarak görülebilir.

Kod hala küçük, bu yüzden buraya göndereceğim ve dosyayı da ekleyeceğim.

Bir dizinin temizliğini organize etmek için pliz'e yardım edin.

 //+------------------------------------------------------------------+
//|                                                        Sower_1_6 |
//|                                              Sergei Voicehovskii |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergei Voicehovskii"
#property link        "https://www.mql5.com"
#property version    "1.00"
//---
#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Trade\HistoryOrderInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\TerminalInfo.mqh>
#include <Trade\Trade.mqh>
#include <Arrays\ArrayInt.mqh>
//---
CAccountInfo      m_account;
CDealInfo         m_deal;
CHistoryOrderInfo m_history;
COrderInfo        m_order;
CPositionInfo     m_position;
CSymbolInfo       m_symbol;
CTerminalInfo     m_terminal;
CTrade            m_trade;
CArrayInt         m_array;
//---
#define observations 2
int   Arr_Position[][observations];
int   Array_Change[];
//--- input parameters
input int       SL                      = 50 ;
input int       TP                      = 50 ;
input double    Lot                     = 0.01 ;
input double    InpCloseProfit_money    = 5.0 ;   
input double    InpCloseProfit_points   = 50.0 ;   
input double    InpCloseProfit_percent  = 3.0 ;   
input ulong     InpDeviation            = 10 ;    
input bool      InpPrintLog             = true ;
input bool      InpCommentLog           = true ;
input ulong     Magic                  = 557755 ; 
//---
       int    stoploss    = SL;   
       int    takeprofit  = TP;
       ulong slippage    = InpDeviation;
      
       datetime Time_OpenPos;
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- Обновляем данные
   Refresh_Rates();
//--- Устанавливаем символ
   m_symbol.Name( _Symbol );
//--- Устанавливаем Magic
   m_trade.SetExpertMagicNumber(Magic);
//--- Определяем режим расчета маржи    
   m_trade.SetMarginMode();
//--- Определяем режим исполнения ордеров    
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
//--- Устанавливаем максимальное отклонение от запрашиваемой цены   
   m_trade.SetDeviationInPoints(slippage);
//---
   ArrayFree (Arr_Position);  
//---
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
{
   if (Checking_NewBar())
   {
//+---Открываем начальные позиции "свежего" бара       
      m_trade.Buy( 0.01 );
      m_trade.Sell( 0.01 );
//+---Выставляем стопы начальных позиций       
      ModifySLTP_1_range(stoploss,takeprofit,Magic);
//+---Заполняем массив c тикет/кастой позиций 
       int N = Array_Creating_Caste_Positions();
//+--- 
       int R = ArrayRange (Arr_Position, 0 )- 1 ;
       if (R< 30 )R= 0 ; else R= 30 ;
       int tic = Arr_Position[R][ 0 ];
       if (m_position.SelectByTicket(tic))
      Time_OpenPos = m_position.Time();
       int P = PositionsTotal ();
      
       if (InpCommentLog){
         Comment ( "Выводим данные \n"
         "ticket:                       " ,tic, "\n"
         "Время открытия позиции:       " ,Time_OpenPos, "\n"
         "Сколько элементов в массиве:  " ,R+ 1 , "\n"
         "Проверок тикета за проход:  " ,N, "\n"
         "Ввсего открыто позиций:       " ,P, "\n"
         //"Время жизни позиции (стр): ",structura_time.year," год. ",structura_time.mon," мес. ",structura_time.day," дн. ",structura_time.hour," час. ",structura_time.min," мин. ",structura_time.sec," сек. \n"
         );}
//---
       ArrayPrint (Arr_Position); 
//---
   }
//---
}
//+------------------------------------------------------------------+
int Array_Creating_Caste_Positions()
{
   int   n           = 0 ;
   long ticket      = 0 ;
   bool new_pos     = true ;
//---Запись новых тикетов в массив позиций        
   int All_Position = PositionsTotal ();
   int Array_Size   = ArrayRange (Arr_Position, 0 );
//---  
   for ( int i = 0 ; i < All_Position; i++)
      {
       if (m_position.SelectByIndex(i))
         {
            ticket  = PositionGetInteger ( POSITION_TICKET );
            new_pos = true ;
         }
       for ( int e = 0 ; e < Array_Size; e++)
         {
             if (Arr_Position[e][ 0 ]==ticket)
               {
                  new_pos = false ;
                  n++;
                   break ;
               }
         }
       if (new_pos){
       int New_Size = Array_Size+ 1 ;
       ArrayResize (Arr_Position,New_Size, 0 );
         Arr_Position[Array_Size][ 0 ] = ( int )ticket; //Ticket
         Arr_Position[Array_Size][ 1 ] = 0 ; //Number_Caste (0 = начальные позиции)
         n++;}                       
      }
//---Удаление из массива мёртвых тикетов 
      Array_Size   = ArrayRange (Arr_Position, 0 );
      All_Position = PositionsTotal ();
//---      
       for ( int e = 0 ; e < Array_Size; e++)
      {
         int tickt = Arr_Position[e][ 0 ];
         bool dead_pos = true ;
         
         for ( int i = 0 ; i < All_Position; i++)
         {
             if (m_position.SelectByIndex(i))
               {
                   if (tickt == PositionGetInteger ( POSITION_TICKET ))
                     {
                        dead_pos = false ;
                        n++;
                         break ;
                     }   
               }
         }
         if (dead_pos) ArrayRemove (Arr_Position,e, 2 );
         ArrayResize (Arr_Position,All_Position);
      }
//---     
return (n);
}
//+------------------------------------------------------------------+
//Проверка на наличие нового бара
//+------------------------------------------------------------------+
bool Checking_NewBar()
{
//--- переменная для возврата функции
   bool new_bar_opened = false ;
//--- статическая переменная для хранения времени открытия последнего бара 
   static datetime last_bar_time= 0 ; 
//--- если статическая переменная еще неинициализирована 
   if (last_bar_time== 0 ) 
     { 
       //--- это первый вызов, запишем время открытия и выйдем 
      last_bar_time=( datetime ) SeriesInfoInteger ( _Symbol , Period (), SERIES_LASTBAR_DATE ); 
       if (InpPrintLog)
       PrintFormat ( "Инициализировали переменную last_bar_time значением %s" , TimeToString (last_bar_time)); 
     } 
//--- получим время открытия последнего бара по своему символу 
   datetime curr_time=( datetime ) SeriesInfoInteger ( Symbol (), Period (), SERIES_LASTBAR_DATE ); 
//--- если время открытия текущего бара не совпадает с тем, что хранится в last_bar_time то открылся новый бар
   if (curr_time!=last_bar_time) 
     { 
      new_bar_opened = true ;
       //--- запомним время открытия нового бара в статической переменной 
      last_bar_time=curr_time; 
       //--- выведем сообщение об этом событии 
       if (InpPrintLog)
       PrintFormat ( "На символе %s открылся новый бар в %s" , _Symbol , TimeToString ( TimeCurrent ())); 
     } 
return (new_bar_opened);   
} 
//+------------------------------------------------------------------+
//Обновление котировок
//+------------------------------------------------------------------+
bool Refresh_Rates()
  {
//--- refresh rates
   if (!m_symbol.RefreshRates())
     {
       if (InpPrintLog)
         Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " , "RefreshRates error" );
       return ( false );
     }
//--- protection against the return value of "zero"
   if (m_symbol.Ask()== 0 || m_symbol.Bid()== 0 )
     {
       if (InpPrintLog)
         Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " , "Ask == 0.0 OR Bid == 0.0" );
       return ( false );
     }
//---
   return ( true );
  }

//+------------------------------------------------------------------+
void ModifySLTP_1_range( int     stplss, 
                         int     tkprfit, 
                         ulong   mgc)
{
       double sl     = 0.0 ,
             tp     = 0.0 ;      
       double slbuy  = 0.0 ,
             slsell = 0.0 ,
             tpbuy  = 0.0 ,
             tpsell = 0.0 ;
             
      Refresh_Rates();
      
       if (stplss> 0 )
      {
       slbuy  = m_symbol.Bid() - stplss*m_symbol. Point ();
       slsell = m_symbol.Ask() + stplss*m_symbol. Point ();
      }
       if (tkprfit> 0 )
      { 
       tpbuy  = m_symbol.Bid() + tkprfit*m_symbol. Point ();    
       tpsell = m_symbol.Ask() - tkprfit*m_symbol. Point ();
      }

       for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--)
      {
         if (m_position.SelectByIndex(i))
         {
             if (m_position. Symbol ()== Symbol ())
            { 
                 if (m_position.Magic() == mgc)
                {   
                     if (m_position.PositionType()== POSITION_TYPE_BUY )
                     {
                        sl = m_position.StopLoss()   > 0 ? m_position.StopLoss()   : slbuy;
                        tp = m_position.TakeProfit() > 0 ? m_position.TakeProfit() : tpbuy;
                              m_trade.PositionModify(m_position.Ticket(), NormalizeDouble (sl, Digits ()), NormalizeDouble (tp, Digits ()));
                     }
                     if (m_position.PositionType()== POSITION_TYPE_SELL )
                     {
                        sl = m_position.StopLoss()   > 0 ? m_position.StopLoss()   : slsell;
                        tp = m_position.TakeProfit() > 0 ? m_position.TakeProfit() : tpsell;
                              m_trade.PositionModify(m_position.Ticket(), NormalizeDouble (sl, Digits ()), NormalizeDouble (tp, Digits ()));
                     }
               }
            }
         }
      }
}  
//+------------------------------------------------------------------+
Dosyalar:
Sower_1_6.mq5  20 kb
 

StLoss sürecinin netliği için, 0'ı ayarlamak, TProf'u 50 bırakmak, danışmanı herhangi bir para biriminin saatlik grafiğine atmak daha iyidir. Test cihazında.

Çevrimiçi bir demoda, elbette, bir dakika daha iyidir

 
Sergey Voytsekhovsky :

StLoss sürecinin netliği için, 0'ı ayarlamak, TProf'u 50 bırakmak, danışmanı herhangi bir para biriminin saatlik grafiğine atmak daha iyidir. Test cihazında.

Çevrimiçi bir demoda, elbette, bir dakika daha iyidir

St.Loss † © Duvarınıza !

sandalyeden düştüm)

St.Loss'un kaçınılmaz olduğu görülebilir.

Hmm .. bu konuyla ilgili biri var, peki †, zaten forumda var ..)

 
onedollarusd :

St.Loss † © Duvarınıza !

sandalyeden düştüm)

St.Loss'un kaçınılmaz olduğu görülebilir.

Hmm .. bu konuyla ilgili biri var, peki †, zaten forumda var ..)

Kabul ediyorum, kulağa komik geliyor. Ama bu sadece algoritmanın bir parçası olan bir model. Ruh halinizi iyileştirebildiğime sevindim.

Zorlaştırmıyorsa, ".... bu konuyla ilgili biri var, peki †, forumda zaten var .." linkini atın pliz.

 
Sergey Voytsekhovsky :

Zorlaştırmıyorsa, ".... bu konuyla ilgili biri var, peki †, forumda zaten var .." linkini atın pliz.

Ve daha da iyisi, artık gerekmeyen öğeleri iki boyutlu bir diziden nasıl çıkaracağınızı biliyorsanız söyleyin ???

Kafamı kırdım, referans kitabı deliklere sıkışmıştı. Beyinlerin yeterli olmaması üzücü.

 
Sergey Voytsekhovsky :

artık gerekmeyen iki boyutlu bir diziden öğeler nasıl kaldırılır ???

ArrayResize() ;

ArrayResize - Операции с массивами - Справочник MQL4
ArrayResize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
При успешном выполнении функция возвращает количество всех элементов, содержащихся в массиве после изменения размера; в противном случае возвращает -1 и массив не меняет размеры. Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в...
 
Sergey Voytsekhovsky :

Ve daha da iyisi, artık gerekmeyen öğeleri iki boyutlu bir diziden nasıl çıkaracağınızı biliyorsanız söyleyin ???

Kafamı kırdım, referans kitabı deliklere sıkışmıştı. Beyinlerin yeterli olmaması üzücü.

Bir diziyi "kendi içine" kopyalamak , silinmekte olanın yanındaki pozisyondan başlamak ve silinmekte olandan başlayarak yazmak. Ardından Grigori.SB tarafından önerilen şekilde yeniden boyutlandırın

   int src_data[ 10 ];
   //--- Не важно как заполнен массив
   //--- Удалим индекс 4
   ArrayCopy (src_data, src_data, 4 , 5 );
   ArrayResize (src_data, ArraySize (src_data)- 1 );
İki boyutlu bir dizi için, silinecek satır numarasını 2 ile çarpmanız gerekir. 3 boyutlu bir dizi için, 3 ile ...
 
Grigori.SB :

ArrayResize() ;

Günaydın, cevabınız için teşekkürler.

Muhtemelen dikkat etmediniz, yukarıda gördüğünüz gibi, MQL5 ile ilgili tüm sorular.

Farkın bazen temel olmadığını anlıyorum, ama yine de. Verdiğiniz işlev, bir dizinin boyutunu değiştirir, boyut küçülürse muhtemelen gereksiz öğeleri keser.

İhtiyaç duyulan şey bu değil. Öğeyi değerine göre bularak kaldırmanız gerekir. Evet ve bu işlevi kullanmaya çalıştım, #23'te bunun hakkında yazdım. Her durumda - teşekkürler.

Neden: