uzman danışman - çeşitli sorular - sayfa 24

 

Örnekte zaten var.

Siparişi kapattığınızda, OrderClose() fonksiyonunun boolean dönüş değerini kullanırsınız ve eğer fonksiyon başarılı olursa, siparişle ilgili nesneleri kaldırabilirsiniz.

                           bool close= OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 3 , clrBlue );
                             {
                               if (close== 0 )
                                {
                                 Alert ( " Order Close Error! # " + IntegerToString ( OrderTicket ()));
                                }
                               if ( close== 1 )
                                {
                                 Alert ( " Order: " + IntegerToString ( OrderTicket ())+ " Closed due to TP Profit = " + DoubleToString ( OrderProfit (), 2 ));
                                 ObjectDelete ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" );
                                 ObjectDelete ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" );
                                }
                             }
 
Marco vd Heijden :

Örnekte zaten var.
Siparişi kapattığınızda, OrderClose() fonksiyonunun boolean dönüş değerini kullanırsınız ve eğer fonksiyon başarılı olursa, siparişle ilgili nesneleri kaldırabilirsiniz.

Bunu zaten biliyorum, zaten denedim. Belki yanlış bir şey yaptım. Bir kez daha deneyeceğim, ancak sormadan önce OrderClose() kullanmak istemiyorum. (bazen siparişleri manuel olarak kapatırım)
S: Yani, OrderClose() olmadan sipariş kapatıldıktan sonra order nesnelerini silebilir miyim?

Şimdiden teşekkürler.

 

Peki, Order Close() fonksiyonunun dönüş değeri, eylemin başarılı olup olmadığına karar verir, bu yüzden emri manuel olarak kapatırsanız, biraz farklı bir mekanizma tasarlamanız ve kullanmanız gerekecektir.

Sipariş listesinin bir gölge kopyasını oluşturabilir ve onu gerçek listeyle karşılaştırabilirsiniz ve bir siparişi manuel olarak kapattığınız için bir şey değiştiğinde, neyin değiştiğini arayın ve ardından bu nesneleri kaldırın.

Ancak, OrderTicket()'in aktif sipariş havuzunda hala var olup olmadığını kontrol etmenin daha kolay bir yolu olabilir, bu nedenle siparişi manuel olarak kapattığınız için kaybolduğunda, nesneler otomatik olarak kaldırılacaktır.

Yani nasıl kurmak istediğinize bağlı.

Bu noktada, sonunda onunla yapmak istediğiniz şeyin ötesine bakmanız gerektiğini söyleyebilirim, çünkü aldığınız yön biraz daha sonra eklemek isteyebileceğiniz ek görevlerle ilgilidir.


Nesnelerin oluşturulması zaten tamamen otomatik olduğundan, nesnelerin kaldırılması için de aynısını yapmanızı öneririm, böylece gelecekte bunun için endişelenmenize gerek kalmaz.

Bunun için basitçe kullanabilirsiniz

OrdersHistoryTotal ()

Ve tarih havuzu

MODE_HISTORY

Çok basit, sipariş geçmişi havuzu taranır ve her döngüde kod, OrderTicket() numarasıyla ilgili herhangi bir nesnenin olup olmadığına bakar ve bir eşleşme varsa, nesneler otomatik olarak silinir.

Bunu yapmak için yalnızca başka bir döngü eklemeniz gerekir, ancak bu sefer geçmiş havuzunun üzerinden.

Örneğe bakın.

//+------------------------------------------------------------------+
//|                                                ObjectsRemove.mq4 |
//|      Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict

static input int takeprofit= 500 ; // Take Profit
static input int stoploss= 500 ;   // Stop Loss
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create timer
   EventSetTimer ( 1 );

//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
   for ( int order= OrdersTotal (); order>= 0 ; order--)
     {
       bool selected= OrderSelect (order, SELECT_BY_POS );
        {
         if (selected== 1 )
           {
             if ( Symbol ()== OrderSymbol ()) // only for current chart symbol
              {
               switch ( OrderType ())
                 {
                   case OP_BUY : // for buy order
                    {
                     // if objects not found - create them
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )< 0 )
                       {
                         ObjectCreate ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJ_HLINE , 0 , 0 , OrderOpenPrice ()+takeprofit* Point ());
                         ObjectSet ( "#" + IntegerToString ( OrderTicket ())+ "-TP" , 7 , 3 );
                       }
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" )< 0 )
                       {
                         ObjectCreate ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" , OBJ_HLINE , 0 , 0 , OrderOpenPrice ()-stoploss* Point ());
                         ObjectSet ( "#" + IntegerToString ( OrderTicket ())+ "-SL" , 7 , 3 );
                       }
                     // if objects exist
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )>= 0 )
                       {
                         if ( Bid > ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJPROP_PRICE , 0 ))
                          {
                           PlaySound ( "alert2.wav" ); // OrderClose now removed...
                          }
                       }
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" )>= 0 )
                       {
                         if ( Ask < ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" , OBJPROP_PRICE , 0 ))
                          {
                           PlaySound ( "alert2.wav" ); // OrderClose now removed...
                          }
                       }
                    }
                   break ;

                   case OP_SELL : // for sell order
                    {
                     // if objects not found - create them
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )< 0 )
                       {
                         ObjectCreate ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJ_HLINE , 0 , 0 , OrderOpenPrice ()-takeprofit* Point ());
                         ObjectSet ( "#" + IntegerToString ( OrderTicket ())+ "-TP" , 7 , 3 );
                       }
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" )< 0 )
                       {
                         ObjectCreate ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" , OBJ_HLINE , 0 , 0 , OrderOpenPrice ()+stoploss* Point ());
                         ObjectSet ( "#" + IntegerToString ( OrderTicket ())+ "-SL" , 7 , 3 );
                       }
                     // if objects exist
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )>= 0 )
                       {
                         if ( Ask < ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJPROP_PRICE , 0 ))
                          {
                           PlaySound ( "alert2.wav" ); // OrderClose now removed...
                          }
                       }
                     if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" )>= 0 )
                       {
                         if ( Bid > ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" , OBJPROP_PRICE , 0 ))
                          {
                           PlaySound ( "alert2.wav" ); // OrderClose now removed...
                          }
                       }
                    }
                   break ;
                 }
              }
           }
        }
     }
//+------------------------------------------------------------------+
//--- delete objects when order is closed
   for ( int order= OrdersHistoryTotal ()- 1 ; order>= 0 ; order--)
     {
       bool selected= OrderSelect (order, SELECT_BY_POS , MODE_HISTORY );
        {
         if (selected== 1 )
           {
             // if objects are still found - Delete them
             if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )>= 0 )
              {
               ObjectDelete ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" );
              }
             if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" )>= 0 )
              {
               ObjectDelete ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" );
              }
           }
        }
     }
//+------------------------------------------------------------------+    
  } // end OnTimer() function
//+------------------------------------------------------------------+

Artık sanal kar al ve stoploss hatlarının tam otomatik eklenmesine ve ayrıca bu hatların tam otomatik olarak kaldırılmasına sahipsiniz.

Elbette bu örnek sürekli olarak geçmiş havuzunu tarıyor...

Ek olarak, siparişlerin sayısını tutan ve daha sonra OrdersTotal() ile karşılaştırılan bir tamsayı ekleyebilirsiniz ve bir şey değiştiğinde nesne kaldırma kodunu çalıştırırsınız.

Veya, basit bir sayaç (60) ekleyebilirsiniz, o zaman kod parçası, herhangi bir şeyin kaldırılması gerekiyorsa, yalnızca dakikada bir kontrol eder.

 

Hey dostum! Bu mükemmel çalışıyor! Çok teşekkürler!

Sadece biraz değiştim. Şu ana kadar sorunsuz çalışıyor.

//--- delete objects when order is closed
   for ( int order= OrdersHistoryTotal ()- 1 ; order>= 0 ; order--)
     {
       bool selected= OrderSelect (order, SELECT_BY_POS , MODE_HISTORY );
        {
         if (selected== 1 )
           {
             // if objects are still found - Delete them
             ObjectsDeleteAll ( 0 , "#" + IntegerToString ( OrderTicket () ) ); // for arrows
             ObjectsDeleteAll ( 0 , _prefix + " #" + IntegerToString ( OrderTicket () ) ); // order, sl, tp, price objects
           }
        }
     }

Yanlış bir şey varsa lütfen bana bildirin.
Bir kez daha çok teşekkürler Adam!

 

Belki kimse sorumu anlamadı. Ama yine de bunun için iyi bir yoruma ihtiyacım var. Şimdi sorumu resimle netleştirmeye çalışıyorum.
Soru: Ayrıca Zararı Durdur, Ticaret Paneli Nesnelerinin Önündeki Kar Hatlarını Alın. Geçen seferden kaynaklanan nesneyi yarattığını biliyorum. Ama beni anlıyorsanız, lütfen bana bildirin, Trade Panel nesnesi "Zararı Durdur ve Kar Al" satırları olmadan diğer tüm nesnelerin önünde olmalıdır.

Karışık nesneler

OBJPROP_BACK kullanabileceğimi biliyorum ama kullanmak istemiyorum. Sadece ikisi gibi çizgi ve fiyatı görmem gerekiyor. Umarım bunun için iyi bir yorum alırım.


Aç, Zarar Durdur, Kâr Al, fiyat satırlarında "Oluştur ve Sil" bunların hepsi bir işlevde. Şimdi onu bölmeye çalışıyorum çünkü bu işlevi OnChartEvent()'e koymam gerekiyor. Ama önce sormam gerekiyor.
S: Bu işlevi OnChartEvent()'e koyarsam - bu işlev manuel Siparişlerimi etkileyemez mi?

Şimdi üzerinde çalışıyorum.

Lütfen bana yardım edin, şimdiden teşekkürler.

 

Hiçbir Onchartevent(), kodu yalnızca OnTImer() işlevi gibi olmayan bir grafik olayı olduğunda yürütür.

Bu yüzden tam olarak ne yaptığınızı bilmelisiniz.

Örneğin, tarama kodunu kullanıyorsanız:

if ( Bid > ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-SL" , OBJPROP_PRICE , 0 ))

Fiyatın çizginizi aşıp aşmadığını kontrol etmek için bu OnChartEvent() içinde çalışmayacaktır.

Ayrıca otomatik örneği kullanmak istiyorsanız

if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )< 0 )
   {
     ObjectCreate ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJ_HLINE , 0 , 0 , OrderOpenPrice ()-takeprofit* Point ());
     ObjectSet ( "#" + IntegerToString ( OrderTicket ())+ "-TP" , 7 , 3 );
   }

Bu işe yaramayacak veya nesneleri oluşturmayacaktır.

Kodu yeniden yazmanız gerekecek.

Ayrıca H_LINE nesnelerini OBJPROP_BACK olarak ayarlayabilirsiniz, bu sorun değil, yine de onları göreceksiniz ve panelinizin altında olacaklar.

 

Gerçekten güzel ve faydalı bir yorum , ayrıca ne yapabileceğimi bilmek için en az bir kez denemem gerektiğini kesin olarak biliyorum.

Hızlı yanıtınız ve faydalı yorumunuz için teşekkür ederiz.

 
Marco vd Heijden :

Kodu yeniden yazmanız gerekecek.

(Yorumunuzu zaten dikkatlice okudum ama sadece bir kez denemek istedim - sonunda dediğiniz gibi OnTimer() gibi çalışmıyor.)

Aman tanrım! Bu blok kodlarındaki her şeyi değiştirmeli miyim?
Şimdi dört işlevim var. Onları OnChartEvent() içine koymaya çalışıyorum. Zaten denedim, sadece bir güncelleme görüyorum, bu sadece Print() için zararı durdur, kar fiyatlarını al .
OrderModify() içinde çalışmıyor.

8 - 10 saat sonra bu sorun için tekrar bir şeyler denemeye başlayacağım.
Sadece gerçekten iyi yorumlara ihtiyacım var, umarım alırım.

Şimdiden çok teşekkürler.

void OnChartEvent ( const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   if (id== CHARTEVENT_OBJECT_DRAG ) // I already tried with take profit object - there was not any effects
     {
      SL_TPcreateobjects();
      SL_TPdrags();
      SL_TPmodify();
      deleteobjs();
     }
  }
// if objects not found - create them
SL_TPcreateobjects()
  {
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) continue ;
       if ( Symbol ()!= OrderSymbol ()) continue ;

       if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )< 0 )
        {
         ObjectCreate ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJ_HLINE , 0 , 0 ,takeprofit);
        }
     }
  }
// if objects exist
SL_TPdrags()
  {
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) continue ;
       if ( Symbol ()!= OrderSymbol ()) continue ;

       if ( ObjectFind ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" )>= 0 )
        {
         if (TP_Price!= ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJPROP_PRICE , 0 ))
           {
            TP_drag= 1 ;
            TP_Price= ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJPROP_PRICE , 0 );
           }
         if (TP_drag== 1 )
           {
             if (TP_Price== ObjectGetDouble ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" , OBJPROP_PRICE , 0 ))
              {
               Print ( "Take Profit Price:" , DoubleToString (TP_Price, Digits ));
               TP_drag= 0 ;
              }
           }
        }
     }
  }
// order closed - delete junks
deleteobjs()
{
   for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--)
    {
     bool Selected= OrderSelect (i, SELECT_BY_POS , MODE_HISTORY );
     if (Selected== 1 )
       {
         ObjectsDeleteAll ( 0 , "#" + IntegerToString ( OrderTicket ())+ "-TP" );
       }
    }
}
// ordermodify()
SL_TPmodify()
{
  Order_Modify= OrderModify ( OrderTicket (), OrderOpenPrice (),SL_Price,TP_Price, 0 ,CLR_NONE);
}
//+------------------------------------------------------------------+
 

Bu işlev yalnızca bir chartevent gerçekleştiğinde yürütülür.

En azından burada gösterdiğin şey bu.

Chartevent, birisi grafikte bir düğmeye veya başka bir şeye bastığında, kesinti rutini için yalnızca bir tetikleyicidir.

Şimdi tam otomatik örneği aldınız ve bir düğmenin altına koydunuz, kimse ona basmazsa hiçbir şey olmayacak.

 
Marco vd Heijden :

Bu işlev yalnızca bir chartevent gerçekleştiğinde yürütülür.
En azından burada gösterdiğin şey bu.
Chartevent, birisi grafikte bir düğmeye veya başka bir şeye bastığında, kesinti rutini için yalnızca bir tetikleyicidir.
Şimdi tam otomatik örneği aldınız ve bir düğmenin altına koydunuz, kimse ona basmazsa hiçbir şey olmayacak.

Son yorumun çok basit görünüyor olabilir, ama aslında bu yorum bana doğru yolu gösterdi.
Şimdi hangisini kullanmaya çalıştığımı sorunumu çözüyorum.

Ve şimdi o HLine nesnesi ile başka grafiksel nesnelerin hareketlerini araştırmaya başlıyorum.

Çok daha fazla teşekkürler dostum!
Senin için her şeyin en iyisini dilerim!


dürüst_knave :

Ayrıca, çizgiyi ne sıklıkta hareket ettirdiğinizi düşünün. Saniyede bir mi? Muhtemelen değil.
Kodunuzu OnChartEvent() içine koyun:

void OnChartEvent ( const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   if (id== CHARTEVENT_OBJECT_DRAG && sparam== "line" ) // the chart event of dragging the line
Çok teşekkürler Adam! Böylece bu yorumunuz bana gerçekten çok yardımcı oldu!