[ARŞİV] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 5. - sayfa 346

 
hoz : Vadim, ObjectSet() işlevini kullanabiliyorsan neden tekrar bir nesne oluştur?

Neden tavsiye isteyesiniz ve sonra ona meydan okuyasınız ki? Bu nedir, ana akım mı?
 
FAQ :

Daha fazla tartışmanın faydasız olduğunu düşünüyorum. Her şeyi adım adım anlattım. yaptığını yapmaya devam et.

Evet, ne tür bir tartışma olabilir? Maksimum fiyat sapması ile bir emri kapatmanız gerekir. Yani fiyatla ilgileniyoruz ... yani. bekleyen (maksimum veya minimum açılış fiyatı ile) aşırı olanı bulmanız gerekir. Eğer aynı fikirde değilseniz, tartışabilirsiniz. Aksi takdirde, hala haklıyım! Ne dediğimi açıkça anlıyorum.
 

Kod, ST ve TP'yi kaldırır. seçici silme için bir koşul ekleyin

Ne doğru yazılmamış? Her şeyi silip duruyor :(

 #property show_inputs
extern bool   StopLoss     = True;    // Удалить только StopLoss
extern bool   TakeProfit   = True;    // Удалить только TakeProfit
extern bool   ALL          = True;    // Удалить все
void start()
   {
   bool   fm;
   int     i;
   double SL=OrderStopLoss();
   double TP=OrderTakeProfit();

      if (StopLoss)   SL=0;
      if (TakeProfit) TP=0;
      if (ALL)       {SL=0; TP=0;}
     
      for (i=0; i<OrdersTotal(); i++)
         {
           if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
               {
                  if (OrderType()==OP_BUY)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
                  if (OrderType()==OP_SELL)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
               }
         }
   }

Yoksa başka bir çözüm yok mu ve her koşul için bir silme kodu yazmanız mı gerekiyor?

#property show_inputs
#include <WinUser32.mqh>
extern bool   StopLoss     = False;    // Удалить только StopLoss
extern bool   TakeProfit   = False;    // Удалить только TakeProfit
extern bool   ALL          = False;    // Удалить все
void start()
   {
   bool   fm;
   int     i;

    if (StopLoss)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (TakeProfit)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (ALL)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
   }             

 
hoz :


Vadim, ObjectSet() işlevini kullanabiliyorsan neden tekrar bir nesne yaratıyorsun?

Bu durumda, bir grafik nesnesinin tamamen oluşturulduğu ve yapılandırıldığı bir fonksiyon vardı. İçinde, oluşturma işlevi optimize edilmiştir. Nesne zaten varsa, oluşturulmaz. Kendiniz kontrol edin. Nesneleri oluşturmak ve ardından özellikleri değiştirmek için zamanı kaydedin. İkinci arama önemli ölçüde daha kısa olacaktır. Onlar. hiçbir şey yeniden yaratılmaz.

Sonuç olarak, sadece bir nesne oluşturmakla kalmayacak, aynı zamanda nesnenin özelliklerini çok fazla zaman kaybetmeden değiştirerek özelleştirebilecek evrensel bir fonksiyonumuz var.

 
bana piyasa trendini belirlemek için danışmandaki senaryoyu söyle?
 

Satış için en düşük teklifleri kaldıracak bir fonksiyon yazdım. Kapatılacak kısa gecikmelerin sayısı, işe yarayan satın alma gecikmelerinin sayısına eşittir, yani. piyasa emirlerine geçti.

Bir alımda bir gecikme işe yararsa, o zaman bir satışta bir gecikmeyi kapatırız, eğer bir alımda 2 gecikme işe yararsa, o zaman bir satışta 2 mevduat kapatırız.

İşte kod:

 //+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells( int & amountOfCurrPending)
{
   int total = OrdersTotal () - 1 ,
       ordersToDelete = level - amountOfCurrPending,
       s_ticket;
   amountOfCurrPendingBuys = 0 ;
   amountOfCurrPendingSells = 0 ;
   Print ( "DeletePendingSells: level = " , level);
   Print ( "ordersToDelete = level - amountOfCurrPending ; " , level, " - " , amountOfCurrPending);
   int n = 0 ;
   double OOP = 2.0 ;
   Print ( "функция сноса отложек DeletePendingSells" );
   for ( int i=total; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS)) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
       if (OrderType() != OP_SELLSTOP) continue ;
      
       while (n < ordersToDelete)
      {
         if (OOP > OrderOpenPrice())
         {
             Print ( "OOP > OrderOpenPrice() ; " , OOP, " > " , OrderOpenPrice());
             OOP = OrderOpenPrice();
             s_ticket = OrderTicket();
             ordersToDelete--;
         }
      }
   }
}

miktarOfCurrPending - bekleyen satın alma siparişlerinin sayısı.

seviye - her birine başlangıçta gönderilen bekleyen siparişlerin sayısı. yan.

OOP - bekleyen açılış fiyatı, ulaşılamaz herhangi bir değer aldı.

Koşulumuz, sayaç orderToDelete'den küçükse, bekleyenleri en düşük fiyatla silmemizdir. Ancak tüm kısa mevduatlar kaldırılır. Benimle ilgili sorun ne?

 
hoz :

Satış için en düşük teklifleri kaldıracak bir fonksiyon yazdım. Kapatılacak kısa gecikmelerin sayısı, işe yarayan satın alma gecikmelerinin sayısına eşittir, yani. piyasa emirlerine geçti.

Bir alımda bir gecikme işe yararsa, o zaman bir satışta bir gecikmeyi kapatırız, eğer bir alımda 2 gecikme işe yararsa, o zaman bir satışta 2 mevduat kapatırız.

İşte kod:

miktarOfCurrPending - bekleyen satın alma siparişlerinin sayısı.

seviye - her birine başlangıçta gönderilen bekleyen siparişlerin sayısı. yan.

OOP - bekleyen açılış fiyatı, ulaşılamaz herhangi bir değer aldı.

Koşulumuz, sayaç orderToDelete'den küçükse, bekleyenleri en düşük fiyatla silmemizdir. Ancak tüm kısa mevduatlar kaldırılır. Benimle ilgili sorun ne?

Mantığınızı hiç anlamıyorum... Bunu neden yapmayasınız: emir bir piyasa pozisyonuna dönüştürüldü - bekleyen en uzak pozisyon kaldırıldı.
Ve bu kadar. Yoksa aynı fiyata asılı bir sürü siparişiniz mi var?
 
artmedia70 :

Ve bu kadar. Yoksa aynı fiyata asılı bir sürü siparişiniz mi var?


Hayır, adımlı siparişler..
artmedia70 :
Mantığınızı hiç anlamıyorum... Bunu neden yapmayasınız: emir bir piyasa pozisyonuna dönüştürüldü - bekleyen en uzak pozisyon kaldırıldı.

Bu yüzden en uzak konumu siliyorum, yani. Kısa pozisyon olduğu için açılış fiyatı en düşük olan pozisyon anlamına gelir. Burada işlevi yeniden yazdım, burada her şey açık olmalı. Baskılar kaldırıldı ve fazladan değişken kaldırıldı.

Sonuçta, miktarOfCurrPending değişkeni yalnızca satın almak için bekleyen kalan sayısını aktarır. Onlar. toplam başlangıçta level miktarıysa ve miktarOfCurrPending mevcut bekleyen sayısıysa, o zaman ilk bekleyen sayısını mevcut sayıdan çıkarmak farkı verir ve bu, kısaları kaldırmak için gereken miktardır. Anlıyor musun?

 //+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells( int & amountOfCurrPending)
{
   int total = OrdersTotal () - 1 ,
       ordersToDelete = level - amountOfCurrPending,   // Количество отложек, которые требуется удалить
       s_ticket;
   amountOfCurrPendingBuys = 0 ;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0 ;                       // Количество текущих отложек на продажу
   Print ( "DeletePendingSells: level = " , level);
   Print ( "ordersToDelete = level - amountOfCurrPending ; " , level, " - " , amountOfCurrPending);

   double OOP = 2.0 ;
   Print ( "функция сноса отложек DeletePendingSells" );
   for ( int i=total; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS)) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
       if (OrderType() != OP_SELLSTOP) continue ;
      
       while (ordersToDelete > 0 )                       // Если есть ордера, которые требуется удалить..
      {
         if (OOP > OrderOpenPrice())
         {
             Print ( "OOP > OrderOpenPrice() ; " , OOP, " > " , OrderOpenPrice());
             OOP = OrderOpenPrice();                   // Ищется ордер, с минимальной ценой открытия
             s_ticket = OrderTicket();                 // Получаем тикет ордера с минимальной ценой открытия

             Print ( "DeletePendingSells: s_ticket = " , s_ticket);
             Print ( "DeletePendingSells: OOP = " , OOP);
             OrderDelete(s_ticket,Black); // Тут нужно закрыть найденный ордер, и видимо проверить, что он закрыт. И счётчик уменьшить!
             ordersToDelete--;                         // Уменьшаем количество требуемых ордеров для удаления
         }
      }
   }
   Print ( "DeletePendingSells: ordersToDelete = " , ordersToDelete);
}
Hatayı kırmızı ile nerede işaretledim? Bunu çözmenin en iyi yolu nedir?
 
hoz :

Hayır, adımlı siparişler..

Bu yüzden en uzak konumu siliyorum, yani. Kısa pozisyon olduğu için açılış fiyatı en düşük olan pozisyon anlamına gelir. Burada işlevi yeniden yazdım, burada her şey açık olmalı. Baskılar kaldırıldı ve fazladan değişken kaldırıldı.

Sonuçta, miktarOfCurrPending değişkeni yalnızca satın almak için bekleyen kalan sayısını aktarır. Onlar. toplam başlangıçta level miktarıysa ve miktarOfCurrPending mevcut bekleyen sayısıysa, o zaman ilk bekleyen sayısını mevcut sayıdan çıkarmak farkı verir ve bu, kısaları kaldırmak için gereken miktardır. Anlıyor musun?

Hatayı kırmızı ile nerede işaretledim? Bunu çözmenin en iyi yolu nedir?
 Ищется ордер, с минимальной ценой открытия

Seri numarasını erteleme yorumundaki ızgaraya yazardım ve aynı numarayı karşılık gelen ertelenmiş olana yazardım. Daha sonra bir piyasa pozisyonu bulduktan sonra, yorumundaki sayıyı okuduktan sonra, yorumundaki aynı numara için karşılık gelen karşı mevduat sorunsuz bir şekilde aranır. Magicki'nin bir başkası için kullandığı zamanlar.

not. Kodunuzun okumak/ayrıştırmak için zamanı yok

 
artmedia70 :

Seri numarasını erteleme yorumundaki ızgaraya yazardım ve aynı numarayı karşılık gelen ertelenmiş olana yazardım. Daha sonra bir piyasa pozisyonu bulduktan sonra, yorumundaki sayıyı okuduktan sonra, yorumundaki aynı numara için karşılık gelen karşı mevduat sorunsuz bir şekilde aranır. Magicki'nin bir başkası için kullandığı zamanlar.

not. Kodunuzun okumak/ayrıştırmak için zamanı yok



hm. Evet, her yöndeki mevduat sayısı aynıysa, karşılık gelen mevduat bu şekilde sorunsuz aranır. Ve eğer farklıysa, bu seçenek anladığım gibi çalışmayacak.