"Yüzer" PositionSelect() hatası - sayfa 4

 
prostotrader :

Bir kez daha "adaylar", "doktorlar", "profesörler" ve "akademisyenler" için.

OnTradeTransaction()'a gelen herhangi bir olay kaybolabilir

Bu nedenle, TRADE_TRANSACTION_HISTORY_ADD önemli olayının gelmesinden sonra bunu bir hata olarak görüyorum.

terminaldeki konumla ilgili veriler güncellenmez!

Yardımda ( https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction ):

Terminalden manuel olarak veya OrderSend() / OrderSendAsync() ticaret işlevleri aracılığıyla gönderilen bir ticaret talebi, ticaret sunucusunda birkaç ardışık ticaret işlemi oluşturabilir. Aynı zamanda, bu işlemlerin terminalde alınma sırası garanti edilmez, bu nedenle alım satım algoritmanızı, bazı alım satım işlemlerinin diğerlerinin gelmesinden sonra alınması beklentisi üzerine kuramazsınız. Ayrıca sunucudan terminale teslimat sırasında işlemler kaybolabilir.

Bu nedenle, bu işleve neden ihtiyaç duyulduğu açık değildir. Sadece kullanmak zorunda değilsin, hepsi bu. Siparişlerin ve işlemlerin geçmişini bağımsız olarak analiz etmek gerekir.

 
Dmitry Fedoseev :

Yardımda ( https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction ):

Bu nedenle, bu işleve neden ihtiyaç duyulduğu açık değildir. Sadece kullanmak zorunda değilsin, hepsi bu. Siparişlerin ve işlemlerin geçmişini bağımsız olarak analiz etmek gerekir.

Teşekkür ederim. Ayrıca diğer tüm fonksiyonları kullanamazsınız :) (suç yok)
 

Emirlere, pozisyonlara ve anlaşmalara gelince.

Yardımda yazıldığı gibi - işlemlerin sırası garanti edilmez - tarihe bir emir aktarma işlemi, işlem işleminden daha önce alınabilir.
Terminalde pozisyonun değiştirilmesi kesinlikle sırasıyla bir anlaşma işleminin alınması sonucu gerçekleşir, bunun alınması pozisyonun değiştiğinin garantisidir.
Bir emir transfer işleminin geçmişe alınması, sadece emrin aktif (açık) olmaktan çıktığını ve emir geçmişine aktarıldığını garanti eder.


Кроме того, транзакции могут потеряться при доставке от сервера к терминалу.

Bu cümleye gelince.

Görünüşe göre, asenkron ticaret ile terminalin ilk sürümlerinden birinin belgelerinde kaldı. Yakında kaldıracağız. Suçlu vurulacak.

 
MQ Alexander :

Emirlere, pozisyonlara ve anlaşmalara gelince.

Yardımda yazıldığı gibi - işlemlerin sırası garanti edilmez - tarihe bir emir aktarma işlemi, işlem işleminden daha önce alınabilir.
Terminalde pozisyonun değiştirilmesi kesinlikle sırasıyla bir anlaşma işleminin alınması sonucu gerçekleşir, bunun alınması pozisyonun değiştiğinin garantisidir.
Bir emir transfer işleminin geçmişe alınması, sadece emrin aktif (açık) olmaktan çıktığını ve emir geçmişine aktarıldığını garanti eder.


Bu cümleye gelince.

Görünüşe göre, asenkron ticaret ile terminalin ilk sürümlerinden birinin belgelerinde kaldı. Yakında kaldıracağız. Suçlu vurulacak.

Çok teşekkürler!

Ve infazda yer almam için bana bir makineli tüfek (en kötü ihtimalle allık) verir misin? :)

 

M.Q.İskender!

İşlemler ve pozisyonlar hakkında daha kapsamlı bir açıklama almak istiyorum.

Çünkü SİZ şunu yazdınız:

 Изменение позиции в терминале происходит строго в результате получения сделочной транзакции, соответственно её получение является гарантией того что позиция поменялась.

Ve aslında şu ortaya çıkıyor:

Test uzmanı derleme 1375 demo açılışı (2 kez başlatıldı)

 //+------------------------------------------------------------------+
//|                                              Test_deff_order.mq5 |
//|                                                   Copyright 2016 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016"
#property link        "https://www.mql5.com"
#property version    "1.00"
//
uint   order_req_id;
ulong order_ticket;
ulong magic= 987142563 ;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   OrderPlace();
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
  {
     switch ( trans.type )
    {
       case TRADE_TRANSACTION_REQUEST :
         if ((order_req_id > 0 ) && (order_req_id==result.request_id))
        {
           if (result.retcode== TRADE_RETCODE_PLACED ) order_ticket=result.order;
        }
       break ;
       case TRADE_TRANSACTION_DEAL_ADD :
         if ((order_ticket!= 0 ) && (trans.order==order_ticket))
        {
         Print ( "Deal done. Ticket: " ,trans.order);
        }
       break ;
       case TRADE_TRANSACTION_HISTORY_ADD :
         if ((order_ticket!= 0 ) && (trans.order==order_ticket))
        {
         Print ( "History done. Ticket: " ,order_ticket);
         if ( HistoryOrderSelect (order_ticket))
         {
           double vol_cur = HistoryOrderGetDouble (order_ticket, ORDER_VOLUME_CURRENT );
           double vol_init = HistoryOrderGetDouble (order_ticket, ORDER_VOLUME_INITIAL );
           datetime time_setup= datetime ( HistoryOrderGetInteger (order_ticket, ORDER_TIME_SETUP ));
           double deals_vol = GetDealsVolume( Symbol (),order_ticket,time_setup);
           Print ( "Volume initial: " ,vol_init, " Volume current: " ,vol_cur, " Deals done: " ,deals_vol);
           if ( PositionSelect ( Symbol ()))
           {
             Print ( "Position exists." );
           }
           else
           {
             Print ( "Position NOT exists." );
           }
         }
        }
       break ;
    }
  }
///----
double GetDealsVolume( const string a_symbol, const ulong a_ticket, const datetime start)
  {
   double volume= 0 ;
   if ( HistorySelect (start- 180 , TimeTradeServer ()+ 180 ))
     {
       int deals= HistoryDealsTotal ();
       if (deals> 0 )
        {
         for ( int i=deals- 1 ; i>= 0 ; i--)
           {
             ulong deal_ticket= HistoryDealGetTicket (i);
             ulong ticket= ulong ( HistoryDealGetInteger (deal_ticket, DEAL_ORDER ));
             if (( ticket> 0 ) && (ticket==a_ticket))
              {
               volume+= HistoryDealGetDouble (deal_ticket, DEAL_VOLUME );
              }
           }
        }
     }
   return ( volume );
  } 
//---
//+------------------------------------------------------------------+
//| Place order                                                      |
//+------------------------------------------------------------------+
void OrderPlace()
{
   ResetLastError ();
   MqlTradeRequest request={ 0 };
   MqlTradeResult   result={ 0 };
  order_ticket= 0 ;
  order_req_id= 0 ;
    
//--- Fill structure
  request.action= TRADE_ACTION_DEAL ; //PENDING;
  request.magic=magic;
  request.symbol= Symbol ();
  request.volume= 1 ;
   double step= SymbolInfoDouble ( Symbol (), SYMBOL_TRADE_TICK_SIZE ); 
  request.price= 0 ; //SymbolInfoDouble(Symbol(), SYMBOL_ASK);//-step;
  request.type = ORDER_TYPE_BUY ; //BUY_LIMIT;
  request.comment = "" ;      
  request.type_filling = ORDER_FILLING_IOC ; ///
  request.type_time = ORDER_TIME_DAY ;
   if ( OrderSendAsync (request, result))
  {
     if (result.retcode== TRADE_RETCODE_PLACED ) 
    {
      order_req_id=result.request_id;
    }
     else
    {
       Print ( __FUNCTION__ , ": Error! Retcode: " , GetLastError ());
    }
  }
   else
  {
     Print ( __FUNCTION__ , ": Order not sent!" );
  }
}   
//+------------------------------------------------------------------+

Ve işte sonuçlar:

Her iki seferde de TRADE_TRANSACTION_HISTORY_ADD işlemi önce geldi, ancak

ilk durumda pozisyon yoktu, ama ikinci durumda vardı!

Bu nasıl anlaşılır ?

Terminal günlüğünü sabitlemeyi unuttum:

 2016.08 . 15 15 : 37 : 14.935 Experts expert Test_deff_order (GAZR- 9.16 ,M1) loaded successfully
2016.08 . 15 15 : 37 : 17.694 Trades   '1007932' : exchange buy 1.00 GAZR- 9.16 at market
2016.08 . 15 15 : 37 : 17.702 Trades   '1007932' : exchange buy 1.00 GAZR- 9.16 at market placed for execution in 8 ms
2016.08 . 15 15 : 37 : 17.721 Trades   '1007932' : deal # 7487011 buy 1.00 GAZR- 9.16 at 13897 done (based on order # 50942179 )
2016.08 . 15 15 : 37 : 46.456 Trades   '1007932' : exchange sell 1.00 GAZR- 9.16 at market, close # 50942179 buy 1.00 GAZR- 9.16 13897
2016.08 . 15 15 : 37 : 46.463 Trades   '1007932' : exchange sell 1.00 GAZR- 9.16 at market, close # 50942179 buy 1.00 GAZR- 9.16 13897 placed for execution in 7 ms
2016.08 . 15 15 : 37 : 46.497 Trades   '1007932' : deal # 7487015 sell 1.00 GAZR- 9.16 at 13892 done (based on order # 50942187 )
2016.08 . 15 15 : 37 : 50.348 Experts expert Test_deff_order (GAZR- 9.16 ,M1) removed
2016.08 . 15 15 : 37 : 51.845 Experts expert Test_deff_order (GAZR- 9.16 ,M1) loaded successfully
2016.08 . 15 15 : 37 : 53.776 Trades   '1007932' : exchange buy 1.00 GAZR- 9.16 at market
2016.08 . 15 15 : 37 : 53.786 Trades   '1007932' : exchange buy 1.00 GAZR- 9.16 at market placed for execution in 9 ms
2016.08 . 15 15 : 37 : 53.807 Trades   '1007932' : deal # 7487017 buy 1.00 GAZR- 9.16 at 13898 done (based on order # 50942195 )
2016.08 . 15 15 : 37 : 58.632 Trades   '1007932' : exchange sell 1.00 GAZR- 9.16 at market, close # 50942195 buy 1.00 GAZR- 9.16 13898
2016.08 . 15 15 : 37 : 58.639 Trades   '1007932' : exchange sell 1.00 GAZR- 9.16 at market, close # 50942195 buy 1.00 GAZR- 9.16 13898 placed for execution in 7 ms
2016.08 . 15 15 : 37 : 58.664 Trades   '1007932' : deal # 7487020 sell 1.00 GAZR- 9.16 at 13892 done (based on order # 50942197 )
2016.08 . 15 15 : 41 : 52.483 Experts expert Test_deff_order (GAZR- 9.16 ,M1) removed
 

prostotrader , ama sana samimi bir soru sormama izin ver. Neden tarihi emirleri bu kadar çok seviyorsunuz ve anlaşmaları sevmiyorsunuz? :-))

MQ Alexander dedi ki:

Что касается ордеров, позиций и сделок.

Yardımda yazıldığı gibi - işlemlerin sırası garanti edilmez - tarihe bir emir aktarma işlemi, işlem işleminden daha önce alınabilir.
Terminaldeki pozisyonun değiştirilmesi, kesinlikle bir işlem işleminin alınmasının bir sonucu olarak gerçekleşir, sırasıyla, alınması pozisyonun değiştiğine dair bir garantidir.
Bir emir transfer işleminin geçmişe alınması, sadece emrin aktif (açık) olmaktan çıktığını ve emir geçmişine aktarıldığını garanti eder.

Ve senin durumunda

 case TRADE_TRANSACTION_DEAL_ADD


neredeyse boş...

Ve başka bir lirik açıklama. MT5 kavramına göre, tarihsel bir düzenin varlığı, bir tür alım satım işlemi yapılmaya çalışıldığı gerçeğini yansıtmaktadır. Ve bunun yapıldığı gerçeği değil. Ve öğrenmek için anlaşmaya dönmeniz gerekiyor. Zaten bir ticaret işleminin sonucunu yansıtıyor. O zaman kodunuzdaki fırsatlarla uğraşmak daha mantıklı ...

 
Dennis Kirichenko :

prostotrader , ama sana samimi bir soru sormama izin ver. Neden tarihi emirleri bu kadar çok seviyorsunuz ve anlaşmaları sevmiyorsunuz? :-))

MQ Alexander dedi ki:

Ve senin durumunda


neredeyse boş...

Samimi sorunuzu cevaplıyorum.

Muhtemelen FOREX'te çalışıyorsunuz ve bir siparişle ilgileniyorsunuz,

bu nedenle, ısrarla anlamadığınız bir soruna "tırmanıyorsunuz".

Arabada iki direksiyon simidi ve iki sürücü olduğunu ve her ikisinin de sadece arabaya baktığını hayal edin.

yol. 1. sürücü ikinci sürücünün direksiyonu çevirdiğini nasıl biliyor (sağa diyelim)?

Ve daha yakından bakın:

Tüm ilkel mantığınız bir piyasa emrinin uygulanmasına dayanıyor, yani,

Hala limitli ve bekleyen emirler olduğunu dikkatinize sunarım.

tamamen değil, kısmen yapılabilir.

 
prostotrader :

Ve daha yakından bakın:

Ve orada ne görmeliyim?

TRADE_TRANSACTION_HISTORY_ADD durumunda yanlışlıkla pozisyon bilgisi aldığınızı anlıyor musunuz?

Ve bu size zaten söylendi...
 

prostotrader :

Tüm ilkel mantığınız bir piyasa emrinin uygulanmasına dayanıyor, yani,

Hala limitli ve bekleyen emirler olduğunu dikkatinize sunarım.

tamamen değil, kısmen yapılabilir.

Bebeğim, benim ilkel mantığımı yargılamak sana düşmez...
 
Dennis Kirichenko :
Bebeğim, benim ilkel mantığımı yargılamak sana düşmez...

Ve kim yargılayacak?

Yeteneklerini açıklamalarınla değerlendiriyorum!

resim çok çirkin :(

Yani "profesör" daha anlaşılır mı?

Ve MQ Alexander'ın bundan sorumlu olarak seni görevlendirdiğini hatırlamıyorum.