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

 
honest_knave :
Adını yapmak için kodunuzu OrderTicket'i aldığınız yere gönderin.

(Birinin bir koda ihtiyacı olduğunda - Bunu hızlı bir şekilde göndermekte gecikiyorum - OBJECT_**** işlevlerini kullandığım için, nesne belgelerindekinden biraz farklı)

Aşağıdaki kod OnTick() içindedir.

for (i= OrdersTotal ()- 1 ;i>= 0 ;i--)
  {
   if (! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) continue ;
   if ( Symbol ()!= OrderSymbol ()) continue ;
   ObjectCreate ( 0 , "#" + IntegerToString ( OrderTicket ())+ " -" + "Object Button" , OBJ_BUTTON , 0 , 0 , 0 );
  }

Şimdi, bu nesneyi aşağıdaki gibi OnChartEvent() ile çağırmaya çalışıyorum.

if (id== CHARTEVENT_OBJECT_CLICK && sparam== "#" + IntegerToString ( OrderTicket ())+ " -" + "Object Button" )
  {
   // when click this button - do something...
  }

Şimdiden teşekkürler.

 
orderloop'un içinde olmadığı için OrderTicket()'i bilemez.
 
Marco vd Heijden :
orderloop'un içinde olmadığı için OrderTicket()'i bilemez.
Peki şans yok mu?
 
Max Enrik :
Peki şans yok mu?

Çoğu şey mümkün. Ama ne elde etmeye çalıştığınız konusunda net değilim. Bu düğme nedir? Tıklandığında ne yapmak istiyorsunuz?

Muhtemelen istediğiniz sonucu elde edebilirsiniz, ancak yaklaşımınızın değişmesi gerekebilir.

 
honest_knave :

Çoğu şey mümkün. Ama ne elde etmeye çalıştığınız konusunda net değilim. Bu düğme nedir? Tıklandığında ne yapmak istiyorsunuz?

Muhtemelen istediğiniz sonucu elde edebilirsiniz, ancak yaklaşımınızın değişmesi gerekebilir.


Amacım, bu düğme nesnesinin bilet numaralarını ve onlara tıkladığımda kârlarını gösterebilmesi, sipariş bulutunun kapanması.

Bu yorumu mobil cihazdan yazdım. O yüzden 10 saat sonra bu konuyu araştırmaya başlayacağım. Yorumlarınız için teşekkürler.
 
Max Enrik :

Amacım, bu düğme nesnesinin bilet numaralarını ve onlara tıkladığımda kârlarını gösterebilmesi, sipariş bulutunun kapanması.

Bu yorumu mobil cihazdan yazdım. O yüzden 10 saat sonra bu konuyu araştırmaya başlayacağım. Yorumlarınız için teşekkürler.

Bu düğmeleri tanımlayan nesne adlarında benzersiz bir etiket bulundurun. "#" kullanıyor gibisin

if (id== CHARTEVENT_OBJECT_CLICK && StringSubstr (sparam, 0 , 1 )== "#" ) // this is one of your order buttons being clicked

Ardından, nesne adının geri kalanından veya düğme metninden sipariş numarasını çıkarın.

Bu aşamada OrderTicket() kullanmaya gerek yoktur.

 

Nesneleri sipariş bileti ile tanımlanır.

"#" + IntegerToString ( OrderTicket ())+ " -" + "Object Button"

Böylece, nesnenin hangi sıraya ait olduğunu bulabilmek için her nesnenin dize adında bilet numarası bulunur.

Bu, her nesnenin dize adında "#" tutacağı anlamına gelir.

Bu nedenle, esasen bir düğme tıklamasında, önce nesne dizesi adından sipariş bileti numarasını çıkarmalı ve ardından orderselectloop'u çalıştırmalı ve seçilen sipariş bileti, düğme dizesi adından çıkarılan sipariş bileti numarasıyla eşleştiğinde, siparişi bulmuş olacaktır.

Ya da basitçe yapabilir

SELECT_BY_TICKET

Grafik olayının içindeki sırayı seçmek için.

Şimdi nesneye sadece bilet numarasını/adını ve başka bir şey vermese çok daha kolay olurdu.

ObjectCreate ( 0 ," IntegerToString ( OrderTicket ()), OBJ_BUTTON , 0 , 0 , 0 );

Çünkü o zaman doğrudan bileti seçebilir veya sayıları karşılaştırabilir.

 

Geçen gün OrderSelect() Loop'u denedim. Şimdi ilk önce bir kez daha deneyeceğim.
Sonra son yorumlarınızı derinlemesine araştıracağım.

Değerli zamanlarınız için teşekkürler.

 

Test.mq4 dosyamda aşağıdaki kodu denedim, bu nedenle aşağıdaki kod mükemmel çalışıyor ve şu ana kadar herhangi bir sorunla karşılaşmadım, ancak hala test ediyorum.

S: Kötüyse, aşağıdaki kodu iyileştirebilir misiniz, lütfen?

if (id== CHARTEVENT_OBJECT_CLICK )
  {
   for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) continue ;
       if ( OrderSymbol ()!= Symbol ()) continue ;

       if (sparam== "#" + IntegerToString ( OrderTicket ())+ " -" + "Object Button" )
        {
         if (! OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 3 ,CLR_NONE))
           {
             Print ( "# Error " , GetLastError ());
           }
        }
     }
  }

Şimdiden teşekkürler.

( Üzerinde çalışıyorum )

 

Üstün bir inceleme, çalışması gerektiğini gösteriyor. Ancak verimliliği artırabilirsiniz.

Grafiğinize kaç farklı nesne çizdiğinizi düşünün. Bu nesnelerden *herhangi birine* tıklarsanız, her bir siparişte dolaşacak ve bir eşleşme bulmaya çalışacaksınız. Birçok nesnenin muhtemelen siparişlerle hiçbir ilgisi yoktur. Bu verimsiz.

Bu yüzden "#" için ilk sparam karakterini kontrol etmeyi önerdim. Bu, nesneyi otomatik olarak bir siparişle ilgili olarak tanımlar.

Ayrıca, siparişler arasında dolaşmaya gerek yoktur. Nesne adı ve/veya nesne metni bilet numarasını zaten içeriyor. Bu yüzden oradan bilet numarasını çıkarın ve siparişi kapatın

Misal:

Bir sipariş açarsın. 12345 numaralı bilet verilir.

" #12345 " adında bir OBJ_BUTTON oluşturun

OnChartEvent() içindeki kod şuna benzer (derlenmemiş, denenmemiş, gece geç saatlerde...):

if (id== CHARTEVENT_OBJECT_CLICK && StringSubstr (sparam, 0 , 1 )== "#" ) // this is an order button
  {
   int ticket=( int ) StringSubstr (sparam, 1 ); // extract the ticket number
   if ( OrderSelect (ticket, SELECT_BY_TICKET )) // select the order
     {
       if (! OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 3 ,CLR_NONE)) // close the order
        {
         Print ( "# Error " , GetLastError ());
        }
     }
  }
(arıza durumunda muhtemelen OrderSelect'i de kullanmak isteyeceksiniz)
Neden: