열린 직위를 그룹으로 나누기 - 페이지 3

 

만세, 받아들일 만한 결과를 얻은 것 같다.

배열은 위치가 열릴 때 필요한 데이터로 채워집니다.

테스터에서 어드바이저를 실행하면 처음 4개의 항목이 주석에 표시되고 테스터가 저속이고 일시 중지가 사용되면 모든 것이 명확해집니다.

코드 파일을 첨부합니다.

첫 번째 조건과 이 조건에 해당하는 위치에 할당으로 요술을 하러 갔다 N_Caste = 1;

비판은 환영합니다.

모든 친절한 사람들에게 감사합니다.

파일:
Sower_1_3.mq5  21 kb
 
Nikolay Kositsin :

... 그러한 것들은 독립적으로 작성되거나 프리랜서로 주문됩니다.

죄송합니다. 지나치지 못했습니다. 그렇지 않은 것들이 있습니까?

 

잘 자.

위의 메시지 개발에서 나는 어드바이저에게 2차원 배열을 생성하고, 포지션이 열릴 때 각 포지션에 대한 티켓과 순위 값을 입력하도록 가르쳤습니다.

향후 시그널 수신 또는 조건 발생 시 해당 포지션의 순위가 변경될 예정입니다. 이것이 내가 직책을 관리하는 방법입니다.

문제가 있습니다 - 전문가에게 응답을 요청합니다. 배열에서 요소를 제거하는 데 도움이 됩니다.

위치가 닫히면 배열에 티켓을 저장하는 요소와 이미 닫힌 위치 의 "죽은" 순위가 누적되는데 어떻게 삭제해야 할지 모르겠습니다.

172-173페이지의 작업이 작동하지 않음

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

OnTick()에서 각 양초에서 위치가 열리고 해당 정류장이 수정되고 티켓이 배열에 입력되고 초기 0 순위가 할당됩니다.

중지가 트리거되면 추가 요소가 배열에 누적됩니다. 명확성을 위해 필요한 설명을 가져왔고 모든 것이 온라인에서 볼 수 있습니다.

아직 코드가 작으니 여기에 올려보고 파일도 첨부하겠습니다.

pliz가 어레이 청소를 구성하도록 도와주세요.

 //+------------------------------------------------------------------+
//|                                                        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 ()));
                     }
               }
            }
         }
      }
}  
//+------------------------------------------------------------------+
파일:
Sower_1_6.mq5  20 kb
 

StLoss 프로세스를 명확하게 하기 위해 0으로 설정하고 TPof를 50으로 설정하고 모든 통화의 시간별 차트에 어드바이저를 던지는 것이 좋습니다. 테스터에 있습니다.

물론 온라인 데모에서는 1분이 더 좋습니다.

[삭제]  
Sergey Voytsekhovsky :

StLoss 프로세스를 명확하게 하기 위해 0으로 설정하고 TPof를 50으로 설정하고 모든 통화의 시간별 차트에 어드바이저를 던지는 것이 좋습니다. 테스터에 있습니다.

물론 온라인 데모에서는 1분이 더 좋습니다.

St.Loss † © 벽에!

나는 의자에서 떨어졌다)

St.Loss가 불가피하다고 볼 수 있습니다.

흠 .. 우리는이 주제에 대해 누군가가 있습니다. 음 †, 이미 포럼에 ..)

 
onedollarusd :

St.Loss † © 벽에!

나는 의자에서 떨어졌다)

St.Loss가 불가피하다고 볼 수 있습니다.

흠 .. 우리는이 주제에 대해 누군가가 있습니다. 음 †, 이미 포럼에 ..)

동의합니다. 재미있을 것 같습니다. 그러나 이것은 알고리즘의 일부를 해결하기 위한 모델일 뿐입니다. 기분을 개선할 수 있어서 기쁩니다.

그것이 어렵지 않다면 ".... 우리는 이 주제에 대해 누군가가 있습니다. 음 †, 이미 포럼에 ..이 있습니다." pliz에 대한 링크를 던지십시오.

 
Sergey Voytsekhovsky :

그것이 어렵지 않다면 ".... 우리는 이 주제에 대해 누군가가 있습니다. 음 †, 이미 포럼에 ..이 있습니다." pliz에 대한 링크를 던지십시오.

그리고 더 좋은 방법은 2차원 배열에서 더 이상 필요하지 않은 요소를 제거하는 방법을 알고 있다면 ???

나는 머리를 부러뜨렸고, 참고서는 구멍에 끼었다. 두뇌가 부족해서 아쉽습니다.

 
Sergey Voytsekhovsky :

더 이상 필요하지 않은 2차원 배열에서 요소를 제거하는 방법 ???

배열 크기 조정() ;

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

그리고 더 좋은 방법은 2차원 배열에서 더 이상 필요하지 않은 요소를 제거하는 방법을 알고 있다면 ???

나는 머리를 부러뜨렸고, 참고서는 구멍에 끼었다. 두뇌가 부족해서 아쉽습니다.

삭제되는 배열 옆의 위치에서 시작하여 삭제되는 배열부터 쓰기 시작 하여 배열을 "자체로" 복사합니다 . 그런 다음 Grigori.SB가 제안한 대로 크기를 조정합니다.

   int src_data[ 10 ];
   //--- Не важно как заполнен массив
   //--- Удалим индекс 4
   ArrayCopy (src_data, src_data, 4 , 5 );
   ArrayResize (src_data, ArraySize (src_data)- 1 );
2차원 배열의 경우 삭제할 행 번호에 2를 곱해야 합니다. 3차원 배열의 경우 3...
 
Grigori.SB :

배열 크기 조정() ;

좋은 아침입니다. 답변 감사합니다.

당신은 아마 주의를 기울이지 않았을 것입니다. 위에서 볼 수 있듯이 MQL5와 관련된 모든 질문입니다.

나는 그 차이가 때때로 근본적인 것은 아니지만 그럼에도 불구하고 이해합니다. 당신이 제공한 기능은 배열의 크기를 변경하고 크기가 줄어들면 아마도 불필요한 요소를 잘라낼 것입니다.

이것은 필요한 것이 아닙니다. 값으로 요소를 찾아서 제거해야 합니다. 예, 이 기능을 사용하려고 했습니다. # 23에서 이에 대해 썼습니다. 어쨌든 - 감사합니다.