Limpeza no testador - página 6

 
Roman Shiredchenko #:

Há também uma questão organizacional, se alguém souber como resolvê-la da melhor maneira - por favor, escreva-a em código - eu a moverei até você:

em geral, como entender que o ciclo do pedido, uma nova posição - LUCRO começou - para levar em conta o preço médio de abertura da posição (a compensação muda seu valor):

para ser claro, eu mesmo posso tanto do terminal através das chaves como por um robô com magik....

Em geral, eu preciso de um ponto de relatório - para calcular o preço médio de entrada da posição.

Posso usar dados daqui + por exemplo, tempo de leitura quando a posição anterior fechou em lucro e tirar uma diferença com o tempo real do servidor de lá, como se eu iniciasse um ciclo a partir do terminal - sem um robô:

Refiro-me a algo como isto:

como a posição passada está no lado positivo - então a contabilidade do ciclo atual já começou. e encomendas - você já deve contar tanto o preço de entrada como o volume para calcular o preço médio de entrada da posição agregada...

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


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

Naturalmente, o ideal é que seja fechado independentemente do resultado do ciclo anterior - lucro ou prejuízo.

O início - o novo foi marcado para cálculo no código - o preço médio do novo ciclo atual de médias, por exemplo, ou preenche - não importa...

alguém pronto para calcular o preço médio da posição final? Estou ficando cansado de contar e corrigir códigos - a flor de pedra não funciona....:-)

Eu tentei métodos diferentes em OnTrade Transaction () - muitas coisas a mais entram em cálculo, muitas coisas a mais dobram no resultado - isso não está certo:

Eventos

"Por exemplo, ao enviar uma ordem de compra de mercado, ela é processada, uma ordem de compra apropriada é criada para a conta, a ordem é executada, retirada da lista das abertas, adicionada ao histórico de ordens, então um negócio apropriado é adicionado ao histórico e uma nova posição é criada. Todas estas ações são transações comerciais

"

Isto é via 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))
     }
  }

Com este tipo de f-i - os lotes na posição média de cálculo do preço de entrada (netting) não são contados corretamente.


Talvez seja mais fácil fazê-lo através do On Trade.

Estou olhando através da On Trade () agora mesmo: tudo é explicado aqui, só temos que inserir o cálculo no código e isso é tudo... Basicamente.

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


Basicamente, aqui está o projeto - se houver um aumento de posição, então o preço médio será calculado. Quando a posição é fechada, todas as variáveis intermediárias devem ser zeradas. Basicamente, ali tudo é elementar.

A tarefa é excluir mudanças no preço de abertura da posição durante a compensação (quando ele se torna igual ao preço simbólico no momento da compensação).

Isto é, para lê-lo no código.

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

Ninguém tem um projeto pronto para calcular o preço médio de uma posição final? Estou ficando cansado de contar e corrigir códigos - não funciona....:-)

Aqui está um pedaço do meu antigo, mas ainda "lutando" 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 #:

Aqui está um pedaço do meu antigo mas ainda "acionável" código:

О!!! Muito obrigado por uma resposta tão rápida - vou levá-la para revisão e edição.
 
Roman Shiredchenko #:
О!!! Muito obrigado por uma resposta tão rápida - eu a levarei para revisão e edição.

Nota - "st" (há uma estrutura bastante grande, incluindo trilhas e estatísticas) é exatamente o "estado" do robô - o que é jogado em disco após a mudança (e quando deinit) e carregado quando yinit.

E sim, muito provavelmente o st.Price e st.PriceAvr não são realmente necessários aqui, um é suficiente, mas o código é antigo, mais de 5 anos, e todos os meus robôs "de combate" estão ligados a ele, então "primeira regra da mecânica da aviação - não mexa com o mecanismo de funcionamento".

 

o resultado da compensação é a transferência de todas as posições para o preço atual, ou seja, para o preço médio dentro do spread

quem se importa com esta troca? ...

 
JRandomTrader #:

Nota - "st" (há uma estrutura bastante grande, incluindo trilhas e estatísticas) é exatamente o "estado" do robô - o que é jogado em disco após a mudança (e quando deinit) e carregado quando yinit.

E sim, muito provavelmente o st.Price e st.PriceAvr não são realmente necessários aqui, um é suficiente, mas o código é antigo, mais de 5 anos, e todos os meus robôs "de combate" estão ligados a ele, então "primeira regra da mecânica da aviação - não toque no mecanismo de trabalho".

Obrigado pelo esclarecimento, tomo isso como básico.
 
Renat Akhtyamov #:

o resultado da compensação é a transferência de todas as posições para o preço atual, ou seja, para o preço médio dentro do spread

quem se importa com esta troca? ...

Colocarei o arquivo aqui assim que eu o tiver feito.
 
Renat Akhtyamov #:

o resultado da compensação é a transferência de todas as posições para o preço atual, ou seja, para o preço médio dentro do spread

Quem se importa com a troca? ...

Eu só negocio na troca.

 
JRandomTrader #:

Eu só negocio na bolsa de valores.

e eu só negocio forex.

Eu não sei como negociar na bolsa de valores.

eu já estive lá, eu já estive lá.

não minha coisa - reaprender

a propósito, por que o preço médio no mercado não é o preço depois da compensação?

// ou então eu trocaria lá ;)

// mas como acontece que eles não dão tudo para o copo, eles o escondem um pouco, ou seja, o copo suga?

 
Roman Shiredchenko #:
Vou postar aqui assim que eu fizer a ficção.

Tudo foi publicado na seção de negociação de câmbio por um longo tempo

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

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