MetaEditor yapı 1490 - sayfa 3

 
fxsaber :
Evet, belirlenemez. SL ve TP, yalnızca MT sunucusunun özüdür.
En güvenilir yol (gerçi aracı yorum biçimini değiştirmezse ve bu olası olmayan bir olaydır).
 

Bu nasıl çalışır:

void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   if (trans.type== TRADE_TRANSACTION_DEAL_ADD )
     {
       datetime end= TimeCurrent ();
       datetime start=end-end% PeriodSeconds ( PERIOD_D1 );
       ResetLastError ();
       if (! HistorySelect (start,end))
        {
         Print ( "Getting deals history failed. Error " , GetLastError ());
         return ;
        }
       ulong ticket= HistoryDealGetTicket ( HistoryDealsTotal ()- 1 );
       if (ticket==trans.deal)
        {
         if ( HistoryDealGetInteger (ticket, DEAL_ENTRY )== DEAL_ENTRY_OUT &&
            ( StringFind ( HistoryDealGetString (ticket, DEAL_COMMENT ), "tp" )!=- 1
            || StringFind ( HistoryDealGetString (ticket, DEAL_COMMENT ), "sl" )!=- 1 ))
           {
             Print ( HistoryDealGetString (ticket, DEAL_SYMBOL ), "  Profit= " , HistoryDealGetDouble (ticket, DEAL_PROFIT ), "  ticket=" ,ticket);
           }
        }
     }
  }
 
Gerçek çalışan sürüm (test cihazı için değil)
void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest &Request, const MqlTradeResult &Result )
{
   if ((Trans.type == TRADE_TRANSACTION_ORDER_ADD ) &&
       PositionSelectByTicket (Trans.position) && OrderSelect (Trans.order) &&
       ( PositionGetInteger ( POSITION_TYPE ) == 1 - OrderGetInteger ( ORDER_TYPE )))
  {
     const double Price = OrderGetDouble ( ORDER_PRICE_OPEN );
    
     if (Price == PositionGetDouble ( POSITION_TP ))
       Print ( "Position #" + ( string )Trans.position + " - triggered TP." );    
     else if (Price == PositionGetDouble ( POSITION_SL ))
       Print ( "Position #" + ( string )Trans.position + " - triggered SL." );    
  }
}
 
fxsaber :
Gerçek çalışan sürüm (test cihazı için değil)
void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest &Request, const MqlTradeResult &Result )
{
   if ((Trans.type == TRADE_TRANSACTION_ORDER_ADD ) &&
       PositionSelectByTicket (Trans.position) && OrderSelect (Trans.order) &&
       ( PositionGetInteger ( POSITION_TYPE ) == 1 - OrderGetInteger ( ORDER_TYPE )))
  {
     const double Price = OrderGetDouble ( ORDER_PRICE_OPEN );
    
     if (Price == PositionGetDouble ( POSITION_TP ))
       Print ( "Position #" + ( string )Trans.position + " - triggered TP." );    
     else if (Price == PositionGetDouble ( POSITION_SL ))
       Print ( "Position #" + ( string )Trans.position + " - triggered SL." );    
  }
}
Test cihazında kontrol ettim - çalışmıyor, bence gerçek hayatta da çalışmayacak, çünkü kontrolün yapıldığı pozisyon artık mevcut değil.
 
Andrey Dik :
Test cihazında kontrol ettim - çalışmıyor, bence gerçek hayatta da çalışmayacak, çünkü kontrolün yapıldığı pozisyon artık mevcut değil.
Bu, test cihazında yapılan yapay bir hatadır (hiç yavaşlamaması için). Sadece mantıksal olarak her şey doğru.
 
void OnTick ()
{
   string s = DoubleToString (PosTotalCommissSwap ( Symbol (), true , true ), 4 );
  
   Comment (s);
}
//+------------------------------------------------------------------+


// Подсчет комиссий и свопов указанной позиции по символу
double PosTotalCommissSwap ( string symb, bool commiss, bool swap)
{
   int posTotal = PositionsTotal (); //всего открытых позиций
   Print (posTotal);
  
   //пройдем по всем открытым позициям
   for ( int i = posTotal - 1 ; i >= 0 ; i--)
  {
     string posSymb = PositionGetSymbol (i);
     Print (posSymb);
    
     //если найдена позиция по указанному символу
     if (symb == posSymb)
    {
       Print ( "Позиция найдена" );
       long posID  = PositionGetInteger ( POSITION_IDENTIFIER );
      
       //выберем историю сделок, относящуюся к выбранной позиции
       if ( HistorySelectByPosition (posID))
      {
         int dealsTotal = HistoryDealsTotal ();   //всего сделок в истории позиции
         Print ( "Всего сделок в позиции: " + dealsTotal);
         double fees = 0.0 ; //все комиссии и свопы
        
         //пройдем по всем сделкам позиции
         for ( int k = 0 ; k < dealsTotal; k++)
        {
           ulong dealTicket = HistoryDealGetTicket (k); //тикет сделки
          
           if (commiss)
            fees += HistoryDealGetDouble (dealTicket, DEAL_COMMISSION );
            
           if (swap)
            fees += HistoryDealGetDouble (dealTicket, DEAL_SWAP );
        }
        
         return (fees);
      }
       else
         Print ( "Историю сделок выбрать не удалось" );
    }
  }
  
   return ( 0.0 );
}

Konum kimliğine göre işlem geçmişi seçimi bozuldu gibi görünüyor.

Baskı bazen (ve bazen değil) yazar

2016.12.05 11:26:11.767 Mevcut pos komisyonunu alın (GBPUSD,M5) 1

2016.12.05 11:26:11.767 Mevcut pos komisyonunu alın (GBPUSD,M5) GBPUSD

2016.12.05 11:26:11.767 Mevcut pos komisyonunu alın (GBPUSD,M5) Konum bulundu

2016.12.05 11:26:11.767 Mevcut pos komisyonunu alın (GBPUSD,M5) Pozisyondaki toplam fırsatlar: 0


Açıkça yalan, pozisyon hala olduğu gibi!
 
Andrey Dik :

Konum kimliğine göre işlem geçmişi seçimi bozuldu gibi görünüyor.

Bu, OrderSend'den sonra olursa, sorun değil.
 
fxsaber :
Bu, OrderSend'den sonra olursa, sorun değil.
Hayır, hiç normal değil. Her durumda, bir pozisyon var, yani "hayatına" katılan işlemler var. Ama daha da tuhafı, zaten bir pozisyonun varlığında danışmanı atsanız bile kodun anlaşmayı görmemesi, loglardan gördüğümüz budur , pozisyon sayısı belirlenir, sembol ile pozisyon seçilir, ama pazarlık yok...
 
Andrey Dik :
Hayır, hiç normal değil. Her durumda, bir pozisyon var, yani "hayatına" katılan işlemler var. Ama daha da tuhafı, zaten bir pozisyonun varlığında danışmanı atsanız bile kodun işlemi görmemesi...
Renat sorun olmadığını söylüyor, tartışma! İşte OrderSend için çözüm

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.19 23:59

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.

Bu OrderSend'i kullanırsanız, böyle bir sorun olmayacaktır.

Veya OnTradeTransaction'da ilgili mesajları bekleyin.

 
fxsaber :
Renat sorun olmadığını söylüyor, tartışma! İşte OrderSend için çözüm

Bu OrderSend'i kullanırsanız, böyle bir sorun olmayacaktır.

Veya OnTradeTransaction'da ilgili mesajları bekleyin.

Hayır, normal değil.

Bir pozisyon var. Danışmanı grafiğe atıyoruz. Seçilen pozisyon için ticaret geçmişi yok . Burada normal olan nedir?