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

 
Başka bir hatayı çoğaltmak. Güncel fiyattan limit emri veriyoruz ve kademeli olarak dolmasını izliyoruz. Her adımda tüm pozisyonların ve siparişlerin toplam lotunu kontrol ediyoruz. Değiştirilmemelidir - OrderSend'de gönderilene eşit.
 // Демонстрация потери данных во время торговли.

template < typename T>
T MyPrint( const T Value, const string Str )
{
   Print (Str + " = " + ( string )Value);

   return (Value);
}

#define _P(A) MyPrint(A, ": " + #A)

sinput double inLots = 100 ;

int OnInit ()
{
   MqlTradeResult Result = { 0 };
   MqlTradeRequest Request = { 0 };
  
  Request.action = TRADE_ACTION_PENDING ;
  Request.symbol = _Symbol ;
  Request.volume = inLots;
  Request.price = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
  Request.type = ORDER_TYPE_BUY_LIMIT ;
  
   return ( OrdersTotal () || PositionsTotal () || ! OrderSend (Request, Result)); // Работаем, когда ничего не открыто.
}

// Возвращает сумму лотов всех позиций и ордеров.
double GetSumLots()
{
   double Lots = 0 ;
  
   for ( int i = _P( OrdersTotal ()) - 1 ; i >= 0 ; i--)
     if (_P( OrderGetTicket (_P(i))))
      Lots += _P( OrderGetDouble ( ORDER_VOLUME_CURRENT ));
    
   for ( int i = _P( PositionsTotal ()) - 1 ; i >= 0 ; i--)
     if (_P( PositionGetTicket (_P(i))))
      Lots += _P( PositionGetDouble ( POSITION_VOLUME ));

   return (Lots);
}

void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
{
   Print ( "---------" );
    
   // Проверяем, что сумма лотов всех позиций и ордеров совпадает с заданной.
   if ( NormalizeDouble (_P(GetSumLots()) - inLots, _Digits ))
     Alert ( "BUG!" );
}


Sonuç.

 2020.08 . 21 01 : 18 : 13.375 : OrdersTotal () = 1
2020.08 . 21 01 : 18 : 13.375 : i = 0
2020.08 . 21 01 : 18 : 13.375 : OrderGetTicket (MyPrint(i,: +i)) = 1197440
2020.08 . 21 01 : 18 : 13.375 : OrderGetDouble ( ORDER_VOLUME_CURRENT ) = 68.59999999999999
2020.08 . 21 01 : 18 : 13.375 : PositionsTotal () = 1
2020.08 . 21 01 : 18 : 13.375 : i = 0
2020.08 . 21 01 : 18 : 13.375 : PositionGetTicket (MyPrint(i,: +i)) = 1197440
2020.08 . 21 01 : 18 : 13.375 : PositionGetDouble ( POSITION_VOLUME ) = 31.4
2020.08 . 21 01 : 18 : 13.375 : GetSumLots() = 100.0
2020.08 . 21 01 : 18 : 13.377 ---------
2020.08 . 21 01 : 18 : 13.377 : OrdersTotal () = 1
2020.08 . 21 01 : 18 : 13.377 : i = 0
2020.08 . 21 01 : 18 : 13.377 : OrderGetTicket (MyPrint(i,: +i)) = 1197440
2020.08 . 21 01 : 18 : 13.377 : OrderGetDouble ( ORDER_VOLUME_CURRENT ) = 68.59999999999999
2020.08 . 21 01 : 18 : 13.377 : PositionsTotal () = 1
2020.08 . 21 01 : 18 : 13.377 : i = 0
2020.08 . 21 01 : 18 : 13.377 : PositionGetTicket (MyPrint(i,: +i)) = 1197440
2020.08 . 21 01 : 18 : 13.377 : PositionGetDouble ( POSITION_VOLUME ) = 31.4
2020.08 . 21 01 : 18 : 13.377 : GetSumLots() = 100.0
2020.08 . 21 01 : 18 : 13.389 ---------
2020.08 . 21 01 : 18 : 13.389 : OrdersTotal () = 1
2020.08 . 21 01 : 18 : 13.389 : i = 0
2020.08 . 21 01 : 18 : 13.389 : OrderGetTicket (MyPrint(i,: +i)) = 1197440
2020.08 . 21 01 : 18 : 13.389 : OrderGetDouble ( ORDER_VOLUME_CURRENT ) = 41.4
2020.08 . 21 01 : 18 : 13.389 : PositionsTotal () = 1
2020.08 . 21 01 : 18 : 13.389 : i = 0
2020.08 . 21 01 : 18 : 13.389 : PositionGetTicket (MyPrint(i,: +i)) = 1197440
2020.08 . 21 01 : 18 : 13.389 : PositionGetDouble ( POSITION_VOLUME ) = 31.4
2020.08 . 21 01 : 18 : 13.389 : GetSumLots() = 72.8
2020.08 . 21 01 : 18 : 13.389 Alert : BUG!
2020.08 . 21 01 : 18 : 13.389 ---------
2020.08 . 21 01 : 18 : 13.389 : OrdersTotal () = 1
2020.08 . 21 01 : 18 : 13.389 : i = 0
2020.08 . 21 01 : 18 : 13.389 : OrderGetTicket (MyPrint(i,: +i)) = 1197440
2020.08 . 21 01 : 18 : 13.389 : OrderGetDouble ( ORDER_VOLUME_CURRENT ) = 41.4
2020.08 . 21 01 : 18 : 13.389 : PositionsTotal () = 1
2020.08 . 21 01 : 18 : 13.389 : i = 0
2020.08 . 21 01 : 18 : 13.389 : PositionGetTicket (MyPrint(i,: +i)) = 1197440
2020.08 . 21 01 : 18 : 13.389 : PositionGetDouble ( POSITION_VOLUME ) = 31.4
2020.08 . 21 01 : 18 : 13.389 : GetSumLots() = 72.8
2020.08 . 21 01 : 18 : 13.389 Alert : BUG!
2020.08 . 21 01 : 18 : 13.389 ---------
2020.08 . 21 01 : 18 : 13.389 : OrdersTotal () = 1
2020.08 . 21 01 : 18 : 13.389 : i = 0
2020.08 . 21 01 : 18 : 13.389 : OrderGetTicket (MyPrint(i,: +i)) = 1197440
2020.08 . 21 01 : 18 : 13.389 : OrderGetDouble ( ORDER_VOLUME_CURRENT ) = 41.4
2020.08 . 21 01 : 18 : 13.389 : PositionsTotal () = 1
2020.08 . 21 01 : 18 : 13.389 : i = 0
2020.08 . 21 01 : 18 : 13.389 : PositionGetTicket (MyPrint(i,: +i)) = 1197440
2020.08 . 21 01 : 18 : 13.389 : PositionGetDouble ( POSITION_VOLUME ) = 31.4
2020.08 . 21 01 : 18 : 13.389 : GetSumLots() = 72.8
2020.08 . 21 01 : 18 : 13.389 Alert : BUG!
2020.08 . 21 01 : 18 : 13.389 ---------
2020.08 . 21 01 : 18 : 13.389 : OrdersTotal () = 1
2020.08 . 21 01 : 18 : 13.389 : i = 0
2020.08 . 21 01 : 18 : 13.389 : OrderGetTicket (MyPrint(i,: +i)) = 1197440
2020.08 . 21 01 : 18 : 13.389 : OrderGetDouble ( ORDER_VOLUME_CURRENT ) = 41.4
2020.08 . 21 01 : 18 : 13.389 : PositionsTotal () = 1
2020.08 . 21 01 : 18 : 13.389 : i = 0
2020.08 . 21 01 : 18 : 13.389 : PositionGetTicket (MyPrint(i,: +i)) = 1197440
2020.08 . 21 01 : 18 : 13.390 : PositionGetDouble ( POSITION_VOLUME ) = 58.6
2020.08 . 21 01 : 18 : 13.390 : GetSumLots() = 100.0

100 lot koyduk, ancak bir noktada 72.8 lot vardı. Açıkçası, böyle bir durumda, ticaret algoritması şaşırabilir.

Arama dizisi : Oshibka 011.
 

fxsaber :
Он должен быть неизменным - равным тому, что был отправлен в OrderSend.

aslında hayır senkrondan çıkma ihtimali var o da oluyor baypas edebilirsiniz çok basit bir çözümü yok

 
Andrei Trukhanovich :

aslında hayır senkrondan çıkma ihtimali var o da oluyor baypas edebilirsiniz çok basit bir çözümü yok

Zor bir çözümüm bile yok. Çalışan bazı komut dosyalarında bir senkronizasyonsuzluk olduğundan nasıl emin olunacağı hiç açık değil.

 
fxsaber :

Zor bir çözümüm bile yok. Çalışan bazı komut dosyalarında bir senkronizasyonsuzluk olduğundan nasıl emin olunacağı hiç açık değil.

toplam lot değiştiyse, siparişler ve pozisyonlar için lotlar iki kez aynı olana kadar sayımı çalıştırın. olduklarında - bu senkronize bir durumdur.

bir kesrin veya yüzde biriminin senkronizasyonunu bozma olasılığı, böylece performansı pek etkilemez.

__________

baskılarınıza baktınız, belki bug, senkron değilse hatalı miktar birkaç hesaplamada aynı şekilde tekrarlanmamalı

 
Andrei Trukhanovich :

toplam lot değiştiyse, siparişler ve pozisyonlar için lotlar iki kez aynı olana kadar sayımı çalıştırın. olduklarında - bu senkronize bir durumdur.

bir kesrin veya yüzde biriminin senkronizasyonunu bozma olasılığı, böylece performansı pek etkilemez.

Yukarıdaki günlükte, ardışık üç hesaplama yanlış sonucu gösteriyor. Uykuya ihtiyaç vardır, ancak bu, bir ticaret emri vermek için tepki vermek için zamanınız olmadığında gecikmelerle doludur.

Hoş olmayan durum.

 
fxsaber :

Yukarıdaki günlükte, ardışık üç hesaplama yanlış sonucu gösteriyor.

evet gördüm yukarıdan ekledim

 
 
Alexey Viktorov :

Boşuna kırgınsın. En büyük olasılık, koddaki bir hatadır. İkinci sırada gök yüksek bir yayılma var. Ama sen hariç kim ilk seçeneği atabilir ve kodu görmeden ikincisini düşünmeye başlayabilir. Evet ve yanlış konu seçmişsiniz, umarım moderatörler bunu aktarır.

Doğru cevap için teşekkürler. Kırgın değilim, üzgünüm))). Bununla karşılaşan birinin zaten sahip olabileceği hızlı bir çözüm bulmaya çalışmak için yazdım. Kod kesinlikle standarttır, toplam kar döngüsünü özetler ve belirli bir değerle karşılaştırır, özellikle kod birkaç aydır hatasız iki farklı hesapta çalıştığından. İyi günler.

 
Evgeny Vlasov :

Doğru cevap için teşekkürler. Kırgın değilim, üzgünüm))). Bununla karşılaşan birinin zaten sahip olabileceği hızlı bir çözüm bulmaya çalışmak için yazdım. Kod kesinlikle standarttır, toplam kar döngüsünü özetler ve belirli bir değerle karşılaştırır, özellikle kod birkaç aydır hatasız iki farklı hesapta çalıştığından. İyi günler.

Özellikler için konu dışı.
 
Artyom Trishkin :
Özellikler için konu dışı.

Kabul ediyorum.

Neden: