Açık pozisyonları gruplara ayırma - sayfa 9

 
Sergey Voytsekhovsky :

Eğer seni doğru anladıysam, o zaman doğru yol budur. Daha deneyimli bir yoldaş olarak, söyle bana pliz, yeni doğan pozisyonları yakalamak için böyle bir filtre işe yarayacak ??? Ya da belki daha iyi bir seçenek var mı?

Bu Alex için - Nedense OnTradeTransaction() ile çalışmıyorum.

 
Alexey Viktorov :

Böylece, diğer mesajları geri taşımayı mı teklif ediyorsunuz? Onları kimse hatırlamasın mı? Bu doğru değil.

Bence her sorunun ayrı bir konu olacağı forumda ayrı bir bölüm belirlemek daha doğru olur. Konu sayısı, bir konudaki gönderi sayısından çok daha azdır. Bu nedenle, önemli sayıda konu olmasına rağmen, bireysel sorular ve hata mesajları artık geri itildiği kadar geriye itilmeyecektir.

Bilmediğini kırmızıyla vurgulamışsın. Sorun neydi? Nasıl ortaya çıktı? Ve yeni yöntem nedir?

Ve hata mesajları hakkında: "doğru-doğru değil", ancak bildirmek istiyorsanız bildirin. Ve eğer arzu yoksa, o zaman arzu yoktur. Ve "İnsanların kendileri hakkında konuşmasına izin veririm" gibi savuşturmak bir bahanedir.

 
Sergey Voytsekhovsky :

Eğer seni doğru anladıysam, o zaman doğru yol budur. Daha deneyimli bir yoldaş olarak, söyle bana pliz, yeni doğan pozisyonları yakalamak için böyle bir filtre işe yarayacak ??? Ya da belki daha iyi bir seçenek var mı?

bence bu hat

         if (trans.type != TRADE_TRANSACTION_ORDER_DELETE )

gereksiz. Genel olarak, şimdi böyle bir seçenek için OnTradeTransaction'ın işleyişini gözden geçiriyorum.

   if (trans.type == TRADE_TRANSACTION_HISTORY_ADD )

Fırsatın eklendiği sırada, anlaşmayı oluşturan siparişin bileti yoktur. Ama eğer bir emir biletine ve onun özelliklerine ihtiyacınız varsa, benim şimdi emir açılış fiyatına ihtiyacım var, böylece grid adımı kayma nedeniyle sapmaz, o zaman bu en iyi seçenektir. BENİM NACİZANE FİKRİME GÖRE.

Genel olarak, belirli bir görev için yazma taraftarıyım. Ve Güvenlik Konseyi'nde, ek, bazen tamamen gereksiz değişkenler gerektiren evrenselliği yığdılar.

 
Artyom Trishkin :

Bilmediğini kırmızıyla belirtmişsin. Sorun neydi? Nasıl ortaya çıktı? Ve yeni yöntem nedir?

Ve hata mesajları hakkında: "doğru-doğru değil", ancak bildirmek istiyorsanız bildirin. Ve eğer arzu yoksa, o zaman arzu da yoktur. Ve "İnsanların kendileri hakkında konuşmasına izin veriyorum" gibi savuşturmak bir bahanedir.

Eski disklerde bir yerde eski terminallerim var. Bulursam eski kitaplığı ve yenisini göstereceğim. Daha sonra önemli bir konuşma olacak. Hatırlıyorum, değilsin, peki o zaman ne hakkında konuşmalı? Nasıl açıklanır, şimdi olmayanı gösterin.
 
Alexey Viktorov :

bence bu hat

gereksiz. Genel olarak, şimdi böyle bir seçenek için OnTradeTransaction'ın işleyişini gözden geçiriyorum.

Fırsatın eklendiği sırada, anlaşmayı oluşturan siparişin bileti yoktur. Ama eğer bir emir biletine ve onun özelliklerine ihtiyacınız varsa, benim şimdi emir açılış fiyatına ihtiyacım var, böylece grid adımı kayma nedeniyle sapmaz, o zaman bu en iyi seçenektir. BENİM NACİZANE FİKRİME GÖRE.

Genel olarak, belirli bir görev için yazma taraftarıyım. Ve Güvenlik Konseyi'nde, ek, bazen tamamen gereksiz değişkenler gerektiren evrenselliği yığdılar.

Beni doğru yöne işaret ettiğiniz için çok teşekkür ederim. Bunu yaptım (aşağıda, işe yarıyor gibi görünüyor):

 void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
  {
//---
   if (trans.type == TRADE_TRANSACTION_DEAL_ADD )
      {
         if ( HistoryDealGetInteger (trans.deal, DEAL_ENTRY ) == DEAL_ENTRY_IN ) // открылась позиция
            {
               int SizeArrayPosition = ArraySize (ArrayPosition);
               ArrayResize (ArrayPosition,SizeArrayPosition+ 1 );
               
               if ( PositionSelectByTicket (trans.position)){
               ArrayPosition[SizeArrayPosition].ticket_pos = trans.position;
               ArrayPosition[SizeArrayPosition].open_price = trans.price;
               ArrayPosition[SizeArrayPosition].open_tyme  = ( datetime ) PositionGetInteger ( POSITION_TIME );
               ArrayPosition[SizeArrayPosition].type       = ( ENUM_POSITION_TYPE ) PositionGetInteger ( POSITION_TYPE );
               ArrayPosition[SizeArrayPosition].kod_clana  = 0 ;
               
               Print ( "\n"
               "Открылась новая позиция: ticket = " ,ArrayPosition[SizeArrayPosition].ticket_pos);}}}
  }

Şimdi, daha teknik bir şekilde, ya kâr elde ederek ya da doğrudan talimatla kapatılan pozisyonların biletlerini nasıl yakalayacağım konusunda beynimi zorluyorum. Sadece bu pozisyonları ana pozisyon dizisinden çıkarmak için bilete ihtiyaçları var.

 
Sergey Voytsekhovsky :

Beni doğru yöne işaret ettiğiniz için çok teşekkür ederim. Bunu yaptım (aşağıda, işe yarıyor gibi görünüyor):

Şimdi, daha teknik bir şekilde, ya kâr elde ederek ya da doğrudan talimatla kapatılan pozisyonların biletlerini nasıl yakalayacağım konusunda beynimi zorluyorum. Sadece bu pozisyonları ana pozisyon dizisinden çıkarmak için bilete ihtiyaçları var.

Sembol ve sihir için başka bir çek eklerdim

     if ( PositionSelectByTicket (trans.position) && PositionGetString ( POSITION_SYMBOL ) == _Symbol && PositionGetInteger ( POSITION_MAGIC ) == magick)
     {
       if ( HistoryDealGetInteger (trans.deal, DEAL_ENTRY ) == DEAL_ENTRY_IN )

İşte kodumdan pozisyon kapanışının yakalandığı bir parça.

     if ( ! PositionSelectByTicket (trans.position))
     {
       HistorySelectByPosition (trans.position);
       ulong ordTicket = HistoryOrderGetTicket ( 0 );
       if ( HistoryOrderGetInteger (ordTicket, ORDER_MAGIC ) == magick && HistoryOrderGetString (ordTicket, ORDER_SYMBOL ) == _Symbol )
       {

ENUM_DEAL_REASON numaralandırmasından kapatma nedenleriyle de bölünebilir.

Burada başka bir danışmanda

     if (! PositionSelectByTicket (trans.position))
     {
       if (trans.symbol == _Symbol && HistorySelectByPosition ( HistoryDealGetInteger (trans.deal, DEAL_POSITION_ID )))
       {
         int dealTotal = HistoryDealsTotal ();
         long posMagic = 0 ;
         ulong dealTicketIN = HistoryDealGetTicket ( 0 );
         if ( HistoryDealGetInteger (dealTicketIN, DEAL_ENTRY ) == DEAL_ENTRY_IN )
          posMagic = HistoryDealGetInteger (dealTicketIN, DEAL_MAGIC );
         if (posMagic == magick)
         {
           ulong dealTicketOUT = HistoryDealGetTicket ( 1 );
           if ( HistoryDealGetInteger (dealTicketOUT, DEAL_ENTRY ) == DEAL_ENTRY_OUT )
           {

İlk durumda, bir siparişe ihtiyacım var, ikincisinde bir anlaşma yeterli. Genel olarak, bir şeye ihtiyaç duyulduğunda yazacağım.

 
Alexey Viktorov :

Sembol ve sihir için başka bir çek eklerdim

İşte kodumdan pozisyon kapanışının yakalandığı bir parça.

ENUM_DEAL_REASON numaralandırmasından kapatma nedenleriyle de bölünebilir.

Burada başka bir danışmanda

İlk durumda, bir siparişe ihtiyacım var, ikincisinde bir anlaşma yeterli. Genel olarak, bir şeye ihtiyaç duyulduğunda yazacağım.

İyi akşamlar. Duyarlılığınız ve dikkatiniz bana kredi veriyor. Son derece minnettarım. gençlerin dediği gibi - saygı ve saygı.

İyi tavsiye için teşekkürler. Neredeyse bilinçli olarak sihir ve sembol eklemiyorum, ilk olarak, çünkü şimdi gerçekten gerekli değiller, danışmanın rakipleri yok ve büyük olasılıkla olmayacak, çünkü yüksek frekanslı, çok sayıda minimum pozisyon. Kendinden boğuluyor, başka nerede başkalarıyla rekabet edebilir. Tabii ki, terminalde ve hesapta bir tane olacak. İkincisi büyük olasılıkla çok uzak, henüz çok fazla anlamıyorum, ama belki de en azından kaynakları biraz kurtaracak.

Örnekleriniz güzel, mutlaka tutacağım ama biletim yok, siparişim yok, anlaşmam yok. Daha doğrusu elimde yüzlerce var ve şimdi hangisi kapanacak bilmiyorum. Yukarıda, bana bir pozisyonu kapatma gerçeğinin dışlanabileceğini düşündürttünüz.

 void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)

Şimdi oturup akışta verdiği her şeyi yazdırmaya çalışacağım. danışmanım bir pozisyon oluşturucu görevi görecek, pozisyonları aktif olarak nasıl yerleştireceğini ve daha az aktif olarak nasıl kapatacağını zaten biliyor. sadece o zaman, bir sürü mesajdan hangisinin bir pozisyonun kapanması hakkında açık bir şekilde bilgi verdiğini anlamak için kalır. Geriye dizi/yapıda bu pozisyonu (pozisyon bileti) bulup silmek kalıyor. Bunun gibi bir şey.

Ve bir daktilo olarak referans kitabındaki örnek kodu kullanmaya çalışacağım, bu fonksiyonla ilgili bölümde, orada denir:

//| OnTradeTransaction_Sample.mq5 |
//| Telif Hakkı 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------- --------------------+
#Emlak   telif hakkı   "Telif Hakkı 2018, MetaQuotes Software Corp."
#Emlak   bağlantı        "https://www.mql5.com"
#Emlak   versiyon     "1.00"
#Emlak   tanım   "TradeTransaction olay dinleyicisi örneği"

 
Sergey Voytsekhovsky :

İyi akşamlar. Duyarlılığınız ve dikkatiniz bana kredi veriyor. Son derece minnettarım. gençlerin dediği gibi - saygı ve saygı.

İyi tavsiye için teşekkürler. Neredeyse bilinçli olarak sihir ve sembol eklemiyorum, ilk olarak, çünkü şimdi gerçekten gerekli değiller, danışmanın rakipleri yok ve büyük olasılıkla olmayacak, çünkü yüksek frekanslı, çok sayıda minimum pozisyon. Kendinden boğuluyor, başka nerede başkalarıyla rekabet edebilir. Tabii ki, terminalde ve hesapta bir tane olacak. İkincisi büyük olasılıkla çok uzak, henüz çok fazla anlamıyorum, ama belki de en azından kaynakları biraz kurtaracak.

Örnekleriniz güzel, mutlaka kurtaracağım ama biletim yok, siparişim yok, anlaşmam yok . Daha doğrusu elimde yüzlerce var ve şimdi hangisi kapanacak bilmiyorum. Yukarıda, bana bir pozisyonu kapatma gerçeğinin dışlanabileceğini düşündürttünüz.

Şimdi oturup akışta verdiği her şeyi yazdırmaya çalışacağım. danışmanım bir pozisyon oluşturucu görevi görecek, pozisyonları aktif olarak nasıl yerleştireceğini ve daha az aktif olarak nasıl kapatacağını zaten biliyor. sadece o zaman, bir sürü mesajdan hangisinin bir pozisyonun kapanması hakkında açık bir şekilde bilgi verdiğini anlamak için kalır. Geriye dizi/yapıda bu pozisyonu (pozisyon bileti) bulup silmek kalıyor. Bunun gibi bir şey.

Ve bir daktilo olarak referans kitabındaki örnek kodu kullanmaya çalışacağım, bu fonksiyonla ilgili bölümde, orada denir:

Bu ipuçlarına dayanarak, belgelerden kendi başına bir şeyler öğrenen bir kişiyle az bilginizi paylaşmak her zaman güzeldir. © I.A. Krylov. Guguk kuşu, Horozu övüyor çünkü Guguk'u övüyor. )))

Danışman sadece kendisi için yazılmışsa, elbette bazı özgürlükler alabilirsiniz. Sembolü ve sihri kontrol etmenin gerekli olmadığını düşünüyorsanız, gerekli değildir.

Seçimle ilgili olarak:

Her şey var, pozisyon bileti, sipariş bileti ve anlaşma bileti. Ve bir anlaşma ve/veya pozisyon açan bir emir çıkarmak bile zor değil. Bütün bunlar MqlTradeTransaction yapısında


     if (! PositionSelectByTicket (trans.position)) // Если позицию выбрать не получилось, значит она закрыта
     {
       HistorySelectByPosition (trans.position); // Получим список ордеров и сделок относящихся к этой, конкретной позиции
       ulong ordTicket = HistoryOrderGetTicket ( 0 ); // Получили тикет ордера который породил сделку и позицию.
       if ( HistoryOrderGetInteger (ordTicket, ORDER_MAGIC ) == magick && HistoryOrderGetString (ordTicket, ORDER_SYMBOL ) == _Symbol )
       {
 
Если позицию выбрать не получилось, значит она закрыта 
Ой-ли? 
 
Алексей Тарабанов :

Alexey, bunların hepsi yalnızca OnTradeTransaction olayının işlenmesi için geçerlidir.

Bir olay meydana geldi, pozisyonu kapatmak için anlaşma yapıldı. Şu anda herhangi bir pozisyon yok. Bunu , siparişler ve fırsatlar listesini (kodda değil) seçip okuyarak onaylayabilirsiniz.

           ulong dealTicketOUT = HistoryDealGetTicket ( 1 );
           if ( HistoryDealGetInteger (dealTicketOUT, DEAL_ENTRY ) == DEAL_ENTRY_OUT )
Ve pozisyonun kural olarak sadece iki emri ve iki anlaşması olduğu hadge hesabından bahsettiğimizi unutmayın.