Nettoyage dans le testeur - page 6

 
Roman Shiredchenko #:

Il y a aussi un problème d'organisation, si quelqu'un sait comment le résoudre de la meilleure façon - écrivez-le en mots, je le mettrai en code :

en général, comment comprendre que le cycle des ordres, une nouvelle position - PROFIT a commencé - pour prendre en compte le prix moyen d'ouverture de la position (la compensation change sa valeur) :

pour être clair, je peux à la fois du terminal via les touches moi-même et par un robot avec magik....

En général, j'ai besoin d'un point de rapport - pour calculer le prix d'entrée moyen de la position.

Puis-je utiliser les données d'ici + par exemple lire le moment où la position précédente a clôturé en profit et prendre une différence avec le temps réel du serveur à partir de là, comme si je démarrais un cycle à partir du terminal - sans robot :

Je veux dire quelque chose comme ça :

comme la position passée est du côté positif - alors la comptabilité du cycle actuel a déjà commencé. et les ordres - vous devez déjà compter le prix d'entrée et le volume pour calculer le prix d'entrée moyen de la position globale...

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


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

Bien entendu, l'idéal serait de le clôturer indépendamment du résultat du cycle précédent - bénéfice ou perte.

Le début - le nouveau a été marqué pour le calcul dans le code - le prix moyen du nouveau cycle actuel des moyennes, par exemple, ou des remplissages - il n'a pas d'importance ...

Quelqu'un est-il prêt à calculer le prix moyen de la position finale? Je suis fatigué de compter et de corriger le code - la fleur de pierre ne fonctionne pas....:-)

J'ai essayé différentes méthodes dans OnTrade Transaction () - beaucoup de choses supplémentaires entrent dans le calcul, les lots sont doublés dans le résultat - ce n'est pas correct :

Événements

"Par exemple, lors de l'envoi d'un ordre d'achat sur le marché, celui-ci est traité, un ordre d'achat approprié est créé pour le compte, l'ordre est exécuté, retiré de la liste des ordres ouverts, ajouté à l'historique des ordres, puis une transaction appropriée est ajoutée à l'historique et une nouvelle position est créée. Toutes ces actions sont des transactions commerciales

"

Ceci se fait par le biais d'une transaction commerciale ()

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

Avec ce type de f-i - lots dans le calcul du prix d'entrée de la position moyenne (netting) n'est pas compté correctement.


Il peut être plus facile de le faire via On Trade.

Pour l'instant, je regarde à travers On Trade () : tout est expliqué ici, il suffit d'insérer le calcul dans le code et c'est tout... En gros.

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


En gros, voici la conception : s'il y a une position accrue, alors le prix moyen sera calculé. Lorsque la position est fermée, toutes les variables intermédiaires doivent être remises à zéro. En gros, tout y est élémentaire.

La tâche consiste à exclure les changements du prix d'ouverture de la position pendant la compensation (lorsqu'il devient égal au prix du symbole au moment de la compensation).

C'est-à-dire de le lire dans le code.

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

Personne n'a une conception toute prête pour calculer le prix moyen d'une position finale? Je suis fatigué de compter et de corriger le code - ça ne marche pas....:-)

Voici un morceau de mon vieux code, mais toujours "combattant" :

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

Voici un morceau de mon vieux code, mais toujours utilisable :

О !!! Merci beaucoup pour cette réponse si rapide - je vais la prendre pour la revoir et l'éditer.
 
Roman Shiredchenko #:
О !!! Merci beaucoup pour cette réponse rapide. Je vais la prendre en compte pour la revoir et l'éditer.

Note - "st" (il y a une structure assez grande, incluant les traces et les statistiques) est exactement "l'état" du robot - ce qui est vidé sur le disque après un changement (et quand deinit) et chargé quand yinit.

Et oui, très probablement st.Price et st.PriceAvr ne sont pas vraiment nécessaires ici, un seul suffit, mais le code est vieux, plus de 5 ans, et tous mes robots de "combat" sont liés à lui, donc "première règle de la mécanique aéronautique - ne pas toucher au mécanisme qui fonctionne".

 

le résultat de la compensation est le transfert de toutes les positions au prix actuel, c'est-à-dire au prix moyen à l'intérieur du spread.

qui se soucie de cet échange ? ...

 
JRandomTrader #:

Note - "st" (il y a une structure assez grande, incluant les traces et les statistiques) est exactement "l'état" du robot - ce qui est vidé sur le disque après un changement (et quand deinit) et chargé quand yinit.

Et oui, très probablement st.Price et st.PriceAvr ne sont pas vraiment nécessaires ici, un seul suffit, mais le code est vieux, plus de 5 ans, et tous mes robots de "combat" sont liés à lui, donc "première règle de la mécanique aéronautique - ne pas toucher au mécanisme qui fonctionne".

Merci pour cette précision, je la prends comme une base.
 
Renat Akhtyamov #:

le résultat de la compensation est le transfert de toutes les positions au prix actuel, c'est-à-dire au prix moyen à l'intérieur du spread.

qui se soucie de cet échange ? ...

Je posterai le fichier ici dès que je l'aurai fait.
 
Renat Akhtyamov #:

le résultat de la compensation est le transfert de toutes les positions au prix actuel, c'est-à-dire au prix moyen à l'intérieur du spread.

Qui se soucie de l'échange ? ...

Je ne négocie que sur le marché boursier.

 
JRandomTrader #:

Je ne fais du commerce qu'en bourse.

et je ne fais que du forex.

Je ne sais pas comment négocier en bourse.

Je suis passé par là, je suis passé par là.

pas mon truc - réapprendre

Au fait, pourquoi le prix moyen du marché n'est-il pas celui qui suit la compensation ?

// sinon je ferais du commerce là-bas ;)

// mais il s'avère qu'ils ne donnent pas tout dans le verre, ils en cachent un peu, c'est-à-dire que le verre est nul ?

 
Roman Shiredchenko #:
Je la posterai ici dès que j'aurai créé la fiction.

Tout est affiché depuis longtemps dans la section consacrée à la négociation en bourse

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

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