Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 184

 
enum EAct{PUSH,POP};

template < typename T>
void TempCondition(T &value,EAct act){
   static T temp=T();
   switch (act){
       case PUSH: temp=value; break ;
       case POP: value=temp;
   }
}

#define sortArray(_lArray,_lField) do {                     \
   for ( int i = 0 ; i < ArraySize (_lArray); i++) {            \
      TempCondition(_lArray[i],PUSH);                       \
       for ( int a = 1 ; a <= i; a++) {                         \
         if (_lArray[i]._lField < _lArray[a - 1 ]._lField){   \
             for ( int b = i; b >= a; b--) {                   \
               _lArray[b] = _lArray[b - 1 ];                 \
               }                                            \
               TempCondition(_lArray[a - 1 ],POP);           \
               break ;}}}} while ( false )


struct STest{
   double a;
   int b;
};

void OnStart ()
{
    STest test[ 700 ];
    sortArray(test,a);
}

Teoride çalışması gerekir. Ama bunu yapmanı tavsiye etmem.

 
Koldun Zloy :

Aslında, bu optimaldir. Ve daha karmaşık sıralama koşulları belirlemenizi sağlar.

Örneğin:

Ve hala başka bir çözüm yok.

Bir kalıbın amacı genel olmaktır. Örneğinizde en az bir a, b, c alanı içermeyen başka bir yapı geçilirse, derleme yapılmayacaktır. Diğer bir deyişle, işlev iki farklı veri türüyle aynı anda çalışamaz.

 
 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Ticaret için kontrol paneli. YARDIM GEREKLİ MQL5

Vladimir Karputov , 2020.08.18 09:04

Bu kod işe yaramadı - pirzola ve kareyi karşılaştıramazsınız:

   for ( int i= OrdersTotal () - 1 ; i>= 0 ; i--)
     {
       ulong OrderTicket= OrderGetTicket (i);
       if (OrderTicket> 0 && PositionSelectByTicket (OrderTicket))
        {
         // Stop long позиции------------------------------------------
         if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
           {
             int cur_tr; //трейлинг
             double ask = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
             double newSl = ask - cur_tr* _Point ;
             double positionSl = PositionGetDouble ( POSITION_SL );
             double positionTP = PositionGetDouble ( POSITION_TP );
             if (newSl > positionSl || positionSl == 0 )
              {
               CTrade trade;
               trade.PositionModify(OrderTicket,newSl,positionTP);
              }
           }
        }
     }

Bu koşul, bekleyen emir kısmen doldurulmuş ve bir pozisyon oluşturmuşsa işe yarar. O zaman aynı bilete sahip bir emir ve bir pozisyon aynı anda var olacaktır.

Bu nedenle, aşağıdaki yapı bazı durumlarda anlamlıdır.

:: PositionSelectByTicket (:: OrderGetInteger ( ORDER_TICKET ))
 
Seçilen pozisyon veya siparişin MQL verilerini sıfırlamanız gerekirse.
 PositionSelectByTicket ( 0 ); // Обнуляет PositionGet*
OrderSelect ( 0 );             // Обнуляет OrderGet*
 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Kitaplıklar: MT4Orders

fxsaber , 2020.08.20 15:44

Asenkron işlemlerle çalışanlar için, hesabınızda mümkün olan maksimum sayıda asenkron işlem için ayarları bilmek faydalı olacaktır.

Öğrenmek kolay.

 Alert : 60 - Too many trade requests


Dikkatli olun, bir sınırla karşılaşabilirsiniz.

 
fxsaber :

Renat, uzun zaman önce sadece limiti vurmakla kalmayıp, DC'den bir blok yakalayabileceğinizi söyledi.

 
fxsaber :

Bu koşul, bekleyen emir kısmen doldurulmuş ve bir pozisyon oluşturmuşsa işe yarar. O zaman aynı bilete sahip bir emir ve bir pozisyon aynı anda var olacaktır.

RannForex-Server demo hesabında aşağıdaki kod ile bu Expert Advisor'ı çalıştırırsanız hemen bu durumu yeniden oluşturabilirsiniz.

 // Воспроизведение ситуации наличия позиции и отложенного ордера с одинаковыми тикетами.

#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

MqlTradeResult Result = { 0 };
MqlTradeRequest Request = { 0 };

int OnInit ()
{

        Request.action = TRADE_ACTION_PENDING ;
        Request.symbol = _Symbol ;
        Request.volume = 100 ;
        Request.price = Ask;
        Request.type = ORDER_TYPE_BUY_LIMIT ;
        
         return (! OrderSend (Request, Result)); // Выставили лимитник по текущей цене.
}

#define TOSTRING(A) #A + " = " + DoubleToString (A, _Digits )

void OnTradeTransaction ( const MqlTradeTransaction &, const MqlTradeRequest &, const MqlTradeResult & )
{
   if ( OrderSelect (Result.order) && ( OrderGetInteger ( ORDER_STATE ) == ORDER_STATE_PARTIAL )) // Если наш лимитник исполнился частично
  {
     if (Ask - OrderGetDouble ( ORDER_PRICE_OPEN ) < 100 * _Point )                             // и находится близко от текущей цены
    {
        Request.action = TRADE_ACTION_MODIFY ;
        Request.order = Result.order;
        Request.price = Ask - 1000 * _Point ;

       // тогда передвигаем его подальше.
       if ( OrderSend (Request, Result)) // Если синхронный OrderSend выполнился успешно, то торговое окружение должно соответствовать.
      {
         // Проверка соответствия торгового окружения.
         if ( OrderSelect (Request.order) &&                                                                 // Если получилось взять данные нашего ордера
             NormalizeDouble ( OrderGetDouble ( ORDER_PRICE_OPEN ) - Request.price, _Digits ))                   // и цена ордера не равна цене успешного OrderSend
           Alert ( "Bug:" + TOSTRING( OrderGetDouble ( ORDER_PRICE_OPEN )) + " != " + TOSTRING(Request.price)); // сообщаем о баге MT5.
      }
    }
     else
       ExpertRemove ();
  }     
}


Sonuç.


Yol boyunca, komut dosyası (her zaman ilk kez değil) eşzamanlı bir OrderSend'in yürütülmesinde bir hata gösterir.

 Alert : Bug: OrderGetDouble ( ORDER_PRICE_OPEN ) = 0.89837 != Request.price = 0.88837

OrderSend'i birkaç on/yüz milisaniye boyunca yürüttükten sonra, sipariş fiyatı eskidir ve OrderSend'in başarıyla yerleştirdiği fiyat değildir.


Aynı biletler konusuna dönersek, bazı sonuçlar çıkarabiliriz.

  1. Kısmi bir sınır belirlenirse, oluşturulan anlaşma "Siparişler ve Anlaşmalar" sekmesinde görünmez.
  2. Bir hedge işleminde, bir emir, farklı fiyatlarda birden fazla IN işlemi oluşturabilir. Sonuç olarak, bir pozisyon açmak için kesirli (puanlara göre) bir fiyat elde edilecektir.
  3. Oluşan pozisyonu Kısmi-ertelenmiş silmeden kapatabilirsiniz. Ancak bundan sonra erteleme işe yararsa, daha önce kapatılan pozisyonun biletine eşit bir biletle anlaşma açacaktır. Onlar. Belirli bir biletle bir pozisyonu kapattığınızda bir durum olabilir. Ve sonra pozisyon aynı biletle tekrar görünür.
  4. Aracı yazılımına bağlı olarak, kısmi yürütme farklı şekillerde uygulanabilir. Yukarıda standart MT5 uygulamasını tanımladım.

PS Birisi başka bir ticaret sunucusunda çoğaltmayı başardıysa, adı paylaşın.

Arama dizisi : Oshibka 010.

 
fxsaber :


  1. Oluşan pozisyonu Kısmi-ertelenmiş silmeden kapatabilirsiniz. Ancak bundan sonra erteleme işe yararsa, daha önce kapatılan pozisyonun biletine eşit bir biletle anlaşma açacaktır. Onlar. Belirli bir biletle bir pozisyonu kapattığınızda bir durum olabilir. Ve sonra pozisyon aynı biletle tekrar görünür.

Benzersiz bir bilet değil mi? Bu nasıl olabilir?

Biletler siparişler ve fırsatlar için benzersiz mi?

 
Andrey Khatimlianskii :

Benzersiz bir bilet değil mi? Bu nasıl olabilir?

Kendiniz için öyle bir açıklama bulabilirsiniz ki, bir açılış emri olduğu sürece her zaman bir pozisyon vardır. Sadece her zaman görünmez - sıfır hacim. Ve bu pozisyonun benzersiz bir bileti var. Eh, bir hedge üzerinde, bu nedenle, karşılık gelen giriş ve çıkış işlemlerinden sonra aynı pozisyonda giriş işlemlerine sahip olmak oldukça mümkündür.

Biletler siparişler ve fırsatlar için benzersiz mi?

Eşsiz. Ama elbette ORDER_TICKET, DEAL_TICKET'e eşit olabilir.