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

 

halka arz edeceğim. Doğru, henüz herhangi bir çeki bozmadım, ama bence işe yaramalı

 void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
  {
//---
   if (trans.type == TRADE_TRANSACTION_DEAL_ADD )
      {
         if ( HistoryDealGetInteger (trans.deal, DEAL_ENTRY ) == DEAL_ENTRY_IN ) // Открылась позиция
            {
               if ( PositionSelectByTicket (trans.position))
                  {
                     int SizeArrayPosition = ArraySize (ArrayPosition);
                     ArrayResize (ArrayPosition,SizeArrayPosition+ 1 );
                        
                        ArrayPosition[SizeArrayPosition].kod_clana                      = 0 ;
                        ArrayPosition[SizeArrayPosition].open_price                     = trans.price;
                        ArrayPosition[SizeArrayPosition].ticket_position                = trans.position;
                        ArrayPosition[SizeArrayPosition].identi_position                = PositionGetInteger ( POSITION_IDENTIFIER );
                        ArrayPosition[SizeArrayPosition].open_tyme            = ( datetime ) PositionGetInteger ( POSITION_TIME );
                        ArrayPosition[SizeArrayPosition].type       = ( ENUM_POSITION_TYPE ) PositionGetInteger ( POSITION_TYPE );
                        
                     Print ( "\n"
                     "Открылась новая позиция: ticket = " ,ArrayPosition[SizeArrayPosition].ticket_position);
                  }
            }
         if ( HistoryDealGetInteger (trans.deal, DEAL_ENTRY ) == ( DEAL_ENTRY_OUT || DEAL_ENTRY_OUT_BY )) // Закрылась позиция
            {
               int SizeArrayDealOut = ArraySize (ArrayDealOut);
               ArrayResize (ArrayDealOut,SizeArrayDealOut+ 1 );
               ArrayDealOut[SizeArrayDealOut].ticket_position_out = trans.position;
               ArrayDealOut[SizeArrayDealOut].identi_position_out = HistoryDealGetInteger (trans.deal, DEAL_POSITION_ID );
            }          
      }
  }

Pekala, OnTik'te bir yerde: DelitClosePositionFromArrayPosition();

 //+------------------------------------------------------------------+
//| Удаляем закрытые позиции из массива структуры
//+------------------------------------------------------------------+
int DelitClosePositionFromArrayPosition()
{
   int n = 0 ;
   if (!Refresh_Rates()) return ( false );
//---Удаление закрытых позиций из структуры  
   int SizeArrayDealOut  = ArraySize (ArrayDealOut);
   int SizeArrayPosition = ArraySize (ArrayPosition);
   if (SizeArrayDealOut > 0 )
      {
         for ( int i = SizeArrayDealOut+ 1 ; i > 0 ; i--)
            {
               for ( int y = SizeArrayPosition+ 1 ; y > 0 ; y--)
                  {
                     if (ArrayPosition[y].identi_position == ArrayDealOut[i].identi_position_out)
                        {
                           if ( ArrayRemove (ArrayPosition,y, 1 ) && ArrayRemove (ArrayDealOut,i, 1 ))
                              {
                                 SizeArrayDealOut  = ArraySize (ArrayDealOut);
                                 SizeArrayPosition = ArraySize (ArrayPosition);
                                 n++;
                                 break ;
                              }
                        }
                  }
            }
      }            
return (n);
}
 

İyi günler ve tekrar yalvarıyorum. İkinci gün bu kod parçasının neden çalışmadığını anlayamıyorum

 //+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
  {
//---
   if (trans.type == TRADE_TRANSACTION_DEAL_ADD )
      {
         Print ( "Зашла сделка ########## " ,trans.position, " ###########" );
         
         if ( HistoryDealGetInteger (trans.deal, DEAL_ENTRY ) == DEAL_ENTRY_IN ) // Открылась позиция
            {
               if ( PositionSelectByTicket (trans.position))
                  {
                     int SizeArrayPosition = ArraySize (ArrayPosition);
                     ArrayResize (ArrayPosition,SizeArrayPosition+ 1 );
                        
                        ArrayPosition[SizeArrayPosition].kod_clana                         = 0 ;
                        ArrayPosition[SizeArrayPosition].open_price                        = trans.price;
                        ArrayPosition[SizeArrayPosition].ticket_position                   = trans.position;
                        ArrayPosition[SizeArrayPosition].identi_position                   = PositionGetInteger ( POSITION_IDENTIFIER );
                        ArrayPosition[SizeArrayPosition].open_tyme               = ( datetime ) PositionGetInteger ( POSITION_TIME );
                        ArrayPosition[SizeArrayPosition].type_position = ( ENUM_POSITION_TYPE ) PositionGetInteger ( POSITION_TYPE );
                        ArrayPosition[SizeArrayPosition].StopLoss                          = trans.price_sl;
                        ArrayPosition[SizeArrayPosition].TakeProfit                        = trans.price_tp;
                        
                       
                         Print ( " Открыта позиция +++ " ,trans.position, " +++ записана в структуру ArrayPosition ++++++++++++++" );        

                  }
            }
         if ( HistoryDealGetInteger (trans.deal, DEAL_ENTRY ) != DEAL_ENTRY_IN )
            {
               Print ( " Закрыта позиция --- " ,trans.position, " --- записана в структуру ArrayDealOut ------------" );
            }
      }
  }

"Anlaşma girildi ...." yazısı normaldir, o zaman bir bölünme olmalıdır, bazı fırsatlar " Açık pozisyon ...." yazdırılır , ancak geri kalanların tümü (bunlar TakeProfit'teki pozisyonu kapatan anlaşmalardır) yazdırılmaz .

Ne oldu çözemedim. Kayıp işlemler metinde aşağıda renkli olarak vurgulanacaktır.

 2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 54 : 00    CTrade:: OrderSend : market buy 0.01 EURUSD tp: 1.20621 [done at 1.20574 ]
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 54 : 00    Зашла сделка ########## 1042 ###########
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 54 : 00    Открыта позиция +++ 1042 +++ записана в структуру ArrayPosition ++++++++++++++
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 54 : 00    Зашла сделка ########## 1043 ###########
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 54 : 00    Открыта позиция +++ 1043 +++ записана в структуру ArrayPosition ++++++++++++++
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 55 : 43    take profit triggered # 1039 sell 0.01 EURUSD 1.20579 tp: 1.20532 [ # 1044 buy 0.01 EURUSD at 1.20532 ]
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 55 : 43    deal # 1044 buy 0.01 EURUSD at 1.20527 done (based on order # 1044 )
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 55 : 43    deal performed [ # 1044 buy 0.01 EURUSD at 1.20527 ]
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 55 : 43    order performed buy 0.01 at 1.20527 [ # 1044 buy 0.01 EURUSD at 1.20532 ]
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 55 : 43    Зашла сделка ########## 1039 ###########
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 56 : 30    take profit triggered # 1042 sell 0.01 EURUSD 1.20571 tp: 1.20523 [ # 1045 buy 0.01 EURUSD at 1.20523 ]
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 56 : 30    deal # 1045 buy 0.01 EURUSD at 1.20523 done (based on order # 1045 )
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 56 : 30    deal performed [ # 1045 buy 0.01 EURUSD at 1.20523 ]
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 56 : 30    order performed buy 0.01 at 1.20523 [ # 1045 buy 0.01 EURUSD at 1.20523 ]
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 56 : 30    Зашла сделка ########## 1042 ###########
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 57 : 00    На символе EURUSD открылся новый бар в 2018.01 . 02 18 : 57
2020.04 . 12 11 : 27 : 33.103 Core 1    2018.01 . 02 18 : 57 : 00    market sell 0.01 EURUSD tp: 1.20458 ( 1.20507 / 1.20509 / 1.20507 )

Yani sadece biraz SOS !!!

 
Alexey Viktorov :

Alexey, bunların hepsi yalnızca OnTradeTransaction olayının işlenmesi için geçerlidir.

Bir olay meydana geldi, pozisyonu kapatmak için anlaşma yapıldı. Şu anda herhangi bir pozisyon yok. Bunu , siparişler ve fırsatlar listesini (kodda değil) seçip okuyarak onaylayabilirsiniz.

Ve pozisyonun kural olarak sadece iki emri ve iki anlaşması olduğu hadge hesabından bahsettiğimizi unutmayın.

İyi günler, eğer sizin için zor değilse, bu yazıda kesinlikle her şeyi anlattınız. Yukarıda, yukarıdaki iki mesajım, hala ihtiyacım olan sonucu elde etmeye çalışıyorum - pozisyonun kapanmasını düzeltmek için. Ve yine de çalışmıyor.

Söyleyin lütfen, hatam veya kusurum nerede?????

 
Ve böylece bölünme tamamen ortadan kalktı, anlaşıldı ki TakeProfit tarafından bir pozisyon kapatma DEAL_ENTRY_IN'e de uyuyor ???
 void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
  {
//---
   if (trans.type == TRADE_TRANSACTION_DEAL_ADD )
      {
         Print ( "Зашла сделка ########## " ,trans.position, " ###########" );
         
             if ( HistoryDealGetInteger (trans.deal, DEAL_ENTRY ) == DEAL_ENTRY_IN ) // Открылась позиция
               {
                   Print ( "Открыта позиция +++ " ,trans.position, " +++ записана в структуру ArrayPosition ++++++++++++++" );        
               }
             if ( HistoryDealGetInteger (trans.deal, DEAL_ENTRY ) != DEAL_ENTRY_IN )
               {
                   Print ( "Закрыта позиция --- " ,trans.position, " --- записана в структуру ArrayDealOut ------------" );
               }
      }
  }


2020.04 . 12 12 : 10 : 27.368 Core 1    2018.01 . 03 04 : 58 : 00    CTrade:: OrderSend : modify position # 1252 EURUSD (sl: 0.00000 , tp: 0.00000 ) [done]
2020.04 . 12 12 : 10 : 27.368 Core 1    2018.01 . 03 04 : 59 : 38    take profit triggered # 2540 sell 0.01 EURUSD 1.20473 tp: 1.20425 [ # 2676 buy 0.01 EURUSD at 1.20425 ]
2020.04 . 12 12 : 10 : 27.368 Core 1    2018.01 . 03 04 : 59 : 38    deal # 2676 buy 0.01 EURUSD at 1.20425 done (based on order # 2676 )
2020.04 . 12 12 : 10 : 27.368 Core 1    2018.01 . 03 04 : 59 : 38    deal performed [ # 2676 buy 0.01 EURUSD at 1.20425 ]
2020.04 . 12 12 : 10 : 27.368 Core 1    2018.01 . 03 04 : 59 : 38    order performed buy 0.01 at 1.20425 [ # 2676 buy 0.01 EURUSD at 1.20425 ]
2020.04 . 12 12 : 10 : 27.368 Core 1    2018.01 . 03 04 : 59 : 38    Зашла сделка ########## 2540 ###########
2020.04 . 12 12 : 10 : 27.368 Core 1    2018.01 . 03 04 : 59 : 38    Открыта позиция +++ 2540 +++ записана в структуру ArrayPosition ++++++++++++++
2020.04 . 12 12 : 10 : 27.368 Core 1    2018.01 . 03 04 : 59 : 40    take profit triggered # 2473 sell 0.01 EURUSD 1.20472 tp: 1.20424 [ # 2677 buy 0.01 EURUSD at 1.20424 ]

 
Sergey Voytsekhovsky :
Ve böylece bölünme tamamen ortadan kalktı, anlaşıldı ki TakeProfit tarafından bir pozisyon kapatma DEAL_ENTRY_IN'e de uyuyor ???

Bana öyle geliyor ki OnTradeTransaction olayının işlenmesinde bazı değişiklikler yapıldı.

TRADE_TRANSACTION_DEAL_ADD'yi TRADE_TRANSACTION_HISTORY_ADD ile değiştirmeyi deneyin

 
Alexey Viktorov :

Bana öyle geliyor ki OnTradeTransaction olayının işlenmesinde bazı değişiklikler yapıldı.

TRADE_TRANSACTION_DEAL_ADD'yi TRADE_TRANSACTION_HISTORY_ADD ile değiştirmeyi deneyin

yardımcı olmuyor Cevap verdiğiniz için teşekkürler.

 
Alexey Viktorov :

Bana öyle geliyor ki OnTradeTransaction olayının işlenmesinde bazı değişiklikler yapıldı.

TRADE_TRANSACTION_DEAL_ADD'yi TRADE_TRANSACTION_HISTORY_ADD ile değiştirmeyi deneyin

Pozisyon açan işlemler yazdırılır, yani bu seçim çalışır. Ve işlemlerin nasıl seçileceği - pozisyonların kapatılması - terminal işlemler listesinde görünmelerine rağmen (her zaman birkaç veya üç satır daha yüksek) açık değildir.

 

En başından deneyeceğim, atomlar zaten kafamda karmakarışık. Sinema klasiğinin dediği gibi - "Peki, kim böyle inşa eder ..... ????".

 void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
  {

   if (trans.type == TRADE_TRANSACTION_HISTORY_ADD )
      {
         Print ( "Торговая транзакция = Добавление сделки в историю ######### Тикет сделки # " ,trans.deal, " ###########" );
  
      }
  }

Halihazırda bir ticaret işlemi var, ancak henüz bir ticaret bileti yok. Doğru şekilde anladım ???

 2020.04 . 12 14 : 14 : 19.287 Core 1    2018.01 . 02 13 : 15 : 00    deal performed [ # 405 buy 0.01 EURUSD at 1.20646 ]
2020.04 . 12 14 : 14 : 19.287 Core 1    2018.01 . 02 13 : 15 : 00    order performed buy 0.01 at 1.20646 [ # 405 buy 0.01 EURUSD at 1.20646 ]
2020.04 . 12 14 : 14 : 19.287 Core 1    2018.01 . 02 13 : 15 : 00    CTrade:: OrderSend : market buy 0.01 EURUSD tp: 1.20694 [done at 1.20646 ]
2020.04 . 12 14 : 14 : 19.287 Core 1    2018.01 . 02 13 : 15 : 00    Торговая транзакция = Добавление сделки в историю ######### Тикет сделки # 0 ###########
2020.04 . 12 14 : 14 : 19.287 Core 1    2018.01 . 02 13 : 15 : 00    Торговая транзакция = Добавление сделки в историю ######### Тикет сделки # 0 ###########
2020.04 . 12 14 : 14 : 19.287 Core 1    2018.01 . 02 13 : 16 : 02    take profit triggered # 394 sell 0.01 EURUSD 1.20675 tp: 1.20627 [ # 406 buy 0.01 EURUSD at 1.20627 ]
2020.04 . 12 14 : 14 : 19.287 Core 1    2018.01 . 02 13 : 16 : 02    deal # 406 buy 0.01 EURUSD at 1.20627 done (based on order # 406 )
2020.04 . 12 14 : 14 : 19.287 Core 1    2018.01 . 02 13 : 16 : 02    deal performed [ # 406 buy 0.01 EURUSD at 1.20627 ]
 
Sergey Voytsekhovsky :

Pozisyon açan işlemler yazdırılır, yani bu seçim çalışır. Ve işlemlerin nasıl seçileceği - pozisyonları kapatma - terminal işlemler listesinde görünmelerine rağmen (her zaman birkaç veya üç satır daha yüksek) açık değildir.

Mavi düğmeye tıklayarak hata ayıklayıcıdan geçmeyi deneyin.


kesme noktalarını önceden ayarlayın ve hangi değerlerin nerede olduğunu ve ne beklendiğini kontrol edin. Yani, herhangi bir hata görmüyorum, bu yüzden kontrol etmeniz gerekiyor, bu nedenle pozisyonların açılışını yazın, stopları ayarlayın, böylece kapanış için uzun süre beklemek zorunda kalmazsınız ...

 
Sergey Voytsekhovsky :

En başından deneyeceğim, atomlar zaten kafamda karmakarışık. Sinema klasiğinin dediği gibi - "Peki, kim böyle inşa eder ..... ????".

Halihazırda bir ticaret işlemi var, ancak henüz bir ticaret bileti yok. Doğru şekilde anladım ???

Hiç birşey anlamıyorum. İşte çalışan EA'mdan bir kod parçası

 /*********************TradeTransaction function**********************/
void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
 {
   if (trans.type == TRADE_TRANSACTION_HISTORY_ADD )
   {
     if ( HistoryDealGetInteger (trans.deal, DEAL_ENTRY ) == DEAL_ENTRY_IN )
     {
       if ( PositionSelectByTicket (trans.position && PositionGetString ( POSITION_SYMBOL ) == _Symbol ) && PositionGetInteger ( POSITION_MAGIC ) == magick)
       {
         if ( HistorySelectByPosition ( PositionGetInteger ( POSITION_IDENTIFIER )))
         {
           double priceGrid = HistoryOrderGetDouble ( HistoryOrderGetTicket ( 0 ), ORDER_PRICE_OPEN );
           if (priceGrid == 0 )
             DebugBreak ();

ve sonuçta DebugBreak() 'te hiç durmadı; yani her şey sorunsuz çalışıyor.

Görünüşe göre tarihe bir emir eklemek için çalışıyorsunuz ve bir ticaret bileti bekliyorsunuz.

Neden: