OnTradeTransaction işlevi hakkında soru - sayfa 5

 
papaklass :

OnTradeTransaction() bir ticari olay HANDLER'dır. Olaya neyin sebep olduğu önemli değil, önemli olan olayın olmuş olmasıdır.

Belgelerden alıntı:

OrderSend() / OrderSendAsync() TİCARET FONKSİYONLARIDIR.

OnTradeTransaction() için, OrderSend() veya OrderSendAsync() ticaret emri göndermek için hangi işlevi kullandığınızın hiçbir önemi yoktur.

Bu yüzden bir konu oluşturmadan önce bunu defalarca tekrar okudum, ... Bir şey söylemeyeceğim.

Ancak yine de, bir grup işlemi kaybetme olasılığının, bir saniye içinde bir işlemi kaybetme olasılığından daha muhtemel olduğu ve belki de bir (saniye) olmadığı sonucuna varıldı. İşte tam olarak bunu anlamaya çalışıyorum. Bu konuda fikrinizi almaya çalışıyorum . Yeterince nadir ve tek ise bir işlemi kaybetme olasılığı nedir?

 
papaklass :
Olasılık açısından, bilmiyorum.

Michael'ın kendi deneyimine dayanan tek bir görüşü tarafından yönlendirilmemiz gerekecek. Altı ayda bir sipariş yığınından tek bir işlem kaybetmediyse, tek bir siparişin kaybolmayacağını varsayacağız.

Yavaş yavaş ustalaşıyorum, mantığı kırmamaya çalışıyorum, ama bazen birinin diğerine müdahale ettiği ortaya çıkıyor ...

 
AlexeyVik :

Michael'ın kendi deneyimine dayanan tek bir görüşü tarafından yönlendirilmemiz gerekecek. Altı ayda bir sipariş yığınından tek bir işlem kaybetmediyse, tek bir siparişin kaybolmayacağını varsayacağız.

Yavaş yavaş ustalaşıyorum, mantığı kırmamaya çalışıyorum, ama bazen birinin diğerine müdahale ettiği ortaya çıkıyor ...

Alex, kendine basit bir soru sor:

Hangisi daha iyi, her komuttan sonra veya 1 kez veya belki hiç değil , geçmişi araştırmak için siparişi yeniden kontrol edin ( OnTradeTransaction işe yaramadı)?

Kontrolün uygulanması kolay değil (bu arada, örneğimde hatalar var), ancak oldukça gerçekçi, ana ilke şudur - HER siparişin kendi Sihri vardır.

Ve ilerisi. Herkesin kendi yoluna gitmekte özgür olduğunu daha önce söylemiştim...

 
Mikalas :

Alex, kendine basit bir soru sor:

Hangisi daha iyi, her komuttan sonra veya 1 kez veya belki hiç siparişten sonra geçmişi araştırmak, siparişi iki kez kontrol etmek (OnTradeTransaction işe yaramadı)?

Kontrolün uygulanması kolay değil (bu arada, örneğimde hatalar var), ancak oldukça gerçekçi, ana ilke şudur - HER siparişin kendi Sihri vardır.

Ve ilerisi. Herkesin kendi yoluna gitmekte özgür olduğunu daha önce söylemiştim...

Michael, tüm bunları tartışmamı sağlayan bu basit sorunun basit bir cevabıydı. Ve bu fikri atmayacağım. Ancak OrderSend() komutundan sonra veya bekleyenin aktivasyonundan sonra veya stop / take ile pozisyonu kapatırken işlemin kaybolup kaybolmadığını hala çözemiyorum.

İlk cevabınızdan, OrderSendAsync()'in bile işlemleri kaybetmediğini anladım. Bu tür oldukça nadir işlemler için çekin bloke edilmesinin gerekli olup olmadığına karar vermek için bunu anlamaya çalışıyorum. Özellikle seçim göz önüne alındığında.

Tamamen mantıksal olarak, OrderSend () bir yanıt alana kadar tamamlanmazsa, işlem kaybedilemez. Ama gecikmenin aktivasyonu ve pozisyonun kapanması mantığıma uymuyor. Bu durumda işlem MT5 içinde çalışıyorsa, sırasıyla kaybolmaz ve sunucu üzerinden ise ... xs. (Bilmek isterim) Ama sezgisel olarak, sunucunun yürütme hakkında bir yanıt aldığını ve OnTradeTransaction'ı () etkinleştirdiğini düşünüyorum.

 

Beyler, işte böyle bir yanlış anlaşılma çıktı:

Bir pozisyon açarsanız , OnTradeTransaction yalnızca TRADE_TRANSACTION_DEAL_ADD çalışır... Her şey yolunda.

Bir gecikme ayarlarsanız, örneğin SellStop, yalnızca TRADE_TRANSACTION_ORDER_ADD çalışır... Her şey yolundadır.

Ancak hem konumu hem de gecikmeyi koyarsanız, TRADE_TRANSACTION_DEAL_ADD ve iki kez çalışır TRADE_TRANSACTION_ORDER_ADD

nedenmiş?

#include <Trade\Trade.mqh>


double point, FirstOpenPrice, TakeProfit, SecondOpenPrice, MaxPrice , MinPrice, SecondTake;
bool   NewStart;
       
    CTrade Trade;
    MqlTradeResult v_res, v_result;
     MqlTradeTransaction v_Trans;

/*******************Expert initialization function*******************/
int OnInit ()
{
 point = _Digits % 2 == 0 ? _Point : _Point * 10 ;
  NewStart = true ;
   return ( INIT_SUCCEEDED );
} /*******************************************************************/

/************************Expert tick function************************/
void OnTick ()
{
  if (NewStart)
  {
   Trade.PositionOpen( Symbol (), ORDER_TYPE_BUY , 0.1 , SymbolInfoDouble ( _Symbol , SYMBOL_ASK ), 0.0 , 0.0 );
    Trade.SellStop( 0.78 , SymbolInfoDouble ( _Symbol , SYMBOL_BID )- 52 *point, Symbol (), 0.0 , 0.0 , 0 , 0 );
   NewStart = false ;
  }
} /*******************************************************************/

/*********************TradeTransaction function**********************/
void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
{

   ENUM_TRADE_TRANSACTION_TYPE type = ( ENUM_TRADE_TRANSACTION_TYPE )trans.type;
   
   switch (type)
    {
     case TRADE_TRANSACTION_ORDER_ADD :
      {
       Print ( "order add    * Тикет ордера * " , trans.order);
        Print ( "order add    * Объём ордера * " , trans.volume);
       break ;
      }
     case TRADE_TRANSACTION_DEAL_ADD :
      {
       Print ( "deal add    * Тикет сделки * " , trans.deal);
        Print ( "deal add    * Объём сделки * " , trans.volume);
       break ;
      }
     default : break ;
    }

} /*******************************************************************/
 
AlexeyVik :

Beyler, işte böyle bir yanlış anlaşılma çıktı:

Bir pozisyon açarsanız , OnTradeTransaction yalnızca TRADE_TRANSACTION_DEAL_ADD çalışır... Her şey yolunda.

Bir gecikme ayarlarsanız, örneğin SellStop, yalnızca TRADE_TRANSACTION_ORDER_ADD çalışır... Her şey yolundadır.

Ancak hem konumu hem de gecikmeyi koyarsanız, TRADE_TRANSACTION_DEAL_ADD ve iki kez çalışır TRADE_TRANSACTION_ORDER_ADD

nedenmiş?

Bir yerde hata yaptın. Hem birinci hem de ikinci durumda en az iki olay olmalıdır: TRADE_TRANSACTION_ORDER_ADD ve TRADE_TRANSACTION_DEAL_ADD. TRADE_TRANSACTION_ORDER_ADD'yi neden alamadığınız açık değil.

Anahtarı yorumlamaya çalışın ve OnTradeTransaction'da alınan tüm olayların tam günlüğünü görüntüleyin.

 
C-4 :

Bir yerde hata yaptın. Hem birinci hem de ikinci durumda en az iki olay olmalıdır: TRADE_TRANSACTION_ORDER_ADD ve TRADE_TRANSACTION_DEAL_ADD. TRADE_TRANSACTION_ORDER_ADD'yi neden alamadığınız açık değil.

Anahtarı yorumlamaya çalışın ve OnTradeTransaction'da alınan tüm olayların tam günlüğünü görüntüleyin.

Evet denedim tabii. Switch(type) öncesinde boş satır Print(EnumToString(type)); Ve tam olarak tarif ettiğim gibi basıldı.

İşte tekrarlanan deneyler.




 

Kodunuzu kontrol ettim. - Her şey düzgün çalışıyor.

Yakalamak için bir durdurma emri göndermeden seçenek:

2015.02.10 18:32:03.332 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:32:03.331 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

Durdurma emri gönderme seçeneği:

2015.02.10 18:35:59.633 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_UPDATE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD


ps Tam döngü süresi hoş bir sürpriz oldu: 60-70 ms kararlı. Aferin geliştiriciler, iyi iş!
 
C-4 :

Kodunuzu kontrol ettim. - Her şey düzgün çalışıyor.

Yakalamak için bir durdurma emri göndermeden seçenek:

Durdurma emri gönderme seçeneği:

ps Tam döngü süresi hoş bir sürpriz oldu: 60-70 ms kararlı. Aferin geliştiriciler, aferin!

Görünüşe göre bu işlem kaybı ... ve her şeyden önce (belgelerden keserek)

Aynı zamanda bu işlemlerin terminale ulaşma sırası garanti edilmez.

Vasily, bu bir test cihazı mı yoksa bir demo mu? Test cihazından örneklerim var. Test cihazında ve hesapta OnTradeTransaction tetiklenmesi arasında bir fark olup olmadığını merak ediyorum. Her ihtimale karşı kontrol edeceğim.


not; Bir işlemi kaybettikten sonra, OnTradeTransaction işlevinin bir sonraki aktivasyonunda aniden ortaya çıktığı ortaya çıktı.

 
AlexeyVik :

Görünüşe göre bu işlem kaybı ... ve her şeyden önce (belgelerden keserek)

Vasily, bu bir test cihazı mı yoksa bir demo mu? Test cihazından örneklerim var. Test cihazında ve hesapta OnTradeTransaction tetiklenmesi arasında bir fark olup olmadığını merak ediyorum. Her ihtimale karşı kontrol edeceğim.


not; Bir işlemi kaybettikten sonra, OnTradeTransaction işlevinin bir sonraki aktivasyonunda aniden ortaya çıktığı ortaya çıktı.

Hayır, işlemler kaybolmaz, sadece belirli bir sırayla gelmeyebilir.

Yalnızca TRADE_TRANSACTION_REQUEST her zaman önce gelir, aksi takdirde sipariş bileti alamazsınız.

Belgeleri DİKKATLİCE okuyun.

Neden: