Dividere le posizioni aperte in gruppi - pagina 9

 
Sergey Voytsekhovsky:

Se ho capito bene, questo è il modo giusto di procedere. Come compagno più esperto, per favore consigliate, allo scopo di catturare posizioni neonate un tale filtro funzionerà? O forse c'è un'opzione migliore?

Questo è per Alexey - non lavoro con OnTradeTransaction() per qualche motivo.

 
Alexey Viktorov:

Sta quindi suggerendo di rimandare gli altri post? Lasciare che non vengano menzionati? Non è giusto.

Secondo me, è meglio definire una sezione separata del forum in cui ogni problema sarebbe un argomento separato. Il numero di argomenti è molto inferiore al numero di post per argomento. Quindi, nonostante il considerevole numero di argomenti, non verranno rimandati indietro come vengono rimandati i singoli problemi e le segnalazioni di bug ora.

Bene, hai evidenziato in rosso che non lo sai. Qual era il problema? Come si è manifestato? E qual è il nuovo metodo?

Per quanto riguarda la segnalazione di bug: "giusto o sbagliato", ma se volete segnalarlo, lo farete. E se non vuoi, non vuoi. E chiudersi come "lasciare che la gente parli del proprio" è una scusa.

 
Sergey Voytsekhovsky:

Se ho capito bene, questo è il modo giusto di procedere. Come compagno più esperto, per favore consigliate, allo scopo di catturare posizioni neonate un tale filtro funzionerà? O forse c'è un'opzione più corretta?

Secondo me, questa linea

         if(trans.type != TRADE_TRANSACTION_ORDER_DELETE)

inutile. E in generale, sto riconsiderando l'operazione OnTradeTransaction per la seguente variante

  if(trans.type == TRADE_TRANSACTION_HISTORY_ADD)

Al momento dell'aggiunta di un affare non abbiamo un biglietto dell'ordine che ha generato l'affare. Ma se abbiamo bisogno di un ticket per l'ordine e le sue proprietà, come ora ho bisogno del prezzo di apertura dell'ordine per non disabilitare il passo della griglia a causa dello slippage, allora è la variante migliore. imho.

In generale, sono un sostenitore della scrittura per un compito specifico. Al contrario, SB ha una grande universalità che richiede variabili aggiuntive che a volte non sono assolutamente necessarie.

 
Artyom Trishkin:

Beh, hai evidenziato in rosso quello che non sapevi. Qual era il problema? Come si manifestava? E qual era il nuovo metodo?

E riguardo ai messaggi di errore: "giusto o sbagliato", ma se vuoi segnalarlo, lo segnalerai. E se non vuoi, non vuoi. E chiudersi come "lasciare che la gente parli del suo" è una scusa.

Da qualche parte nei miei vecchi dischi ho ancora i vecchi terminali. Se riesco a trovarli, vi mostrerò la vecchia biblioteca e quella nuova. Poi avremo una conversazione sostanziale. Altrimenti, ricordo che non lo fai, quindi cosa c'è da parlare? Come spiegare, mostrare ciò che ora non c'è.
 
Alexey Viktorov:

A mio parere, questa linea

inutile. In generale, sto riconsiderando l'operazione OnTradeTransaction per la seguente variante

Al momento di aggiungere un trade non c'è nessun ticket dell'ordine che ha generato il trade. Ma se hai bisogno di un biglietto dell'ordine e delle sue proprietà, come ora ho bisogno del prezzo di apertura dell'ordine, in modo che il passo della griglia non venga abbattuto a causa dello slippage, allora questa è l'opzione migliore. imho.

In generale, sono un sostenitore dello sviluppo per un compito particolare. E l'UB ha stipulato l'universalità, che richiede variabili aggiuntive, a volte assolutamente inutili.

Estremamente grato per avermi indicato la giusta direzione. L'ho fatto in questo modo (sotto, sembra 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) // открылась позиция
            {
               int SizeArrayPosition = ArraySize(ArrayPosition);
               ArrayResize(ArrayPosition,SizeArrayPosition+1);
               
               if(PositionSelectByTicket(trans.position)){
               ArrayPosition[SizeArrayPosition].ticket_pos = trans.position;
               ArrayPosition[SizeArrayPosition].open_price = trans.price;
               ArrayPosition[SizeArrayPosition].open_tyme  = (datetime)PositionGetInteger(POSITION_TIME);
               ArrayPosition[SizeArrayPosition].type       = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
               ArrayPosition[SizeArrayPosition].kod_clana  = 0;
               
               Print("\n"
               "Открылась новая позиция: ticket = ",ArrayPosition[SizeArrayPosition].ticket_pos);}}}
  }

Ora sono perplesso su come catturare i ticker delle posizioni che hanno chiuso al Take Profit o con un ordine diretto. Abbiamo solo bisogno di tick da loro per rimuovere queste posizioni dall'array principale di posizioni.

 
Sergey Voytsekhovsky:

Estremamente grato per la guida nella giusta direzione. L'ho fatto (sotto, sembra funzionare):

Ora sono perplesso su come catturare i tick delle posizioni che hanno chiuso al takeprofit o per ordine diretto. Abbiamo solo bisogno di tick da loro per rimuovere queste posizioni dall'array di posizioni principale.

Aggiungerei un controllo per il simbolo e il mago.

    if(PositionSelectByTicket(trans.position) && PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == magick)
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)

Ecco un frammento del mio codice in cui viene rilevata la chiusura della posizione.

    if(!PositionSelectByTicket(trans.position))
     {
      HistorySelectByPosition(trans.position);
      ulong ordTicket = HistoryOrderGetTicket(0);
      if(HistoryOrderGetInteger(ordTicket, ORDER_MAGIC) == magick && HistoryOrderGetString(ordTicket, ORDER_SYMBOL) == _Symbol)
       {

Possiamo anche dividere per motivi di chiusura dall'enumerazione ENUM_DEAL_REASON

In un altro Expert Advisor

    if(!PositionSelectByTicket(trans.position))
     {
      if(trans.symbol == _Symbol && HistorySelectByPosition(HistoryDealGetInteger(trans.deal, DEAL_POSITION_ID)))
       {
        int dealTotal = HistoryDealsTotal();
        long posMagic = 0;
        ulong dealTicketIN = HistoryDealGetTicket(0);
        if(HistoryDealGetInteger(dealTicketIN, DEAL_ENTRY) == DEAL_ENTRY_IN)
          posMagic = HistoryDealGetInteger(dealTicketIN, DEAL_MAGIC);
        if(posMagic == magick)
         {
          ulong dealTicketOUT = HistoryDealGetTicket(1);
          if(HistoryDealGetInteger(dealTicketOUT, DEAL_ENTRY) == DEAL_ENTRY_OUT)
           {

Nel primo caso ho bisogno di un ordine, nel secondo caso basta un accordo. In generale, quando ho bisogno di qualcosa, la scrivo.

 
Alexey Viktorov:

Aggiungerei anche un controllo per il simbolo e la magia

Ecco un frammento del mio codice in cui viene rilevata la chiusura della posizione.

Possiamo anche dividere per motivi di chiusura dall'enumerazione ENUM_DEAL_REASON

Qui in un altro Expert Advisor

Nel primo caso ho bisogno di ordine, nel secondo caso il commercio è sufficiente. In generale, lo scrivo quando ne ho bisogno.

Buona sera. La vostra reattività e considerazione mi fanno grande onore. Molto obbligato. Come dicono i giovani - rispetto e rispetto.

Grazie per i vostri saggi consigli. Per uno, non sono molto necessari al momento, il mio Expert Advisor non ha e probabilmente non avrà concorrenti perché è ad alta frequenza, un sacco di piccole posizioni. Sta soffocando da solo, dove altro può competere con gli altri? Naturalmente, se si tratta di questo, ne avrà uno nel terminale e nel conto. La seconda è probabilmente inverosimile, non so ancora molto, ma forse risparmierà un po' di risorse.

I vostri esempi sono buoni, li salverò sicuramente, ma non ho nessun biglietto, nessun ordine, nessun accordo. Più precisamente, ne ho centinaia e non so quale si chiuderà ora. Mi avete suggerito di pensare che il fatto di chiudere una posizione può essere tirato fuori dai miei calcoli e proverò a farlo ora.

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

Il mio Expert Advisor sarà un generatore di posizioni e sa come aprire attivamente le posizioni e chiuderle allo stesso tempo. L'unica cosa è trovare questa posizione (il biglietto di posizione) nell'array/struttura e rimuoverlo. Quindi è così.

E come la macchina da scrivere, cercherò di usare un codice di esempio dal riferimento, nella sezione su questa funzione, si chiama lì:

//|OnTradeTransaction_Sample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp.
//|https://www.mql5.com ||
//+------------------------------------------------------------------+
#property copyright"Copyright 2018, MetaQuotes Software Corp."
#proprietà link"https://www.mql5.com"
#proprietà versione"1.00"
#property description"Esempio di ascoltatore di eventi TradeTransaction"

 
Sergey Voytsekhovsky:

Buona sera. La vostra reattività e attenzione mi fanno onore. Molto obbligato. Come dicono i giovani, complimenti e rispetto.

Grazie per i vostri saggi consigli. Non accendo Magik e il simbolo perché, in primo luogo, non sono molto necessari in questo momento, il mio Expert Advisor non ha e probabilmente non avrà concorrenti, perché ha una frequenza elevata, un numero enorme di posizioni minime. Sta soffocando da solo, dove altro può competere con gli altri? Naturalmente, se si arriva a questo, sarà l'unico nel terminale e nel conto. La seconda è probabilmente inverosimile, non so ancora molto, ma forse risparmierà un po' di risorse.

I vostri esempi sono buoni, li salverò sicuramente, ma non ho nessun biglietto, nessun ordine, nessun accordo. Più precisamente, ne ho centinaia e non so quale si chiuderà ora. Mi avete suggerito di pensare che il fatto di chiudere una posizione può essere tirato fuori dai miei calcoli e proverò a farlo ora.

Il mio Expert Advisor sarà un generatore di posizioni e sa come aprire attivamente le posizioni e chiuderle allo stesso tempo. L'unica cosa è trovare questa posizione (il biglietto di posizione) nell'array/struttura e rimuoverlo. Quindi è così.

E come macchina da scrivere, cercherò di usare il codice di esempio del riferimento, nella sezione su questa funzione, si chiama lì:

È sempre bello condividere la mia piccola conoscenza con qualcuno che sta capendo qualcosa da solo dalla documentazione sulla base di questi consigli. © I.A. Krylov. Il Cuculo loda il Gallo perché loda il Cuculo. )))

Se stai scrivendo un EA solo per te stesso, ovviamente puoi prenderti delle libertà. Se non pensate che sia necessario controllare il simbolo e il mago, allora non fatelo.

Circa l'evidenziato:

C'è tutto, il biglietto di posizione, il biglietto d'ordine e il biglietto di transazione. E non è nemmeno difficile tirare un trade e/o un ordine di apertura della posizione. È tutto nella struttura MqlTradeTransaction


    if(!PositionSelectByTicket(trans.position)) // Если позицию выбрать не получилось, значит она закрыта
     {
      HistorySelectByPosition(trans.position); // Получим список ордеров и сделок относящихся к этой, конкретной позиции
      ulong ordTicket = HistoryOrderGetTicket(0); // Получили тикет ордера который породил сделку и позицию.
      if(HistoryOrderGetInteger(ordTicket, ORDER_MAGIC) == magick && HistoryOrderGetString(ordTicket, ORDER_SYMBOL) == _Symbol)
       {
 
Если позицию выбрать не получилось, значит она закрыта 
Ой-ли? 
 
Алексей Тарабанов:

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. Questo può essere confermato selezionando la lista degli ordini e delle offerte (non presente nel codice) e leggendo

          ulong dealTicketOUT = HistoryDealGetTicket(1);
          if(HistoryDealGetInteger(dealTicketOUT, DEAL_ENTRY) == DEAL_ENTRY_OUT)
E si noti che stiamo parlando di un conto hadge in cui la posizione di solito ha solo due ordini e due trade.