Dividere le posizioni aperte in gruppi - pagina 10

 

Lo metto là fuori perché il pubblico lo giudichi. Anche se non ho ancora allegato nessun controllo, ma penso che dovrebbero funzionare.

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

E da qualche parte in 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);
}
 

Buon pomeriggio, e ancora una volta vi prego. Il secondo giorno non riesco a capire perché questo pezzo di codice non funziona

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

La stampa "Deal entered...." va bene, poi ci dovrebbe essere uno split, alcune operazioni"Open position ...." vengono stampate, ma tutte le altre (queste sono operazioni che chiudono la posizione con TakeProfit) non vengono stampate.

Non capisco quale sia il problema. Segnerò i trade persi a colori qui sotto.

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)

Quindi è come un SOS !!!

 
Alexey Viktorov:

Alexey, tutto si riferisce solo alla gestione dell'evento OnTradeTransaction

Si è verificato un evento, è stato eseguito un trade che chiude una posizione. La posizione è già andata in questo momento. Potete confermarlo selezionando una lista di ordini e accordi (non c'è una tale lista nel codice) e leggendo

E si noti che stiamo parlando di un conto hadge in cui la posizione di solito ha solo due ordini e due trade.

Buon pomeriggio, se non vi è di troppo disturbo, avete descritto accuratamente tutto in questo post. Nei miei due post sopra, sto cercando di ottenere il risultato di cui ho bisogno: impegnarmi a chiudere una posizione. Non riesco ancora a farlo.

Per favore consigliatemi, dove ho un errore o un difetto ?????

 
E in questo modo non c'è alcuna distinzione, quindi risulta che la chiusura di una posizione su TakeProfit rientra anche inDEAL_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:
E in questo modo non c'è alcuna separazione, risulta che la chiusura di una posizione a TakeProfit si inserisce anche sotto DEAL_ENTRY_IN?

Mi sembra che siano stati fatti alcuni cambiamenti nella gestione dell'evento OnTradeTransaction.

Prova a sostituire TRADE_TRANSACTION_DEAL_ADD con TRADE_TRANSACTION_HISTORY_ADD

 
Alexey Viktorov:

Mi sembra che siano state fatte alcune modifiche alla gestione dell'evento OnTradeTransaction.

Prova a sostituire TRADE_TRANSACTION_DEAL_ADD con TRADE_TRANSACTION_HISTORY_ADD

Non aiuta. Grazie per il vostro feedback.

 
Alexey Viktorov:

Mi sembra che siano stati fatti alcuni cambiamenti nella gestione dell'evento OnTradeTransaction.

Prova a sostituire TRADE_TRANSACTION_DEAL_ADD con TRADE_TRANSACTION_HISTORY_ADD

Le posizioni di apertura delle transazioni vengono stampate, cioè questa selezione funziona. Ma non è chiaro come selezionare i trade - posizioni di chiusura, anche se sono visibili nella lista delle transazioni del terminale (un paio/tre righe più in alto sempre).

 

Proverò dall'inizio, perché la mia testa è già in disordine. Come diceva il classico del film - "Chi costruisce così.....????".

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

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

C'èuna transazione commerciale, ma non c'è ancora un biglietto commerciale. Ho capito bene?

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:

Le posizioni di apertura delle transazioni vengono stampate, cioè questa selezione funziona. Ma come selezionare le transazioni - posizioni di chiusura - non è chiaro, anche se sono visibili nella lista delle transazioni del terminale (un paio / tre righe più in alto sempre).

Prova a passare nel debugger premendo il pulsante blu.


punti di rottura preimpostati e controllare dove sono i valori e quali valori erano attesi. OK, non mi sembra di vedere alcun errore, quindi devo controllare, quindi scrivere le posizioni aperte, regolare gli stop in modo da non dover aspettare molto per chiudere...

 
Sergey Voytsekhovsky:

Proverò dall'inizio, perché la mia testa è già in disordine. Come diceva il classico del film - "Chi costruisce così.....????".

C'è una transazione commerciale, ma non c'è ancora un biglietto commerciale. Sto leggendo bene?

Non capisco assolutamente nulla. Ecco un pezzo di codice del mio EA in esecuzione

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

E non si è mai fermato su DebugBreak(); quindi tutto funziona senza problemi.

A quanto pare hai un ordine da aggiungere alla cronologia e sei in attesa di un biglietto commerciale.