MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1110

 
if ( OrderSelect (ticket, SELECT_BY_TICKET)){
       double lots;
       string symbol = OrderSymbol(); 
       while ( true ){
         RefreshRates();
         double price;
         parseClosePrice(OrderType(), symbol, price);
         if (OrderClose(OrderTicket(), OrderLots(), price, 500 )){
             break ;
         } else {
             Print ( GetLastError ());
         }              
         Sleep ( 1000 );
      }   

Bazen 4108 hatası veriyor - OrderClose için yanlış bilet. OrderTicket(), OrderSelect'teki biletle eşleşmiyor olabilir mi? Bilet değişkeni sıfır olabilir.

Hatayı yeniden oluşturmam uzun zaman alıyor, sorması daha kolay.
 
Dmitri Custurov :

Bazen 4108 hatası veriyor - OrderClose için yanlış bilet. OrderTicket(), OrderSelect'teki biletle eşleşmiyor olabilir mi? Bilet değişkeni sıfır olabilir.

Hatayı yeniden oluşturmam uzun zaman alıyor, sorması daha kolay.

Biletle bir sipariş seçersiniz . Seçilen siparişin zaten kapalı olmadığından emin misiniz? Ama aynı zamanda tekrar kapatmaya çalışıyorsunuz... Bilette başarılı bir seçim yaptıktan sonra kapanış saatini kontrol edin.

 
Artyom Trishkin :

Biletle bir sipariş seçersiniz . Seçilen siparişin zaten kapalı olmadığından emin misiniz? Ama aynı zamanda tekrar kapatmaya çalışıyorsunuz... Bilette başarılı bir seçim yaptıktan sonra kapanış saatini kontrol edin.

Hatayı yeniden oluşturduğumda kontrol edeceğim. Global değişkenlerdeki tüm biletlerim saklanıyor. Sipariş kapatıldığında, silinirler. OrderSelect() bileti global değişkenlerden alınmadan önce. Değişkenlerde bilet yoksa bu değişken 0 olur, bu da siparişin seçilmemesi gerektiği anlamına gelir ve OrderSelect() false döndürür. Ama evet, kontrol etmeye değer. Teşekkür ederim.

 
Dmitri Custurov :

Hatayı yeniden oluşturduğumda kontrol edeceğim. Global değişkenlerdeki tüm biletlerim saklanıyor. Sipariş kapatıldığında, silinirler. OrderSelect() bileti global değişkenlerden alınmadan önce. Değişkenlerde bilet yoksa bu değişken 0 olur, bu da siparişin seçilmemesi gerektiği anlamına gelir ve OrderSelect() false döndürür. Ama evet, kontrol etmeye değer. Teşekkür ederim.

Bir bilet siparişi seçerken kapanış fiyatını kontrol etmek standarttır. Başka bir şekilde, normalde emrin kapalı ve kapalı listeden mi seçildiğini yoksa hala açık ve piyasa listesinden mi seçildiğini bilemezsiniz.

En kısa görüşlü şey biletleri global değişkenlerde saklamaktır. Ticaret ortamından alınmaları gerekiyor - şu anda güncel bilgiler var.

 
Artyom Trishkin :

Bir bilet siparişi seçerken kapanış fiyatını kontrol etmek standarttır. Başka bir şekilde, normalde emrin kapalı ve kapalı listeden mi seçildiğini yoksa hala açık ve piyasa listesinden mi seçildiğini bilemezsiniz.

En kısa görüşlü şey biletleri global değişkenlerde saklamaktır. Ticaret ortamından alınmaları gerekiyor - şu anda güncel bilgiler var.

Şu şekilde seçersem: OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES), teorik olarak, bu sorunu kısmen çözecek mi? Biletleri başka nedenlerle global değişkenlerde saklıyorum ve aynı zamanda bu durumda kullandım.

 
Dmitri Custurov :

Şu şekilde seçersem: OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES), teorik olarak, bu sorunu kısmen çözecek mi? Biletleri başka nedenlerle global değişkenlerde saklıyorum ve aynı zamanda bu durumda kullandım.

Hayır, çözmez - biletle seçim yaparken havuz (MODE_TRADES) yoksayılır.

 
Dmitri Custurov :

Bazen 4108 hatası veriyor - OrderClose için yanlış bilet. OrderTicket(), OrderSelect'teki biletle eşleşmiyor olabilir mi? Bilet değişkeni sıfır olabilir.

Hatayı yeniden oluşturmam uzun zaman alıyor, sorması daha kolay.

genellikle piyasa emirlerini kontrol etmek yeterlidir:

OrderCloseTime() == 0 //sipariş açık

OrderCloseTime() > 0 //sipariş kapatıldı

limit emirler için kapanış fiyatına da bakmanız gerekir, eğer 0'a eşitse, limit emri İptal edildi

 
Cevaplarınız için teşekkür ederim, anladım :)
 

Merhaba!

PositionClosePartial yöntemini kullanarak kodu kimin yapabileceğini paylaşın.

Teorik olarak nasıl çalıştığını anlıyorum, ancak çalışma koduna bakmak istiyorum.

Veya nereye bakacağınızı tavsiye edin.

Şimdiden teşekkürler.

 
odyn :

Merhaba!

PositionClosePartial yöntemini kullanarak kodu kimin yapabileceğini paylaşın.

Teorik olarak nasıl çalıştığını anlıyorum ama çalışan koda bakmak istiyorum.

Veya nereye bakacağınızı tavsiye edin.

Şimdiden teşekkürler.

Pratik olarak bir kod satırıdır. Ancak bunun için bir pozisyon bileti almanız gerekiyor. İşte OnInit'ten bir çok 0.2 ile pozisyon açan ve OnTick'te pozisyonun yarısını kapatan bir Uzman Danışman.

 //+------------------------------------------------------------------+
//|                                                           00.mq5 |
//|                                          © 2020, Alexey Viktorov |
//|                     https://www.mql5.com/ru/users/alexeyvik/news |
//+------------------------------------------------------------------+
#property copyright "© 2020, Alexey Viktorov"
#property link        "https://www.mql5.com/ru/users/alexeyvik/news"
#property version    "1.00"

#include <Trade\Trade.mqh>
CTrade trade;
ulong posTicket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
 {
  trade.SetExpertMagicNumber( 111 );
  trade.PositionOpen( _Symbol , ORDER_TYPE_BUY , 0.2 , SymbolInfoDouble ( _Symbol , SYMBOL_ASK ), 0.0 , 0.0 );
   return ( INIT_SUCCEEDED );
 }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
 {
//---
 }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
 {
   if ( PositionSelectByTicket (posTicket) && PositionGetDouble ( POSITION_VOLUME ) > 0.1 )
    trade.PositionClosePartial(posTicket, 0.1 );
 }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
 {
//---
   if (trans.type == TRADE_TRANSACTION_HISTORY_ADD )
   {
     if ( PositionSelectByTicket (trans.position) && PositionGetInteger ( POSITION_MAGIC ) == 111 && PositionGetString ( POSITION_SYMBOL ) == _Symbol )
      posTicket = PositionGetInteger ( POSITION_TICKET );
   }
 }
//+------------------------------------------------------------------+

Veya işte CTrade sınıfının tam kodu

 //+------------------------------------------------------------------+
//| Partial close specified opened position (for hedging mode only)  |
//+------------------------------------------------------------------+
bool CTrade::PositionClosePartial( const ulong ticket, const double volume, const ulong deviation)
  {
//--- check stopped
   if ( IsStopped ( __FUNCTION__ ))
       return ( false );
//--- for hedging mode only
   if (!IsHedging())
       return ( false );
//--- check position existence
   if (! PositionSelectByTicket (ticket))
       return ( false );
   string symbol= PositionGetString ( POSITION_SYMBOL );
//--- clean
   ClearStructures();
//--- check filling
   if (!FillingCheck(symbol))
       return ( false );
//--- check
   if (( ENUM_POSITION_TYPE ) PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
     {
       //--- prepare request for close BUY position
      m_request.type = ORDER_TYPE_SELL ;
      m_request.price= SymbolInfoDouble (symbol, SYMBOL_BID );
     }
   else
     {
       //--- prepare request for close SELL position
      m_request.type = ORDER_TYPE_BUY ;
      m_request.price= SymbolInfoDouble (symbol, SYMBOL_ASK );
     }
//--- check volume
   double position_volume= PositionGetDouble ( POSITION_VOLUME );
   if (position_volume>volume)
      position_volume=volume;
//--- setting request
   m_request.action   = TRADE_ACTION_DEAL ;
   m_request.position =ticket;
   m_request.symbol   =symbol;
   m_request.volume   =position_volume;
   m_request.magic    =m_magic;
   m_request.deviation=(deviation== ULONG_MAX ) ? m_deviation : deviation;
//--- close position
   return ( OrderSend (m_request,m_result));
  }
Dosyalar:
00.mq5  5 kb