OrderSend ile MT5'te nasıl düzgün çalışılır - sayfa 9

 
prostotrader :
https://www.mql5.com/ru/forum/97557/page4#comment_2891988
Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber :

Üzgünüz, ama senaryolarınızla uğraşma arzusu yok

Katma

Ama bir çıkış yolu var

OrderrSend() işlevi eşzamanlı olduğundan, bir sipariş aldıktan sonra,

OnTradeTransaction() içinde geçmişin senkronize edildiğinden emin olun

//+------------------------------------------------------------------+
// Expert TradeTransaction function                                  |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
     switch (trans.type)
     {
       case TRADE_TRANSACTION_ORDER_UPDATE :
         switch (trans.order_state)
           {
             case ORDER_STATE_PLACED :
               if (order_ticket==trans.order)
                 {
                   Print ( __FUNCTION__ , " Order plased done. Ticket = " ,trans.order);
                   if (order_ticket> 0 )
                    {
                     if ( OrderSelect (order_ticket))
                       {
                         //Ордер синхронизирован с историей
                       }
                     else
                       {
                         Print ( __FUNCTION__ , " Order not select! Ticket = " ,trans.order);
                       }
                    }
                   else
                    {
                     Print ( __FUNCTION__ , " Wrong order ticket = " ,trans.order);
                    }
                 }
               break ;
           }
         break ;
     }
  }

Ve dans etmek yok!

 
prostotrader :

Ve dans etmek yok!

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

OrderSend ile MT5'te nasıl düzgün çalışılır

fxsaber , 2016.11.10 10:00

Bunun bir komut dosyası olduğunu ve herhangi bir Event olamayacağını unutmayın . Tek çıkış yolu aptal uyku.

Bu betiği SB kullanarak yeniden yazarsanız hiçbir şey değişmez.

 
fxsaber :
Uykuyu dilediğin gibi saptırabilirsin....
 
prostotrader :
Uykuyu dilediğin gibi saptırabilirsin....

Neden kendilerinin önerdiklerini ve daha önce başkaları tarafından dile getirilenleri tekrarlasınlar?

Konu, OnTradeTransaction ile ilgili olası sorunlar hakkında her şeyi söylüyor. Özellikle, aynı anda birkaç danışmanın çalışması hakkında.

İnsanlar koltuk değneği yapar - bu, belgeleri bilmedikleri ve özellikleri nasıl kullanacaklarını bilmedikleri anlamına gelmez.

OnTrade ve OnTradeTransaction tam olarak yaptıkları şeydir. Ve doğduğunda, geliştiriciler hesapta birden fazla danışmanla aynı anda çalışmanın aptallık olduğuna inanıyorlardı.

Eh, kiminle olmadığı bu puanda yanıldılar.

Aşağıdaki işlevi bir EA'ya yazmayı deneyin

  1. ben = 0.
  2. [i] sembolünde bir pozisyon açın.
  3. i++ >= 5 ise - çıkın.
  4. Yeni pozisyonun kayması yoksa 2. adıma döneriz. Kayma varsa çıkıyoruz.
 
fxsaber :

Neden kendilerinin önerdiklerini ve daha önce başkaları tarafından dile getirilenleri tekrarlasınlar?

Konu, OnTradeTransaction ile ilgili olası sorunlar hakkında her şeyi söylüyor. Özellikle, aynı anda birkaç danışmanın çalışması hakkında.

İnsanlar koltuk değneği yapar - bu, belgeleri bilmedikleri ve özellikleri nasıl kullanacaklarını bilmedikleri anlamına gelmez.

OnTrade ve OnTradeTransaction tam olarak yaptıkları şeydir. Ve doğduğunda, geliştiriciler hesapta birden fazla danışmanla aynı anda çalışmanın aptallık olduğuna inanıyorlardı.

Eh, kiminle olmadığı bu puanda yanıldılar.

Aşağıdaki işlevi bir EA'ya yazmayı deneyin

  1. ben = 0.
  2. [i] sembolünde bir pozisyon açın.
  3. i++ >= 5 ise - çıkın.
  4. Yeni konumda kayma yoksa 2. adıma dönün. Kayma varsa çıkıyoruz.

Şu anda, gerçek hayatta (bir terminalde) çalışan 41 Uzman Danışmanım var, bu da toplamda bir işlem günü için

2000 sipariş açık ve kapalı pozisyon ayarla ve HİÇBİR zorluk yaşamıyorum!

Katma

"Bu şekilde ihtiyacım var" dan değil, işlevsellikten ilerlemek gerekiyor.

Geliştiriciler, mümkünse, istekleri dikkate alarak hataları düzeltir ve eksiklikleri giderir

kullanıcılar (çok yavaş olsa da).

Görünüşe göre OederSend () yakında çözülecek.

 
prostotrader :

Şu anda, gerçek hayatta (bir terminalde) çalışan 41 Uzman Danışmanım var, bu da toplamda bir işlem günü için

2000 sipariş açık ve kapalı pozisyon ayarla ve HİÇBİR zorluk yaşamıyorum!

Konu dışına çıkmak denir.

En basit mantığa bile gelince

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

OrderSend ile MT5'te nasıl düzgün çalışılır

fxsaber , 2016.11.15 13:30

Aşağıdaki işlevi bir EA'ya yazmayı deneyin

  1. ben = 0.
  2. [i] sembolünde bir pozisyon açın.
  3. i++ >= 5 ise - çıkın.
  4. Yeni pozisyonun kayması yoksa 2. adıma döneriz. Kayma varsa çıkıyoruz.
Biri hemen uygulasın
// MQL4&5-code

#property strict

#include <MT4Orders.mqh>     // https://www.mql5.com/ru/code/16006

void Func( const string &Symbols[] )
{
   const int Total = ArraySize (Symbols);
  
   for ( int i = 0 ; i < Total; i++)
  {
     const double Price = SymbolInfoDouble (Symbols[i], SYMBOL_ASK );
     const int digits = ( int ) SymbolInfoInteger (Symbols[i], SYMBOL_DIGITS );
    
     if (! OrderSelect ( OrderSend (Symbols[i], OP_BUY , 1 , Price, 100 , 0 , 0 , DoubleToString (Price, digits)), SELECT_BY_TICKET ) ||
        ( NormalizeDouble (Price - OrderOpenPrice (), digits) != 0 )) // если не получилось открыть или есть проскальзывание - выходим
       break ;
  }
}

void OnStart () // OnTick
{
   const string Symbols[] = { "EURUSD" , "GBPUSD" , "AUDUSD" , "USDCAD" , "USDJPY" };
  
  Func(Symbols);
}

Ve birisi geliştiricilerden cennet gibi mana bekliyor.
 

Dilediğiniz gibi sapıklık yapma hakkınız olduğunu daha önce söylemiştim (herkesin bu hakkı vardır).

 
prostotrader :

Dilediğiniz gibi sapıklık hakkınız olduğunu daha önce söylemiştim (herkesin bu hakkı vardır).

uzun zaman önceydi, ama bu adamı hatırlıyorum, şey, bu - fxsaber harikalar yarattı,

şimdiye kadar, kodları MT4 kod tabanında, WinInet aracılığıyla siteleri okuma kodunda saklanmaktadır.

bugüne kadar birçok programcı tarafından kullanılan...

ve bu nedenle, bana öyle geliyor ki, o sapık değil ...

 
Senkronize OrderSendSync'i buradaki kitaplıktan yırtın
uint OrderSend_MaxPause = 1000000 ; // максимальное время на синхронизацию в мкс.

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

bool Waiting( const bool FlagInit = false )
{
   static ulong StartTime = 0 ;

   if (FlagInit)
    StartTime = :: GetMicrosecondCount ();

   const bool Res = (:: GetMicrosecondCount () - StartTime < OrderSend_MaxPause);

   if (Res)
    :: Sleep ( 0 );

   return (Res);
}

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

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

bool OrderSendSync ( const MqlTradeRequest &Request, MqlTradeResult &Result )
{
   bool Res = :: OrderSend (Request, Result);

   if (Res && !IsTester && (Result.retcode < TRADE_RETCODE_ERROR ) && (OrderSend_MaxPause > 0 ))
  {
    Res = (Result.retcode == TRADE_RETCODE_DONE );
    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(:: HistoryDealSelect (Result.deal))
          ;
    }
     else if (Request.action == TRADE_ACTION_PENDING )
    {
       if (Res)
        WHILE(:: OrderSelect (Result.order))
          ;
       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 = EqualPrices(:: PositionGetDouble ( POSITION_SL ), Request.sl, digits);
          EqualTP = EqualPrices(:: PositionGetDouble ( POSITION_TP ), Request.tp, digits);
        }

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

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

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

        WHILE((EqualSL && EqualTP))
           if (:: OrderSelect (Result.order))
          {
            EqualSL = EqualPrices(:: OrderGetDouble ( ORDER_SL ), Request.sl, digits);
            EqualTP = EqualPrices(:: OrderGetDouble ( ORDER_TP ), Request.tp, digits);
          }
      }
    }
     else if (Request.action == TRADE_ACTION_REMOVE )
       if (Res)
        WHILE(:: HistoryOrderSelect (Result.order))
          ;
  }

   return (Res);
}

#undef WHILE
Kodun arkasındaki fikir açık olmalıdır. Belki bir şey dikkate alınmamıştır. Çalışmamda herhangi bir hata görmedim.