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

 

나는 그것을 대중에게 가져갈 것이다. 사실, 아직 확인하지 않았지만 작동해야 한다고 생각합니다.

 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 );
            }          
      }
  }

음, OnTick 어딘가에: 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);
}
 

좋은 오후 되세요. 다시 한 번 부탁드립니다. 둘째 날 이 코드가 작동하지 않는 이유를 이해할 수 없습니다.

 //+------------------------------------------------------------------+
//| 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 ------------" );
            }
      }
  }

"Deal entered ...."는 정상이며 분할이 있어야 하며 일부 거래는 " Open position ...." 가 인쇄 되지만 나머지 모든 거래(이것은 TakeProfit 에서 포지션을 마감하는 거래) 는 인쇄되지 않습니다 . .

뭔일인지 알 수가 없네요. 분실된 거래는 아래 텍스트에서 색상으로 강조 표시됩니다.

 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 )

그래서 약간의 SOS !!!

 
Alexey Viktorov :

Alexey, 이것은 모두 OnTradeTransaction 이벤트 처리에만 적용됩니다.

이벤트가 발생했으며 포지션을 닫기 위한 거래가 이루어졌습니다. 현재 자리가 없습니다. 주문 및 거래 목록(코드에 없음)을 선택하고 다음을 읽으면 이를 확인할 수 있습니다.

그리고 우리는 일반적으로 두 개의 주문과 두 개의 거래만 있는 헤지 계정에 대해 이야기하고 있음을 명심하십시오.

좋은 오후입니다. 힘들지 않다면 이 게시물에서 모든 것을 설명했습니다. 위의 두 게시물에서 나는 여전히 필요한 결과를 얻으려고 노력하고 있습니다. 포지션 마감을 수정하는 것입니다. 그런데도 작동하지 않습니다.

내 오류나 결함이 어디 있는지 알려주세요????

 
그래서 부서가 완전히 사라졌고 TakeProfit으로 포지션을 청산하는 것도 DEAL_ENTRY_IN에 맞는 것으로 나타났습니다 ???
 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 :
그래서 부서가 완전히 사라졌고 TakeProfit으로 포지션을 청산하는 것도 DEAL_ENTRY_IN에 맞는 것으로 나타났습니다 ???

OnTradeTransaction 이벤트 처리에 일부 변경 사항이 있는 것 같습니다.

TRADE_TRANSACTION_DEAL_ADD를 TRADE_TRANSACTION_HISTORY_ADD로 교체해 보세요.

 
Alexey Viktorov :

OnTradeTransaction 이벤트 처리에 일부 변경 사항이 있는 것 같습니다.

TRADE_TRANSACTION_DEAL_ADD를 TRADE_TRANSACTION_HISTORY_ADD로 교체해 보세요.

도움이 되지 않습니다. 응답해 주셔서 감사합니다.

 
Alexey Viktorov :

OnTradeTransaction 이벤트 처리에 일부 변경 사항이 있는 것 같습니다.

TRADE_TRANSACTION_DEAL_ADD를 TRADE_TRANSACTION_HISTORY_ADD로 교체해 보세요.

열린 위치 의 거래가 인쇄됩니다. 즉, 이 선택이 작동합니다. 그리고 터미널 거래 목록에서 볼 수 있음에도 불구하고 거래를 선택하는 방법(결산 위치)은 분명하지 않습니다(항상 몇 줄 또는 세 줄 더 높음).

 

나는 처음부터 시도할 것이다. 원자는 이미 내 머리 속을 엉망으로 만들고 있다. 영화의 고전이 말했듯이 - "글쎄, 누가 그런 짓을 ..... ????".

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

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

이미 무역 거래가 있지만 아직 무역 티켓이 없습니다. 내가 제대로 이해했어???

 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 :

열린 위치 의 거래가 인쇄됩니다. 즉, 이 선택이 작동합니다. 그리고 터미널 거래 목록에서 볼 수 있음에도 불구하고 거래를 선택하는 방법(결산 위치)은 분명하지 않습니다(항상 몇 줄 또는 세 줄 더 높음).

파란색 버튼을 클릭하여 디버거를 살펴보십시오.


중단점을 미리 설정하고 값이 어디에 있고 무엇을 예상했는지 확인합니다. 따라서 실수가 보이지 않으므로 확인해야하므로 포지션의 시작을 기록하고 클로저를 오래 기다릴 필요가 없도록 스톱을 조정하십시오 ...

 
Sergey Voytsekhovsky :

나는 처음부터 시도할 것이다. 원자는 이미 내 머리 속을 엉망으로 만들고 있다. 영화의 고전이 말했듯이 - "글쎄, 누가 그런 짓을 ..... ????".

이미 무역 거래가 있지만 아직 무역 티켓이 없습니다. 내가 제대로 이해했어???

나는 아무것도 이해하지 못한다. 다음은 작업 중인 EA의 코드입니다.

 /*********************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 ();

그리고 결국 DebugBreak() 에서 멈추지 않았습니다. 그래서 모든 것이 문제 없이 작동합니다.

분명히 당신은 히스토리에 주문을 추가하는 작업을 하고 있으며 거래 티켓을 기다리고 있습니다.