Test cihazında temizleme - sayfa 6

 
Roman Shiredchenko # :

hala kursta olan ve bunu en iyi şekilde nasıl çözeceğini bilen bir organizasyon planı momentik var - sizden kodda kelimelerle yazmanızı rica ediyorum - değiştireceğim:

genel olarak, emir döngüsünün, yeni bir pozisyon - KAR YENİ başladı - ortalama pozisyon açılış fiyatını hesaba katmak için nasıl anlaşılır (bunun takası değeri değiştirir):

açıklığa kavuşturmak için, terminalden kendim ve sihirbazlı bir robot aracılığıyla anahtarlardan da girebilirim ....

Genel olarak, bir pozisyona girişin ortalama fiyatını hesaplamak için bir raporlama noktasına ihtiyacınız vardır.

Buradaki verileri kullanabilirsin + örneğin, önceki pozisyonun kârla kapandığı zamanı okuyabilir ve oradan sunucunun gerçek zamanı ile farkı alabilir, sanki döngüyü kendim terminalden başlatıyormuşum gibi - sihir olmadan:

iyi, şöyle bir şey:

artıdaki önceki pozisyon gibi - o zaman mevcut döngünün muhasebesi zaten başlamıştır. ve emirler - toplam pozisyon için ortalama giriş fiyatını hesaplamak için hem giriş fiyatını hem de hacmi zaten hesaplamanız gerekir...

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


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

Tabii ki, ideal olarak, önceki döngünün sonucu ne olursa olsun, artı veya eksi olarak kapatılacak şekilde yapılmalıdır.

Kodda hesaplama için yenisinin başlangıcı belirtildi - örneğin yeni bir fiili ortalama döngüsünün ortalama fiyatının veya tamamlamanın - önemli değil...

Nihai pozisyonun ortalama fiyatını hesaplamak için hazır bir yapı yok mu? Bir şey zaten kodu saymaktan ve düzenlemekten bıktı - taş çiçek çıkmıyor .... :-)

OnTrade İşleminde () çeşitli şekillerde denedim - hesaba birçok ekstra şey giriyor, sonuç olarak hesaplamada çok şey iki katına çıkıyor - bu doğru değil:

Olaylar

"Örneğin, bir piyasa alış emri gönderildiğinde işlenir, hesaba karşılık gelen bir alış emri oluşturulur, emir yürütülür, açık emirler listesinden çıkarılır, emir geçmişine eklenir, ardından ilgili emir verilir. işlem geçmişine eklenir ve yeni bir pozisyon oluşturulur.Bütün bu işlemler alım satım işlemleridir.

"

Bu, On Trade Transaction() yoluyladır.

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

Bu tür bir fonksiyonla - bir pozisyona ortalama giriş fiyatının hesaplanmasında (netleme muhasebesi) lotlar doğru şekilde sayılmaz.


Bunu Ticarette yapmak daha kolay olabilir.

İşte Ticaret () üzerinden bitti şimdi bakıyorum: her şey burada boyanmış, sadece hesaplamayı koda eklemeniz gerekiyor ve bu kadar ... aslında.

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


Aslında, işte tasarım - poz artarsa - o zaman ortalama fiyatı düşünün. Bir pozisyonu kapatırken, tüm ara değişkenler sıfıra ayarlanır ve bu kadar. Orada, aslında, her şey temeldir.

Görev, takas sırasında bir pozisyonun açılış fiyatındaki bir değişikliği hariç tutmaktır (takas sırasında bir sembolün fiyatına eşit olduğunda).

Onlar. kodda sayın.

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

Nihai pozisyonun ortalama fiyatını hesaplamak için hazır bir yapı yok mu? Bir şey zaten kodu saymaktan ve düzenlemekten bıktı - taş çiçek çıkmıyor .... :-)

İşte eski ama yine de "savaş" kodumun bir parçası:

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

İşte eski ama yine de "savaş" kodumun bir parçası:

Ö!!! ATP, bu kadar hızlı yanıt için büyük - İnceleme ve düzenleme için alacağım.
 
Roman Shiredchenko # :
Ö!!! ATP, bu kadar hızlı yanıt için büyük - İnceleme ve düzenleme için alacağım.

Dikkatinizi çekiyorum - "st" (izler ve istatistikler dahil oldukça büyük bir yapı var) - bu sadece robotun "durumu" - değişiklikten sonra (ve başlatma sırasında) diske atılan ve yüklenen şey init sırasında.

Ve evet, burada büyük olasılıkla st.Price ve st.PriceAvr esasen gerekli değildir, bir tane yeterlidir, ancak kod eski, 5 yıldan daha eski ve tüm "savaş" robotlarım ona bağlı, yani "ilk bir uçak tamircisinin kuralı - çalışan bir mekanizmaya dokunmayın".

 

temizleme sonucu - tüm pozisyonların mevcut pozisyona aktarılması, yani. spread içindeki ortalama fiyata

Bu değiş tokuşta birine teslim oldun mu? ...

 
JRandomTrader # :

Dikkatinizi çekiyorum - "st" (izler ve istatistikler dahil oldukça büyük bir yapı var) - bu sadece robotun "durumu" - değişiklikten sonra (ve başlatma sırasında) diske atılan ve yüklenen şey init sırasında.

Ve evet, burada büyük olasılıkla st.Price ve st.PriceAvr esasen gerekli değildir, bir tane yeterlidir, ancak kod eski, 5 yıldan daha eski ve tüm "savaş" robotlarım ona bağlı, yani "ilk bir uçak tamircisinin kuralı - çalışan bir mekanizmaya dokunmayın".

Açıklama için ATP, temel yürütme için alacağım.
 
Renat Akhtyamov # :

temizleme sonucu - tüm pozisyonların mevcut pozisyona aktarılması, yani. spread içindeki ortalama fiyata

Bu değiş tokuşta birine teslim oldun mu? ...

Bitirdiğimde burada yayınlayacağım.
 
Renat Akhtyamov # :

temizleme sonucu - tüm pozisyonların mevcut pozisyona aktarılması, yani. spread içindeki ortalama fiyata

Bu değiş tokuşta birine teslim oldun mu? ...

Sadece borsada işlem yapıyorum.

 
JRandomTrader # :

Sadece borsada işlem yapıyorum.

ve ben sadece forexdeyim

ticaret yapmayı bilmiyorum

oraya gitti orda açıldı

benim değil - tekrar çalış

Bu arada, neden cam başına ortalama fiyat takastan sonraki fiyat değil?

// yoksa orada böyle ticaret yapardım;)

// ama bardağa giderken her şey verilmez, biraz saklanırlar, yani. bir bardak bok?

 
Roman Shiredchenko # :
Bitirdiğimde burada yayınlayacağım.

Her şey uzun zaman önce "Döviz Ticareti" bölümünde yayınlandı

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

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