Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 1207

 

mql5 (hedge)

nasıl uygulanır   pozisyonları ikişer kapatma algoritması   koşullar?

1 vaka.   2 pozisyon açıksa, kârın fazla olduğu pozisyonu kapatın... 2. durum. 2 veya daha fazla pozisyon açıksa, değere göre ortalama alarak kapatın...

Şimdi bu tür pozisyonları iki yöntem kullanarak kapatıyorum,

1. durum için, pozisyonları kâra göre karşılaştırmak ve kârı daha yüksek olanı kapatmak; 2. durumda, tüm pozisyonları, Özsermaye ile ortalama alarak kapatmak.

Bireysel olarak, bu yöntemler iyi çalışır, ancak birlikte çalışmazlar.   iki olaydan birinin her iki yöntemin dağılımına girmesi nedeniyle.

Ve görünüşe göre onları ayıramıyorum. Sonuç olarak, her iki dava da esas olarak tüm pozisyonların kapatılmasıyla Özkaynak tarafından kapatılır. Bu, ilk durumda istenen pozisyonun silinmesine ve yeniden açılmasına neden olur.

Sonuç olarak. Çifte yayılma, çift komisyon. sinir bozucu)))

Sipariş ve pozisyon verme şeması şöyle görünür:    SATIŞ için (ve sonra sadece SATIŞ için)

Sınır emri. SATIŞ_LIMIT _

konum.                   SATMAK    (her zaman siparişler arasında)

Siparişi durdur.   SATIŞ_DURDUR _

Ekli diyagramdır.

Kapanış pozisyonları.

1.   durdurma emri tetiklendiyse , yani aynı anda   iki veya daha fazla pozisyon ortaya çıktı, o zaman bir pozisyonu kapatmanız gerekiyor,   daha fazla kar... (20)

2. bir limit emri tetiklendiyse, yani, aynı anda iki veya daha fazla pozisyon açıksa, o zaman onları (özsermayeye göre)...(15) değerine göre ortalamasını alarak kapatmanız gerekir.

Soru. Bu iki yöntemi, yalnızca kendi olaylarını işlemeleri için nasıl ayırabiliriz?

Belki de bu iki koşulun nasıl işleneceği başka bir yöntem var mı?

Kullandığım yöntemlerden örnekler.

 //+---------------------------------------------------------------------+
//|  -- ЗАКРЫВАЕМ ОДНУ ИЗ ДВУХ ПОЗИЦИЙ С НИЗУ, ГДЕ ПРОФИТ БОЛЬШЕ ЧЕМ ---|
//+---------------------------------------------------------------------+ 
ulong ticket_n= ULONG_MAX ;   double profit= DBL_MIN ;

     if (invert_close == true ) //Проверка на наличие 2х и более поз.
     {
     int positions= PositionsTotal ();
     for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)
     {
     ulong tmp_ticket= PositionGetTicket (i);
     if (ticket_n!= 0 )
     {
     double tmp_profit= PositionGetDouble ( POSITION_PROFIT );
     if (tmp_profit>profit+Prof_eqw_niz) // допустим 20
     {
     ticket_n=tmp_ticket;
     profit=tmp_profit;
     }
     }
     }
//-----------
     if (ticket_n!= ULONG_MAX )
     m_trade.PositionClose(ticket_n);
     invert_close = false ;
     Print ( "------  ЗАКРЫЛИ ТОЛСТУЮ ---------" );
     }       

//+---------------------------------------------------------------------+
//|                     Э К В И Т И   ДЛЯ SELL_LIMIT                    |
//+---------------------------------------------------------------------+
   npos_ALL= 0 ; NPos_ALL(npos_ALL);
   if (npos_ALL>=Metod_Eqw && m_account.Equity()>= m_account.Balance()+Prof_eqw) //Допустим 15
   {
   CloseAllPositions();
   Print ( "------  ЗАКРЫЛИ ВСЕ ---------" );
   }
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Dosyalar:
 
Vladpedro :


Pozisyonlar danışmanın üzerinde çalıştığı sembolle açılıyor mu? Sihirli sayı kullanılıyor mu?
 
Vladimir Karputov :
Pozisyonlar danışmanın üzerinde çalıştığı sembolle açılıyor mu? Sihirli sayı kullanılır

Evet, mevcut sembol için. Evet, büyü kullanılır.

 
Vladpedro :

Evet, mevcut sembol için. Evet, büyü kullanılır.

İkinci koşulu açıklayın, bu ne anlama geliyor? ( 2 veya daha fazla pozisyon açıksa, değer başına ortalama alarak kapatın... )

 
Vladimir Karputov :

İkinci koşulu açıklayın, bu ne anlama geliyor? ( 2 veya daha fazla pozisyon açıksa, değer başına ortalama alarak kapatın... )

Bu şu anlama gelir: İki veya daha fazla pozisyon açıksa ve Özkaynak tutarı bakiyeden bir miktar daha büyükse (diyelim ki 15), tüm pozisyonlar kapalıdır.

Örneğin. üç pozisyon açık. ilkinde, mevcut kayıp -10, ikincisinde -5, üçüncüsünde +15 tutarında kar +30, her şeyi kapatabilirsiniz.

Ortalama kar + 15'e ulaşılmamışsa, pozisyonlar kendi ön ayarlı SL veya TP'lerinde kapatılacaktır. (Bu, pozisyonları kapatmak için üçüncü koşul gibi, ancak bununla ilgili bir sorun yok, bu yüzden sessiz kaldım.)

 
Vladpedro :

Bu şu anlama gelir: İki veya daha fazla pozisyon açıksa ve Özkaynak tutarı bakiyeden bir miktar daha büyükse (diyelim ki 15), tüm pozisyonlar kapalıdır.

Örneğin. üç pozisyon açık. ilkinde, mevcut kayıp -10, ikincisinde -5, üçüncüsünde +15 tutarında kar +30, her şeyi kapatabilirsiniz.

Ortalama kar + 15'e ulaşılmamışsa, pozisyonlar kendi ön ayarlı SL veya TP'lerinde kapatılacaktır. (Bu, pozisyonları kapatmak için üçüncü koşul gibi, ancak bununla ilgili bir sorun yok, bu yüzden sessiz kaldım.)

İşte iki koşul için tam kod:

 //+------------------------------------------------------------------+
//|                                       Closing Two conditions.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property version    "1.00"
/*
   barabashkakvn Trading engine 3.116
*/
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
//---
CPositionInfo  m_position;                   // object of CPositionInfo class
CTrade         m_trade;                       // object of CTrade class
CSymbolInfo    m_symbol;                     // object of CSymbolInfo class
//--- input parameters
input double    InpProfitTarget      = 15 ;       // Profit target, in deposit money (if Positions > 2)
input ulong     InpDeviation         = 10 ;       // Deviation, in points (1.00045-1.00055=10 points)
input ulong     InpMagic             = 200 ;       // Magic number
//---
bool      m_need_close_all           = false ;     // close all positions
ulong     m_need_close_ticket        = ULONG_MAX ; // close one position
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   if (!m_symbol.Name( Symbol ())) // sets symbol name
     {
       Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: CSymbolInfo.Name" );
       return ( INIT_FAILED );
     }
//---
   m_trade.SetExpertMagicNumber(InpMagic);
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   m_trade.SetDeviationInPoints(InpDeviation);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   if (m_need_close_all)
     {
       if (IsPositionExists())
        {
         CloseAllPositions();
         return ;
        }
       else
         m_need_close_all= false ;
     }
//---
   if (m_need_close_ticket!= ULONG_MAX )
     {
       //--- close one position
       if (m_position.SelectByTicket(m_need_close_ticket))
        {
         m_trade.PositionClose(m_need_close_ticket); // close a position
         return ;
        }
       else
         m_need_close_ticket= ULONG_MAX ;
     }
//--- calculate all positions
   int total= 0 ;
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)
       if (m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==InpMagic)
            total++;

   if (total== 2 )
     {
       //--- conditon 1
       ulong tmp_ticket= ULONG_MAX ;
       double tmp_profit= DBL_MIN ;
       for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)
         if (m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
             if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==InpMagic)
              {
               double profit=m_position.Commission()+m_position.Swap()+m_position.Profit();
               if (profit>tmp_profit)
                 {
                  tmp_profit=profit;
                  tmp_ticket=m_position.Ticket();
                 }
              }
       //---
       if (tmp_ticket!= ULONG_MAX )
         m_need_close_ticket=tmp_ticket;
     }
   else
     {
       if (total> 2 )
        {
         //--- conditon 2
         double profit= 0 ;
         for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)
             if (m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
               if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==InpMagic)
                  profit+=m_position.Commission()+m_position.Swap()+m_position.Profit();
         //---
         if (profit>=InpProfitTarget)
            m_need_close_all= true ;
        }
     }
  }
//+------------------------------------------------------------------+
//| Is position exists                                               |
//+------------------------------------------------------------------+
bool IsPositionExists( void )
  {
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)
       if (m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==InpMagic)
             return ( true );
//---
   return ( false );
  }
//+------------------------------------------------------------------+
//| Close all positions                                              |
//+------------------------------------------------------------------+
void CloseAllPositions( void )
  {
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--) // returns the number of current positions
       if (m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==InpMagic)
            m_trade.PositionClose(m_position.Ticket()); // close a position by the specified m_symbol
  }
//+------------------------------------------------------------------+
Dosyalar:
 
Vladimir Karputov :

İşte iki koşul için tam kod:

Vladimir'e teşekkürler. Çözmeye çalışacağım.

Kendimce çözmeye çalıştım, bu iki koşulun nasıl ayrılabileceğini anlıyorum.

Örneğin.

Üç boole değişkeni tanımlayalım.

Konum_1;

Pos_2_Clos_1;

Pos_2_Clos_All;

1. Açık pozisyonların sayısını kontrol ediyoruz.

Eğer   sadece 1 açık pozisyonumuz var SE LL ataması   anlam:  

Pos_1=doğru;     Pos_2_Clos_1=yanlış;       Pos_2_Clos_All =yanlış ;

2 pozisyon açıksa ve özkaynak tutarı pozitifse (bu sadece SELL_S TOP emri tetiklendiğinde meydana gelebilir), o zaman bu olaya bir boole değeri atayın

Pos_1= yanlış ;     Pos_2_Clos_1= doğru ;       Pos_2_Clos_All =yanlış ;

2 pozisyon açıksa ve özkaynak tutarı negatifse (bu sadece SELL_LIMIT emri tetiklendiğinde meydana gelebilir), o zaman

Pos_1= yanlış ;     Pos_2_Clos_1= yanlış ;       Pos_2_Clos_All =doğru ;

Hepsi bu gibi görünüyor...   Boole değişkenlerini kontrol edebilir ve onlara kendi kapanış yönteminizi atayabilirsiniz, ancak nedense bu benim için işe yaramadı ...

Ben hala işe yaramaz bir programcıyım, belki bir yerlerde bir hata yaptım ...

Yardım için teşekkürler)

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 

Vladimir Karputov :

Vladimir. Yapamayacağım bir şey. SELL_STOP siparişleri tetiklendiğinde - her şey yolunda. Daha fazla kârı olan sadece bir pozisyon kapatılır,

ancak SELL_LIMIT tetiklendiğinde, tüm açık pozisyonların kârının toplamı ile değil, kapanış yanlış gerçekleşir, ancak kârı daha yüksek olan pozisyonun kapatıldığı görülmektedir.

Daha önce benzer bir hata almıştım. Şimdi şimdiden düşünmeye başladım belki bir tür söve, belki de bir şekilde pozları saymıyorum ve onları açmıyorum.

Lütfen test için hazır kod parçama bakın, bir hata görebilirsiniz. Ancak kodunuzda da bir uyumsuzluk olabilir. Ya da bir şekilde onları yanlış açıkladım .., benim için ortalama kâr nedir.

Şimdi algoritma ile uğraşmaya başladım ve sonuçlarında size daha önce anlattığımdan biraz daha karmaşık olduğunu fark ettim.

Bir pozisyonu kendi SL ile kapatmak için üçüncü koşul, ilk iki koşulun algoritmasında hatalara yol açabilir.

SEL_STOP durumu olması gerektiği gibi yürütüldüğünden, yalnızca SELL_LIMIT durumu için pozisyonları kapatmak için tam algoritmayı bir kez daha açıklayacağım. Şimdilik bırakalım.

1. Başlangıçta bir açık SATIŞ pozisyonumuz var , kendi SL seti var, ancak SELL_LIMIT'den daha yüksek, yani SL SELL_LIMIT'den önce çalışmayacak.

2. SELL_LIMIT tetiklendi ve kendi SL'si ile ikinci bir SATIŞ pozisyonu belirdi, bu da bir sonraki SELL_LIMIT'den önce tetiklenemez

3. SELL_LIMIT siparişi tetiklenirse yeni bir SELL_LIMIT siparişi belirlenir. (her zaman)

4. Açık SATIŞ pozisyonlarının sayısı 1-3 veya daha fazla olabilir, hepsi SL'lerinin ne kadar uzakta olduğuna bağlıdır. En fazla üç tane varsa durumu düşünün. (SL ile sınırlayabilirim)

Şimdi pozisyonları kapatmak için senaryolar.

Açık pozisyon ise 2, o zaman bir veya tüm pozisyonları kapatmak için sadece iki senaryo mümkündür

1. Öz sermaye ile eğer bakiye 15'ten fazla ise ( tüm pozisyonlar kapalı ), (m_account.Equity()>= m_account.Balance()+15) Birkaç pozisyonu kapatmak istedim. ortalama alarak.

2. Kendi SL ile (bir pozisyon kapalı).

3. Hangi koşulun uygulanacağını bilmediğimiz için, kalan bir pozisyon daha önce ayarlanmışsa kapanış koşullarından arındırılmalıdır .

SELL_LIMIT betiğini tekrarlayabilir veya SEL_STOP'a inebilir ve farklı bir kapatma koşulu izleyebilir. (bunun için koşulları sıfırlayın)

4. Üç pozisyon varsa, onları da kapatın   (m_account.Equity()>= m_account.Balance()+15) veya bunlardan biri SL'yi tetikler ve iki pozisyon kalır.

Kapanış koşullarının tanımlanmadığı bir pozisyon kalana kadar bu kuralı uyguluyoruz...

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Dosyalar:
 
Vladpedro :

Vladimir Karputov :

Vladimir. Yapamayacağım bir şey. SELL_STOP emirleri tetiklendiğinde her şey yolunda demektir. Daha fazla kârı olan sadece bir pozisyon kapatılır,

ancak SELL_LIMIT tetiklendiğinde, tüm açık pozisyonların kârının toplamı ile değil, kapanış yanlış gerçekleşir, ancak kârı daha yüksek olan pozisyonun kapatıldığı görülmektedir.

Daha önce benzer bir hata almıştım. Şimdi şimdiden düşünmeye başladım belki bir tür söve, belki de bir şekilde pozları saymıyorum ve onları açmıyorum.

Lütfen test için hazır kod parçama bakın, bir hata görebilirsiniz. Ancak kodunuzda da bir uyumsuzluk olabilir. Ya da bir şekilde onları yanlış açıkladım .., benim için ortalama kâr nedir.

Genel olarak, hangi bekleyen emrin tetiklendiği önemli değildir - sonuçta, sonunda bir pozisyon alırız ve sonra pozisyonun karını hesaplarız.

 
Vladimir Karputov :

Genel olarak, hangi bekleyen emrin tetiklendiği önemli değildir - sonuçta, sonunda bir pozisyon alırız ve sonra pozisyonun karını hesaplarız.

Evet, önemli değil. Fark konusunda şüphelerim vardı çünkü emirleri ve pozisyonları verirken onlara pozisyonlarım, emirlerim için "yorumlar" verdim. Sonuç olarak, bir emir bir pozisyona girdiğinde, emir yorumunu devralır.

Sonra, yorumlar yoluyla pozisyonları kontrol ederken, kafa karışıklığı ortaya çıktı ... sonra yorumları farklı çıktı. Neyse düzelttim.

Kodunuzda SELL_LIMIT'in çalıştığı durumda pozisyonların nasıl kapatıldığını hiç bulamadım veya anlamadım. Sermaye tarafından.

 if (total== 2 )
   {
//-------------------------------------------------------- conditon 1
       ulong tmp_ticket= ULONG_MAX ;
       double tmp_profit= DBL_MIN ;
       for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)
       if (m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
       if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==InpMagic)
      {
       double profit=m_position.Commission()+m_position.Swap()+m_position.Profit();
       if (profit>tmp_profit)
      {
      tmp_profit=profit;
      tmp_ticket=m_position.Ticket();
      }
      }
       //---
       if (tmp_ticket!= ULONG_MAX )
      m_need_close_ticket=tmp_ticket;
      }
       else
      {
       if (total== 2 )
        {
//--------------------------------------------------------- conditon 2
         double profit= 0 ;
         for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)
         if (m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==InpMagic)
        profit+=m_position.Commission()+m_position.Swap()+m_position.Profit();
//--------
       if (profit>=InpProfitTarget)
         m_need_close_all= true ;
        }
        }

Görünüşe göre tüm pozisyonları kapatma olasılığı için bir kontrol yapıldı ve üzerine bir bayrak kondu.

ancak CloseAllPositions() içinde;

 if (m_need_close_all)
   {
   if (IsPositionExists())
   {
   CloseAllPositions();
   return ;
   }
   else
   m_need_close_all= false ;
   }

böyle bir şey eksik.

 if (m_account.Equity()>= m_account.Balance()+ 15 )

Vaka için tüm pozisyonları kapatmanız gereken - çalıştı SELL_LIMIT

Belki de aynı m_account.Equity()>= m_account.Balance()+ 15'i bir şekilde farklı şekilde uygulamışsınızdır?

Yoksa gerçekten işinize yaramıyor mu? Belki de benim anlayışımda ortalamanın ne olduğunu açıklamamış olmamdan dolayı.