Mql4 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 2

 
Yöntemlerden GetPointer'ı (bu) döndürmekten çekinmeyin.

En azından ayarlayıcı yöntemlerde bu haklıdır - kod daha okunabilir ve daha kompakt hale gelebilir, la adlı parametreler elde edersiniz

ChartObject *hline=HLine::New(1.255).Color(clrGreen).Width(2).Selectable(true); // не надо помнить очерёдность параметров и можно писать в одну строку - цепочкой

// получается вот из подобного :
class HLine:public ChartObject {
public:
   HLine(double price);
   HLine *New(double _price) { return new HLine(_price); } // это чтобы не городить (new HLine(...)).Method1
   HLine *Color(color _clr) { fgColor=_clr; return GetPointer(this); }  // а это чтобы получались цепочки obj.Method1(..).Method2(..)
};
Tabii ki dikkatli kullanın, çünkü istisnalar dilde değildir ve beklenmez

ve işlevlerin dönüş türüne göre niteliği biraz karışır.
 
Maxim Kuznetsov :
GetPointer(this) öğesini yöntemlerden döndürmekten çekinmeyin.
Yani &bu daha kısa.
 
fxsaber :
Yani &bu daha kısa.
Ve GetPointer() , örneğin hata ayıklama amacıyla dikkatli bir şekilde geçersiz kılınabilir.
 
GetPointer'da alınan işaretçi silinemez, anladınız mı?
 
// После этого в MQL4 будут компилироваться все библиотеки из MQL5\Include\Math
#property strict

#ifdef __MQL4__
  #include <Math\Alglib\bitconvert.mqh>  
  
  #define TEMP_MACROS(A) double A( double ) { return(0); }
    TEMP_MACROS(MathLog1p)
    TEMP_MACROS(MathExpm1)
    TEMP_MACROS(MathArcsinh)
    TEMP_MACROS(MathArccosh)
    TEMP_MACROS(MathArctanh)
  #undef TEMP_MACROS
#endif
 
Alexey Viktorov :
Pekala, önce başlayalım.

Bir emri kapatmak için emir tipinin ve bu tipe karşılık gelen fiyatın tanımlanmasına gerek yoktur. OrderClosePrice() fiyatına yakın yazmanız yeterlidir.

/********************Script program start function********************/
void OnStart ()
{
   int i, total = OrdersTotal ()- 1 ;
     for (i = total; i >= 0 ; i--)
     {
       if ( OrderType () < OP_SELLSTOP )
       {
         if (! OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 100 ))
         printf ( "***********" );
       }
     }
} /********************************************************************/


Güzel! ) Teşekkürler.

Örneğe bakılırsa, OrderSelect () gerekli değil mi?

 
Liza_ :


Güzel! ) Teşekkürler.

Örneğe bakılırsa, OrderSelect () gerekli değil mi?

Gerekli. Alexey'nin parktan geçmesine izin verdim...
 
Liza_ :

Güzel! ) Teşekkürler.

Evet, bu zaten savaş kullanımı için çok kısa komut dosyaları yazmanıza izin verir.
 // Закрывает позиции, описание - https://www.mql5.com/ru/code/17943
sinput int RTOTAL = 4 ;             // Число повторов при неудачных сделках
sinput int SLEEPTIME = 1 ;         // Время паузы между повторами в секундах
sinput int Deviation_ = 10 ;       // Отклонение цены
sinput bool exAllSymbols = false ; // false - только текущий, true - все символы

#define _CS(A) ((! IsStopped ()) && (A))

bool CloseAllPositions( const bool AllSymbols = true , const int Slippage = 0 )
{
   bool Res = true ;
  
   for ( int i = OrdersTotal () - 1 ; _CS(i >= 0 ); i--)
     if ( OrderSelect (i, SELECT_BY_POS ) && ( OrderType () <= OP_SELL ) &&
        (AllSymbols ? true : ( OrderSymbol () == Symbol ())))
      Res &= OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), Slippage);
      
   return (Res);
}

void OnStart ()
{
   for ( int i = 0 ; _CS((i < RTOTAL) && (!CloseAllPositions(exAllSymbols, Deviation_))); i++)
     Sleep (SLEEPTIME * 1000 );
}
MQL5 analogu ile karşılaştırma açıkça onun lehine değil. İlginç, ancak karşılaştırmanın sonucunun tam tersi olduğu durumlar var ...
 
Artyom Trishkin :
Gerekli. Alexey'nin parktan geçmesine izin verdim...

Evet... Gerçekten berbattı.

Ama ondan önce bu konularla tanışmadım.

fxsaber :

Böylece OrderClosePrice'ı yalnızca ilgili OrderSelect'ten hemen sonra kullanabilirsiniz. Çünkü OrderSelect, Order(const)-işlevlerinin verilerini bir kez kopyalar ve aynı RefreshRates bunları güncelleyemez.

Onlar. örneğin, OrderClosePrice ile kapatmak mümkün olmadıysa, bir sonraki denemeden önce OrderSelect'i tekrar yapmak gerekir (RefreshRates gerekli değildir).

Tehdit Bu konu zaten 2005'te ! İşte geliştiricilerin ayrıntılı argümanları.

Yani kullanabilirsiniz, ancak sorunların mümkün olduğu anlayışıyla.
 

Açık siparişler daha yüksek bir sayıdan analiz edilmelidir, yani. for(int nom=OrdersTotal()-1; nom>=0; nom--)
Bu özellikle siparişleri silerken önemlidir.
Ancak for(int nom=0; nom<OrdersTotal(); nom++) tersini yaparsanız ne olur?
İlk olarak, indeks sıfırdır ve 0 numaralı ilk sıra silinir.
Ardından endeks 1'e eşit olur. Bu sırada, kalan emirler kaydırılır ve 1 numaralı emir,
sıfır konumunu işgal eder. Eski 2 numara 1 pozisyonu alır. Kaldırılacak.
Daha sonra indeks 2'ye eşit olur ve başlangıçta 4 numaradaki sıra silinir. ...
Böylece başlangıçta bile pozisyon işgal eden emirler silinir. Ve tuhaf olanlar kalır. Bu, siparişler ve sayılar hakkındaki yorumlardan görülebilir.
Hem kaldırma seçeneklerini hem de ekran görüntülerini gösteren bir komut dosyası ekliyorum
20 bekleyen sipariş oluşturuldu

Birinden sonra gitti

Dosyalar:
PROBA-ORD.mq4  3 kb