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

 
fxsaber :

Bir ticaret komut dosyasında OnTradeTransaction ne olabilir? Kodunuzda değil, başka birinin ticaret komut dosyasında.
Tam teşekküllü bir ticaret robotunun bir senaryoya yazılabileceğine cidden inanıyor musunuz?
 
Arkadaşlar, lütfen konuya yaklaşalım: Bir veya başka bir ifadenin uygulanmasına ilişkin örnekler görmek istiyorum. Mutlaka kod değil, çok varsa mantığını anlatabilirsiniz mesela, gönderildiğinden emin olmak için bir istek gönderiyoruz oraya bakıyoruz, şöyle şöyle bir dönüş kodu aldığımızda yapıyoruz Bugün nasılsın. Yani, en güvenilir veri toplama örnekleri.

Ve sonra, eğer küfür edersek, o zaman yararlı bir konudan birkaç sayfa çekişmeye geçeceğiz. Sonra her şeyi temizleyin ki öz kalsın... Tam olarak şu ya da bu sürecin özünün burada gösterilmesini istiyorum. Bir şeyin herhangi bir uygulaması için birkaç seçenek olsun. Her yöntemin avantajları ve dezavantajları tartışılacaktır.

Ardından, yeterince farklı yararlı bilgi biriktiğinde, tüm bunları bir tablette toplama fikri ortaya çıkıyor. Ve düzenli olarak faydalı cips birikimi ile sürekli olarak yenileyin.
Herkes için faydalı olacağını düşünüyorum.
 
Soru : Bir sayının sekizli ve onaltılı sistemlere nasıl dönüştürüleceği.

Yanıtlar:
1.

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

8 ve 16 ritza

Taras Slobodyanik , 2017.02.24 22:16

string DecToHex( int n)
  {
   string s = "" , c;
   while (n != 0 )
     {
       if (n% 16 < 10 )
         c= CharToStr (n% 16 + '0' );
       else
         c= CharToStr (n% 16 + 'A' - 10 );
      s = c + s;
      n = n / 16 ;
     }
   return (s);
  }
2.

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

8 ve 16 ritza

Maksim Kuznetsov , 2017.02.24 22:20

birdenbire, StringFormat, PrintFormat :-)

PrintFormat("Onaltılık %x ve sekizlik %o",1122,1122);
3.

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

8 ve 16 ritza

fxsaber , 2017.02.24 22:21

string NumToString( uint Num, const uint Scale = 10 )
{
   static const string digits[] = { "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" ,
                                   "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "K" ,
                                   "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" , "V" , "X" , "Y" , "Z" };
  
   string Str = (Num == 0 ) ? "0" : "" ;
  
   while (Num > 0 )
  {
    Str = digits[Num % Scale] + Str;
    
    Num /= Scale;
  }
  
   return (Str);
}

void OnStart ()
{
   Print (NumToString( 123 , 8 ));
   Print (NumToString( 123 , 16 ));
}



 
basit tüccar :
Tam teşekküllü bir ticaret robotunun bir senaryoya yazılabileceğine cidden inanıyor musunuz?
Yapabilir
 
Alexey Kozitsyn :

Yoldaşlar fxsaber ve prostotrader'ın tartışmasını ayrı bir başlığa taşıyın, burada tartışmalar varsa, konu pratik önemini kaybeder. Gerçek bir çözüme ulaştıklarında buraya yazacaklar. Ve inanıyorum ki, bu bir şüphe veya araştırma dalı olmamalıdır. Bu, pratik çözümlerin bir dalı olmalıdır. Ve eğer birkaç kişi konuyla ilgili farklı vizyonlara sahipse, bırakın konuyu başka yerde tartışsınlar.

<silinecek gönderi>

Gelin gerçeği bulalım. Bunu düşünmek için zaman vardı ve onu bırakmaya karar verdim ve şüphelerimi ortadan kaldırmasını istediğim ve sorduğum Vitya (Vinin) de tartışmayı bırakmayı teklif etti (kaldırmadaki şüphelerimi onaylayarak) - gerçeği kabul edelim. doğmak. Bence bu daha doğru olur. Her neyse, daha sonra bir tablette toplamaya başlayacağım, böylece burada dolgulu olarak uygulayabilirim.
 
basit tüccar :

Birkaç milisaniye beklemeye gerek yok.

Mesaj OnTradeTransaction'a gönderilecek

kodu gör

Mesajınızın anlamı nedir? Peki, OnTradeTransaction()'a gelecek, ne olmuş yani? Bu, etkinliği beklemeniz gerektiği anlamına gelir. Hala bekliyorum. fxsaber mesajının anlamı, OrderSend()'in yürütülmesinden sonra, gerçekleştirilen eylemle ilgili bilgilerin uçbirimde hemen görünmemesidir. Birisi OnTradeTransaction() için beklemeyi sever, biri listedeki bir siparişin veya anlaşmanın görünümünü beğenir. Örneğin, MT4'ten farkı. M4'te OrderSend()'den sonra sipariş zaten emirler listesindedir ve OrderClose()'dan sonra her zaman geçmiştedir.

 
Artyom Trishkin :
Gelin gerçeği bulalım. Bunu düşünmek için zaman vardı ve onu bırakmaya karar verdim ve şüphelerimi ortadan kaldırmasını istediğim ve sorduğum Vitya (Vinin) de tartışmayı bırakmayı teklif etti (kaldırmadaki şüphelerimi onaylayarak) - gerçeği kabul edelim. doğmak. Bence bu daha doğru olur. Her neyse, daha sonra bir tablette toplamaya başlayacağım, böylece burada dolgulu olarak uygulayabilirim.
Bir prostotrader ile anlaşmazlıklarda gerçek ortaya çıkamaz, onları bunun için başlatmaz. Her zaman olduğu gibi, konuşmanın ne hakkında olduğuna bile girmedi.
 
Buradaki ihtilaf nedir? Burada bir anlaşmazlık yok. fxsaber, terminalin gerçekten belgelenmemiş ve herkesin gerçekten bilmesi gereken bir özelliğini hatırlattı, aksi takdirde Uzman Danışmanların geliştirilmesinde sorunlar yaşanacak ve bu da daha sonra aranması ve çözülmesi gerekecek.
 
Artyom Trishkin :
Gerçeği bulalım...

Artyom!

Sen akıllı ve politik olarak doğru bir insansın!

Hangi gerçek? Neyin tehlikede olduğunu gayet iyi anlıyorsun.

fxsaber bir senaryo yazdı (fena değil), ama kimse onu övmedi, işte burada

her konuda hatırlatmaya çalışır.

Övgü - aferin!

Ancak sorun şu ki, bu komut dosyasında OnTradeTransaction'ı kullanamazsınız, bu nedenle topları "Bay" dan yuvarlamanız gerekir (Uyku veya başka bir zamanlayıcı gibi)

Ve elbette, SCRIPT'in DANIŞMAN'dan daha iyi olduğunu henüz bilmeyen diğer kullanıcılar için "bakım"!

Ve Dmitry Fedoseev , söylediklerime her zaman apriori olarak karşı çıkıyor ve haklı olup olmamam önemli değil.

Gerçek burada bulunamaz, çünkü İŞ değil, KİŞİSEL öne çıkar.

 
class ORDERSEND  
{
private :
   static const bool IsTester;
  
   static bool Waiting( const bool FlagInit = false )
  {
     static ulong StartTime = 0 ;

     const bool Res = FlagInit ? false : (:: GetMicrosecondCount () - StartTime < ORDERSEND::OrderSend_MaxPause);

     if (FlagInit)
      StartTime = :: GetMicrosecondCount ();
     else if (Res)
      :: Sleep ( 0 );

     return (Res);
  }

   static bool EqualPrices( const double Price1, const double Price2, const int digits)
  {
     return (:: NormalizeDouble (Price1 - Price2, digits) == 0 );
  }

   static bool HistoryDealSelect ( MqlTradeResult &Result )
  {
     if ((Result.deal == 0 ) && (Result.order != 0 ))
    {
       if (:: HistorySelectByPosition (:: HistoryOrderGetInteger (Result.order, ORDER_POSITION_ID )))
         for ( int i = :: HistoryDealsTotal () - 1 ; i >= 0 ; i--)
        {
           const ulong DealTicket = :: HistoryDealGetTicket (i);

           if (Result.order == :: HistoryDealGetInteger (DealTicket, DEAL_ORDER ))
          {
            Result.deal = DealTicket;

             break ;
          }
        }
    }

     return (:: HistoryDealSelect (Result.deal));
  }

#define TMP_ORDERSEND_BENCHMARK(A) \
   static ulong Max ##A = 0 ;         \
                                   \
   if (Interval ##A > Max ##A)         \
  {                                \
    ORDERSEND_BENCHMARK            \
                                   \
    Max ##A = Interval ##A;           \
  }

   static void OrderSend_Benchmark( const ulong Interval1, const ulong Interval2 = 0 )
  {
     #ifdef ORDERSEND_BENCHMARK
      TMP_ORDERSEND_BENCHMARK( 1 )
      TMP_ORDERSEND_BENCHMARK( 2 )
     #endif // ORDERSEND_BENCHMARK

     return ;
  }

#undef TMP_ORDERSEND_BENCHMARK

#define WHILE(A) while ((!(Res = (A))) && ORDERSEND::Waiting())

public :
   static uint OrderSend_MaxPause; // максимальное время на синхронизацию в мкс.
  
   // Полностью синхронизированный с торговым окружением OrderSend.
   // По окончании работы ГАРАНТИРОВАННО и за МИНИМАЛЬНОЕ время доступно корректное торговое окружение.
   // По скорости ничем не уступает связке OrderSendAsync + OnTradeTransaction.
   // Учтены MT5-нюансы: Result.deal == 0, STATE_STARTED и STATE_MODIFY pending.
   // В тестере/оптимизаторе производительность равна штатной OrderSend.

   static bool OrderSendSync( const MqlTradeRequest &Request, MqlTradeResult &Result )
  {
     const ulong StartTime1 = :: GetMicrosecondCount ();

     bool Res = :: OrderSend (Request, Result);

     const ulong Interval1 = :: GetMicrosecondCount () - StartTime1;

     const ulong StartTime2 = :: GetMicrosecondCount ();

     if (Res && !ORDERSEND::IsTester && (Result.retcode < TRADE_RETCODE_ERROR ) && (ORDERSEND::OrderSend_MaxPause > 0 ))
    {
      Res = (Result.retcode == TRADE_RETCODE_DONE );
      ORDERSEND::Waiting( true );

       if (Request.action == TRADE_ACTION_DEAL )
      {
        WHILE(:: HistoryOrderSelect (Result.order))
          ;

        Res = Res && ((( ENUM_ORDER_STATE ):: HistoryOrderGetInteger (Result.order, ORDER_STATE ) == ORDER_STATE_FILLED ) ||
                      (( ENUM_ORDER_STATE ):: HistoryOrderGetInteger (Result.order, ORDER_STATE ) == ORDER_STATE_PARTIAL ));

         if (Res)
          WHILE(ORDERSEND:: HistoryDealSelect (Result))
            ;
      }
       else if (Request.action == TRADE_ACTION_PENDING )
      {
         if (Res)
          WHILE(:: OrderSelect (Result.order) && (( ENUM_ORDER_STATE ):: OrderGetInteger ( ORDER_STATE ) == ORDER_STATE_PLACED ))
            ;
         else
        {
          WHILE(:: HistoryOrderSelect (Result.order))
            ;

          Res = false ;
        }
      }
       else if (Request.action == TRADE_ACTION_SLTP )
      {
         if (Res)
        {
           bool EqualSL = false ;
           bool EqualTP = false ;

           const int digits = ( int ):: SymbolInfoInteger (Request.symbol, SYMBOL_DIGITS );

           if ((Request.position == 0 ) ? :: PositionSelect (Request.symbol) : :: PositionSelectByTicket (Request.position))
          {
            EqualSL = ORDERSEND::EqualPrices(:: PositionGetDouble ( POSITION_SL ), Request.sl, digits);
            EqualTP = ORDERSEND::EqualPrices(:: PositionGetDouble ( POSITION_TP ), Request.tp, digits);
          }

          WHILE((EqualSL && EqualTP))
             if ((Request.position == 0 ) ? :: PositionSelect (Request.symbol) : :: PositionSelectByTicket (Request.position))
            {
              EqualSL = ORDERSEND::EqualPrices(:: PositionGetDouble ( POSITION_SL ), Request.sl, digits);
              EqualTP = ORDERSEND::EqualPrices(:: PositionGetDouble ( POSITION_TP ), Request.tp, digits);
            }
        }
      }
       else if (Request.action == TRADE_ACTION_MODIFY )
      {
         if (Res)
        {
           bool EqualSL = false ;
           bool EqualTP = false ;
           bool EqualPrice = false ;

           const int digits = ( int ):: SymbolInfoInteger (Request.symbol, SYMBOL_DIGITS );

           if (:: OrderSelect (Result.order))
          {
            EqualSL = ORDERSEND::EqualPrices(:: OrderGetDouble ( ORDER_SL ), Request.sl, digits);
            EqualTP = ORDERSEND::EqualPrices(:: OrderGetDouble ( ORDER_TP ), Request.tp, digits);
            EqualPrice = ORDERSEND::EqualPrices(:: OrderGetDouble ( ORDER_PRICE_OPEN ), Request.price, digits);
          }

          WHILE((EqualSL && EqualTP && EqualPrice))
             if (:: OrderSelect (Result.order) && (( ENUM_ORDER_STATE ):: OrderGetInteger ( ORDER_STATE ) != ORDER_STATE_REQUEST_MODIFY ))
            {
              EqualSL = ORDERSEND::EqualPrices(:: OrderGetDouble ( ORDER_SL ), Request.sl, digits);
              EqualTP = ORDERSEND::EqualPrices(:: OrderGetDouble ( ORDER_TP ), Request.tp, digits);
              EqualPrice = ORDERSEND::EqualPrices(:: OrderGetDouble ( ORDER_PRICE_OPEN ), Request.price, digits);
            }
        }
      }
       else if (Request.action == TRADE_ACTION_REMOVE )
         if (Res)
          WHILE(:: HistoryOrderSelect (Result.order))
            ;
    }

     const ulong Interval2 = :: GetMicrosecondCount () - StartTime2;

    Result.comment += " " + :: DoubleToString (Interval1 / 1000.0 , 3 ) + " + " + :: DoubleToString (Interval2 / 1000.0 , 3 ) + " ms" ;

    ORDERSEND::OrderSend_Benchmark(Interval1, Interval2);

     return (Res);
  }

#undef WHILE
};

static const bool ORDERSEND::IsTester = (:: MQLInfoInteger ( MQL_TESTER ) || :: MQLInfoInteger ( MQL_OPTIMIZATION ) ||
                                         :: MQLInfoInteger ( MQL_VISUAL_MODE ) || :: MQLInfoInteger ( MQL_FRAME_MODE ));

static uint ORDERSEND::OrderSend_MaxPause = 1000000 ; // максимальное время на синхронизацию в мкс.

// Эта строчка позволяет сделать все OrderSend корректными.
#define OrderSend ORDERSEND::OrderSendSync

Olası sorunları azaltmak için her şey özel olarak sınıfa sarılır.

Başvuru

OrderSend (Request, Result); // Все так же, как со штатной OrderSend

Onlar. Tüm OrderSends'leri ticaret ortamıyla senkronize hale getirmek ve tuzaklardan kaçınmak için verilen kaynağı bir mqh dosyası olarak düzenlemek ve programlarınızda uygun #include'u yapmak yeterlidir.

Neden: