Borrar en el probador - página 6

 
Roman Shiredchenko #:

También hay un problema de organización, si alguien sabe cómo resolverlo de la mejor manera - por favor, escríbalo en código - se lo trasladaré:

en general, cómo entender que el ciclo de la orden, una nueva posición - PROFIT ha comenzado - para tener en cuenta el precio medio de apertura de la posición (compensación cambia su valor):

para que quede claro, puedo tanto desde el terminal a través de las teclas yo mismo y por un robot con magik....

En general, necesito un punto de informe - para calcular el precio medio de entrada de la posición.

Puedo utilizar los datos de aquí + por ejemplo leer el tiempo en que la posición anterior cerró en beneficio y tomar una diferencia con el tiempo real del servidor de allí, como si inicio un ciclo desde el terminal - sin un robot:

Me refiero a algo así:

como la posición pasada está en el plus - entonces la contabilidad del ciclo actual ya ha comenzado. y las órdenes - ya debe contar tanto el precio de entrada como el volumen para calcular el precio medio de entrada de la posición agregada...

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


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

Por supuesto, lo ideal es que se cierre independientemente del resultado del ciclo anterior: beneficios o pérdidas.

El inicio - el nuevo se marcó para el cálculo en el código - el precio medio del nuevo ciclo actual de los promedios, por ejemplo, o llena - no importa ...

¿Hay alguien dispuesto a calcular el precio medio de la posición final? Me estoy cansando de contar y corregir código - la flor de piedra no funciona....:-)

Probé diferentes métodos en OnTrade Transaction () - muchas cosas extra entran en el cálculo, los lotes se duplican en el resultado - eso no es correcto:

Eventos

"Por ejemplo, cuando se envía una orden de compra a mercado, se procesa, se crea una orden de compra apropiada para la cuenta, se ejecuta la orden, se elimina de la lista de las abiertas, se añade al historial de órdenes, luego se añade una operación apropiada al historial y se crea una nueva posición. Todas estas acciones son transacciones comerciales

"

Esto es a través de la transacción comercial ()

//+------------------------------------------------------------------+
//| 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 este tipo de f-i - lotes en el cálculo del precio medio de entrada de la posición (compensación) no se cuenta correctamente.


Puede ser más fácil hacerlo a través de On Trade.

Ahora mismo lo estoy viendo a través de On Trade (): todo está explicado aquí, sólo hay que insertar el cálculo en el código y ya está... Básicamente.

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


Básicamente, este es el diseño: si hay una posición incrementada, entonces se calculará el precio medio. Cuando se cierra la posición, todas las variables intermedias deben ponerse a cero. Básicamente, todo es elemental allí.

La tarea consiste en excluir los cambios del precio de apertura de la posición durante la compensación (cuando se hace igual al precio del símbolo en el momento de la compensación).

Es decir, leerlo en el código.

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

¿Nadie tiene un diseño preparado para calcular el precio medio de una posición final? Me estoy cansando de contar y corregir código - no funciona....:-)

Aquí hay un trozo de mi viejo, pero todavía "combativo" código:

               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 #:

Aquí hay un trozo de mi código antiguo pero todavía "procesable":

¡¡¡О!!! Muchas gracias por una respuesta tan rápida, la tomaré para revisarla y editarla.
 
Roman Shiredchenko #:
¡¡¡О!!! Muchas gracias por una respuesta tan rápida. Lo subiré para revisarlo y editarlo.

Nota - "st" (hay una estructura bastante grande, incluyendo pistas y estadísticas) es exactamente el "estado" del robot - lo que se vuelca al disco después del cambio (y cuando deinit) y se carga cuando yinit.

Y sí, lo más probable es que st.Price y st.PriceAvr no sean realmente necesarios aquí, uno es suficiente, pero el código es viejo, más de 5 años, y todos mis robots "de combate" están vinculados a él, así que "primera regla de la mecánica de la aviación - no te metas con el mecanismo de trabajo".

 

el resultado de la compensación es la transferencia de todas las posiciones al precio actual, es decir, al precio medio dentro del spread

¿a quién le importa este intercambio? ...

 
JRandomTrader #:

Nota - "st" (hay una estructura bastante grande, incluyendo pistas y estadísticas) es exactamente el "estado" del robot - lo que se vuelca al disco después del cambio (y cuando deinit) y se carga cuando yinit.

Y sí, lo más probable es que st.Price y st.PriceAvr no sean realmente necesarios aquí, uno es suficiente, pero el código es viejo, más de 5 años, y todos mis robots "de combate" están vinculados a él, así que "primera regla de la mecánica de la aviación - no te metas con el mecanismo de trabajo".

Gracias por la aclaración, lo tomaré como básico.
 
Renat Akhtyamov #:

el resultado de la compensación es la transferencia de todas las posiciones al precio actual, es decir, al precio medio dentro del diferencial

¿a quién le importa este intercambio? ...

Publicaré aquí el archivo en cuanto lo haya hecho.
 
Renat Akhtyamov #:

el resultado de la compensación es la transferencia de todas las posiciones al precio actual, es decir, al precio medio dentro del spread

¿A quién le importa el intercambio? ...

Sólo negocio en la bolsa.

 
JRandomTrader #:

Sólo negocio en la bolsa de valores.

y sólo comercio con forex.

No sé cómo operar en el mercado de valores.

He estado allí, he estado allí.

no es lo mío - volver a aprender

por cierto, ¿por qué el precio medio en el mercado no es el que hay después de la compensación?

// si no, cambiaría allí ;)

// pero resulta que no le dan todo al vidrio, lo disimulan un poco, es decir, el vidrio apesta?

 
Roman Shiredchenko #:
Lo publicaré aquí en cuanto haga el fic.

Todo se ha publicado en la sección de comercio de divisas durante mucho tiempo

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

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