Cancellazione nel tester - pagina 6

 
Roman Shiredchenko #:

C'è anche un problema organizzativo, se qualcuno sa come risolverlo nel modo migliore - per favore scrivetelo a parole, lo metterò in codice:

in generale, come capire che il ciclo dell'ordine, una nuova posizione - PROFIT ha iniziato - per prendere in considerazione il prezzo medio di apertura della posizione (compensazione cambia il suo valore):

per essere chiari, posso sia dal terminale tramite i tasti me stesso e da un robot con magik....

In generale, ho bisogno di un punto di rapporto - per calcolare il prezzo medio di entrata della posizione.

Posso usare i dati da qui + per esempio leggere il tempo in cui la posizione precedente ha chiuso in profitto e prendere una differenza con il tempo reale del server da lì, come se iniziassi un ciclo dal terminale - senza un robot:

Intendo qualcosa del genere:

come la posizione passata è sul lato positivo - allora la contabilità del ciclo attuale è già iniziata. e gli ordini - devi già contare sia il prezzo di entrata che il volume per calcolare il prezzo medio di entrata della posizione aggregata...

https://www.mql5.com/ru/articles/211


--------------------------------------------------------------

Naturalmente, idealmente dovrebbe essere chiuso indipendentemente dal risultato del ciclo precedente - profitto o perdita.

L'inizio - il nuovo è stato segnato per il calcolo nel codice - il prezzo medio del nuovo ciclo attuale delle medie, per esempio, o riempie - non importa...

C'è qualcuno pronto a calcolare il prezzo medio della posizione finale? Mi sto stancando di contare e correggere il codice - il fiore di pietra non funziona....:-)

Ho provato diversi metodi in OnTrade Transaction () - molte cose extra entrano nel calcolo, i lotti sono raddoppiati nel risultato - questo non è giusto:

Eventi

"Per esempio, quando si invia un ordine di acquisto a mercato, questo viene elaborato, viene creato un ordine di acquisto appropriato per il conto, l'ordine viene eseguito, rimosso dalla lista di quelli aperti, aggiunto alla cronologia degli ordini, poi viene aggiunta un'operazione appropriata alla cronologia e viene creata una nuova posizione. Tutte queste azioni sono transazioni commerciali

"

Questo è tramite On Trade Transaction ()

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {


 if ((Hour() <= 13 && Minute() < 44) || (Hour() >=14 && Minute() > 5) || 
          (Hour() <= 18 && Minute() < 44) || (Hour() >=19 && Minute() > 5)) 
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)   //TRADE_TRANSACTION_DEAL_ADD)
   
     {
      long deal_type = -1;
      long deal_entry = -1;
      long deal_magic = 0;

      double deal_volume = 0;
      double deal_price  = 0;
      string deal_symbol = "";

      if(HistoryDealSelect(trans.deal))
        {
         // Print(" deal_entry == DEAL_ENTRY_IN, last_price = ",last_price, " last_lots = ",last_lots);

         deal_type    = HistoryDealGetInteger(trans.deal, DEAL_TYPE);
         deal_entry   = HistoryDealGetInteger(trans.deal, DEAL_ENTRY);
         deal_magic   = HistoryDealGetInteger(trans.deal, DEAL_MAGIC);

         deal_volume  = HistoryDealGetDouble(trans.deal, DEAL_VOLUME);
         deal_price   = HistoryDealGetDouble(trans.deal, DEAL_PRICE);
         deal_symbol  = HistoryDealGetString(trans.deal, DEAL_SYMBOL);
         Print(" deal_entry == DEAL_ENTRY_IN, deal_price = ", deal_price, " deal_volume = ", deal_volume);
        }
      else
         return;

      if(deal_symbol == _Symbol) // && deal_magic == MagicNumber)

         if(deal_entry == DEAL_ENTRY_IN && (deal_type == DEAL_TYPE_BUY || deal_type == DEAL_TYPE_SELL))
           {
            // last_price    = deal_price;
            last_pos_type = (deal_type == DEAL_TYPE_BUY) ? POSITION_TYPE_BUY : POSITION_TYPE_SELL;
            // last_lots     = deal_volume;


          
            if (deal_type == DEAL_TYPE_BUY)
             {
              if(deal_volume > 0)  
              if (!PositionSelect(_Symbol) ||
                 (PositionSelect(_Symbol) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY   && 
                 NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits) < last_price))
                        
             
              {
               // расчет средней цены СОВОКУПНОЙ ПОЗИЦИИ для общего случая - входа, как руками, так и роботом 
               last_price = (last_price * last_lots + NormalizeDouble(deal_price,_Digits) *
                             NormalizeDouble(deal_volume,0)) / (last_lots +  NormalizeDouble(deal_volume,0));
               last_price = NormalizeDouble(last_price,_Digits);
               
               last_lots = last_lots + NormalizeDouble(deal_volume,0); // накапливаем совокупный объем
              }
            Print(" OnTradeTransaction_BUY: last_price_BUY = ",last_price, " last_lots_BUY = ",last_lots, " N_max_B = ", N_max_B);
           }
           
         if (deal_type == DEAL_TYPE_SELL)
             {
              if(deal_volume > 0)  
              if (!PositionSelect(_Symbol) ||                
                 (PositionSelect(_Symbol) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL &&
                   (NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits) == 0 ||
                    NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits) > last_price ))) 
                        
             
              {
               // расчет средней цены СОВОКУПНОЙ ПОЗИЦИИ для общего случая - входа, как руками, так и роботом 
               last_price = (last_price * last_lots + NormalizeDouble(deal_price,_Digits) *
                             NormalizeDouble(deal_volume,0)) / (last_lots +  NormalizeDouble(deal_volume,0));
               last_price = NormalizeDouble(last_price,_Digits);
               
               last_lots = last_lots + NormalizeDouble(deal_volume,0); // накапливаем совокупный объем
              }
            Print(" OnTradeTransaction_SELL: last_price_SELL = ",last_price, " last_lots_SELL = ",last_lots, " N_max_S = ", N_max_S);
           }   
           
         } // к if(deal_entry == DEAL_ENTRY_IN && (deal_type == DEAL_TYPE_BUY || deal_type == DEAL_TYPE_SELL))
     }
  }

Con questo tipo di f-i - lotti nel calcolo del prezzo medio di entrata della posizione (netting) non viene contato correttamente.


Potrebbe essere più facile farlo tramite On Trade.

Lo sto guardando attraverso On Trade () in questo momento: tutto è spiegato qui, dobbiamo solo inserire il calcolo nel codice e questo è tutto... Fondamentalmente.

https://www.mql5.com/ru/articles/40


Fondamentalmente, ecco il disegno - se c'è una posizione aumentata, allora il prezzo medio sarà calcolato. Quando la posizione è chiusa, tutte le variabili intermedie devono essere azzerate. Fondamentalmente, tutto è elementare lì.

Il compito è quello di escludere i cambiamenti del prezzo di apertura della posizione durante la compensazione (quando diventa uguale al prezzo del simbolo al momento della compensazione).

Cioè per leggerlo nel codice.

Обработка торговых событий в эксперте при помощи функции OnTrade()
Обработка торговых событий в эксперте при помощи функции OnTrade()
  • www.mql5.com
В 5-ой версии языка MQL появилась масса нововведений, в том числе работа с событиями различных типов (события таймера, торговые события, пользовательские и т.д.). Возможность обработки событий позволяет создавать совершенно новый тип программ для автоматического и полуавтоматического трейдинга. В этой статье мы рассмотрим торговые события и напишем для функции OnTrade() код, который будет обрабатывать событие Trade.
 
Roman Shiredchenko #:

Nessuno ha un progetto pronto per calcolare il prezzo medio di una posizione finale? Mi sto stancando di contare e correggere il codice - non funziona....:-)

Ecco un pezzo del mio vecchio, ma ancora "combattivo" codice:

               Pr=HistoryDealGetDouble(DealTicket,DEAL_PRICE);
               Vol=HistoryDealGetDouble(DealTicket,DEAL_VOLUME);
               if(st.Pos==0.0)
                  st.Price=Pr;
               if((ENUM_DEAL_TYPE)HistoryDealGetInteger(DealTicket,DEAL_TYPE)==DEAL_TYPE_BUY)
                 {
                  if(st.Pos>=0.0) // Увеличиваем лонг
                     st.PriceAvr=(st.PriceAvr*st.Pos+Pr*Vol)/(st.Pos+Vol);
                  else  // st.Pos<0
                    {
                     if(Vol<=-st.Pos) // Кроемся или сокращаем позу
                        Res=(-Vol)*(Pr-st.PriceAvr);
                     else if(Vol>-st.Pos) // Переворот в лонг
                       {
                        Res=st.Pos*(Pr-st.PriceAvr);
                        ClearClosedPos();
                        st.Price=Pr; st.PriceAvr=Pr;
                       }
                    }
                  st.Pos+=Vol; st.PlanPos-=Vol;
                 }
               else if((ENUM_DEAL_TYPE)HistoryDealGetInteger(DealTicket,DEAL_TYPE)==DEAL_TYPE_SELL)
                 {
                  if(st.Pos<=0.0) // Увеличиваем шорт
                     st.PriceAvr=(st.PriceAvr*(-st.Pos)+Pr*Vol)/(-st.Pos+Vol);
                  else  // st.Pos>0
                    {
                     if(Vol<=st.Pos) // Кроемся или сокращаем позу
                        Res=(Vol)*(Pr-st.PriceAvr);
                     else if(Vol>st.Pos) // Переворот в шорт
                       {
                        Res=st.Pos*(Pr-st.PriceAvr);
                        ClearClosedPos();
                        st.Price=Pr; st.PriceAvr=Pr;
                       }
                    }
                  st.Pos-=Vol; st.PlanPos+=Vol;
                 }
 
JRandomTrader #:

Ecco un pezzo del mio codice vecchio ma ancora "azionabile":

О!!! Grazie mille per una risposta così rapida - la prenderò per la revisione e l'editing.
 
Roman Shiredchenko #:
О!!! Grazie mille per una risposta così rapida - la prenderò in considerazione per la revisione e l'editing.

Nota - "st" (c'è una struttura abbastanza grande, incluse le scie e le statistiche) è esattamente lo "stato" del robot - ciò che viene scaricato su disco dopo il cambiamento (e quando deinit) e caricato quando yinit.

E sì, molto probabilmente st.Price e st.PriceAvr non sono davvero necessari qui, uno è sufficiente, ma il codice è vecchio, più di 5 anni, e tutti i miei robot "da combattimento" sono legati ad esso, quindi "prima regola della meccanica aeronautica - non incasinare il meccanismo che funziona".

 

il risultato della compensazione è il trasferimento di tutte le posizioni al prezzo corrente, cioè al prezzo medio all'interno dello spread

a chi interessa questo scambio? ...

 
JRandomTrader #:

Nota - "st" (c'è una struttura abbastanza grande, incluse le scie e le statistiche) è esattamente lo "stato" del robot - ciò che viene scaricato su disco dopo il cambiamento (e quando deinit) e caricato quando yinit.

E sì, molto probabilmente st.Price e st.PriceAvr non sono davvero necessari qui, uno è sufficiente, ma il codice è vecchio, più di 5 anni, e tutti i miei robot "da combattimento" sono legati ad esso, quindi "prima regola della meccanica aeronautica - non incasinare il meccanismo che funziona".

Grazie per il chiarimento, lo prenderò come base.
 
Renat Akhtyamov #:

il risultato della compensazione è il trasferimento di tutte le posizioni al prezzo corrente, cioè al prezzo medio all'interno dello spread

a chi interessa questo scambio? ...

Posterò qui il file non appena l'avrò fatto.
 
Renat Akhtyamov #:

il risultato della compensazione è il trasferimento di tutte le posizioni al prezzo corrente, cioè al prezzo medio all'interno dello spread

A chi interessa lo scambio? ...

Faccio trading solo in borsa.

 
JRandomTrader #:

Faccio trading solo in borsa.

e faccio solo trading sul forex.

Non so come fare trading in borsa.

Ci sono stato, ci sono stato.

non è il mio genere - reimparare

a proposito, perché il prezzo medio sul mercato non è quello dopo la compensazione?

// altrimenti ci farei del commercio ;)

// ma a quanto pare non danno tutto nel bicchiere, nascondono un po', cioè il bicchiere fa schifo?

 
Roman Shiredchenko #:
Lo posterò qui non appena avrò fatto la fic.

Tutto è stato pubblicato nella sezione Exchange Trading per molto tempo

https://www.mql5.com/ru/forum/67298/page3#comment_2109451

ФОРТС: В помощь начинающим
ФОРТС: В помощь начинающим
  • 2015.12.08
  • www.mql5.com
Установка отложенного ордера командой OrderSend().