Bir piyasa emri nasıl doğru bir şekilde açılır?

 

Geçenlerde siparişlerin yeniden açılması konusunu gündeme getirdim. Çünkü sorunu çözdüğümü sanıyordum. Bir hafta boyunca her şey çok iyi çalıştı. Ancak bugün sadece açarken benzer bir sorunla karşılaştım.
Finam'da, Açılış 9'da birçok emir açıldı... gerçi her durumda sadece bir emir açılmış olmalıydı.

İşte EA'dan bir kod parçası

     if (OpenOrders< 1 )
    {
        Coment=" Open Sell "+ string (OpenOrders+ 1 );
        ret=OpenSellPosition( _Symbol ,volume,Coment,Sleeppage,Filling);
    }
    
    
   if (ret)
  {
    OpenOrders++;
    PriceLastOpen=price;
  }

bool OpenSellPosition( string symbol, double volume, string comment="", ulong deviation= 10 , ENUM_ORDER_TYPE_FILLING filling= ORDER_FILLING_FOK )
{
   MqlTradeRequest Request;
   MqlTradeResult Results;
   ZeroMemory (Request);
   ZeroMemory (Results);
  Request.price= SymbolInfoDouble ( _Symbol , SYMBOL_BID );
  Request.action= TRADE_ACTION_DEAL ;
  Request.type= ORDER_TYPE_SELL ;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
   bool res= false ;
  res= OrderSend (Request,Results);
   if (res)
  {
     if (Results.deal> 0 ) return ( true );
     else return ( false );
  }
   return ( false );
}

onlar. Başarılı bir işlemden sonra , başlangıçta 0'a eşit olan OpenOrders değişkeninin arttığı koddan görülebilir.

ve 0'dan büyükse, o zaman siparişin başka açılması olmamalıdır, ancak sipariş yığınının tamamı Sipariş1 yorumuyla açıktır.

Bir sipariş açma işlevinde, olumlu bir yanıt olup olmadığını ve bir sipariş biletinin alınıp alınmadığını kontrol ediyorum , ancak bir nedenden dolayı bu işlev, siparişin gerçekten ayarlanmış olmasına rağmen false döndürüyor.

Neyin yanlış olduğunu açıklayın, bu problem nasıl çözülür?

 
Anlaşmayla ilgili bilgilerin henüz ulaşmadığını varsayıyorum. Burada ( kırmızı ile vurgulanmıştır) Şansa güveniyorsunuz. Ve o kaprisli bir bayan :-))

bool OpenSellPosition( string symbol, double volume, string comment= "" , ulong deviation= 10 , ENUM_ORDER_TYPE_FILLING filling= ORDER_FILLING_FOK )
{
   MqlTradeRequest Request;
   MqlTradeResult Results;
   ZeroMemory (Request);
   ZeroMemory (Results);
  Request.price= SymbolInfoDouble ( _Symbol , SYMBOL_BID );
  Request.action= TRADE_ACTION_DEAL ;
  Request.type= ORDER_TYPE_SELL ;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
   bool res= false ;
  res= OrderSend (Request,Results);
   if (res)
  {
     if (Results.deal> 0 ) return ( true );
     else return ( false );

  }
   return ( false );
}
 
Gennady Mazur :

Geçenlerde siparişlerin yeniden açılması konusunu gündeme getirdim. Çünkü sorunu çözdüğümü sanıyordum. Bir hafta boyunca her şey çok iyi çalıştı. Ancak bugün sadece açarken benzer bir sorunla karşılaştım.
Finam'da, Açılış 9'da birçok emir açıldı... gerçi her durumda sadece bir emir açılmış olmalıydı.

İşte EA'dan bir kod parçası

     if (OpenOrders< 1 )
    {
        Coment=" Open Sell "+ string (OpenOrders+ 1 );
        ret=OpenSellPosition( _Symbol ,volume,Coment,Sleeppage,Filling);
    }
    
    
   if (ret)
  {
    OpenOrders++;
    PriceLastOpen=price;
  }

bool OpenSellPosition( string symbol, double volume, string comment="", ulong deviation= 10 , ENUM_ORDER_TYPE_FILLING filling= ORDER_FILLING_FOK )
{
   MqlTradeRequest Request;
   MqlTradeResult Results;
   ZeroMemory (Request);
   ZeroMemory (Results);
  Request.price= SymbolInfoDouble ( _Symbol , SYMBOL_BID );
  Request.action= TRADE_ACTION_DEAL ;
  Request.type= ORDER_TYPE_SELL ;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
   bool res= false ;
  res= OrderSend (Request,Results);
   if (res)
  {
     if (Results.deal> 0 ) return ( true );
     else return ( false );
  }
   return ( false );
}

onlar. Başarılı bir işlemden sonra , başlangıçta 0'a eşit olan OpenOrders değişkeninin arttığı koddan görülebilir.

ve 0'dan büyükse, o zaman siparişin başka açılması olmamalıdır, ancak sipariş yığınının tamamı Sipariş1 yorumuyla açıktır.

Bir sipariş açma işlevinde, olumlu bir yanıt olup olmadığını ve bir sipariş biletinin alınıp alınmadığını kontrol ediyorum , ancak bir nedenden dolayı bu işlev, siparişin gerçekten ayarlanmış olmasına rağmen false döndürüyor.

Neyin yanlış olduğunu açıklayın, bu problem nasıl çözülür?

Kötü kalıtım Forex.

Sonuçları kontrol etmeniz gerekir. sipariş.

Bir sipariş verilmişse, bu bir anlaşmanın yapılmış olduğu anlamına gelmez.

 
Sergey Chalyshev :

Kötü kalıtım Forex.

Sonuçları kontrol etmeniz gerekir. sipariş.

Bir sipariş verilmişse, bu bir anlaşmanın yapılmış olduğu anlamına gelmez.

Gecikmeler koyarsam haklısınız ama ben piyasada çalışıyorum ve burada da Sonuçlar.deal kullanılarak bilet alınıyor .
 
Dennis Kirichenko :
Anlaşmayla ilgili bilgilerin henüz ulaşmadığını varsayıyorum. Burada ( kırmızı ile vurgulanmıştır) Şansa güveniyorsunuz. Ve o kaprisli bir bayan :-))

bool OpenSellPosition( string symbol, double volume, string comment= "" , ulong deviation= 10 , ENUM_ORDER_TYPE_FILLING filling= ORDER_FILLING_FOK )
{
   MqlTradeRequest Request;
   MqlTradeResult Results;
   ZeroMemory (Request);
   ZeroMemory (Results);
  Request.price= SymbolInfoDouble ( _Symbol , SYMBOL_BID );
  Request.action= TRADE_ACTION_DEAL ;
  Request.type= ORDER_TYPE_SELL ;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
   bool res= false ;
  res= OrderSend (Request,Results);
   if (res)
  {
     if (Results.deal> 0 ) return ( true );
     else return ( false );

  }
   return ( false );
}
Hayır, bu sonuç mevcut, sunucudaki bir sipariş bileti değil, daha sonra pozisyon biletine dönüşecek olan geçici bir operasyon bileti.
 
Dennis Kirichenko :
Anlaşmayla ilgili bilgilerin henüz ulaşmadığını varsayıyorum. Burada ( kırmızı ile vurgulanmıştır) Şansa güveniyorsunuz. Ve o kaprisli bir bayan :-))

bool OpenSellPosition( string symbol, double volume, string comment= "" , ulong deviation= 10 , ENUM_ORDER_TYPE_FILLING filling= ORDER_FILLING_FOK )
{
   MqlTradeRequest Request;
   MqlTradeResult Results;
   ZeroMemory (Request);
   ZeroMemory (Results);
  Request.price= SymbolInfoDouble ( _Symbol , SYMBOL_BID );
  Request.action= TRADE_ACTION_DEAL ;
  Request.type= ORDER_TYPE_SELL ;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
   bool res= false ;
  res= OrderSend (Request,Results);
   if (res)
  {
     if (Results.deal> 0 ) return ( true );
     else return ( false );

  }
   return ( false );
}
Evet ve önceki konuda, bu forumun guruları, bu bilginin her zaman geldiğinden emin oldum ... neredeyse anında ... ve bilet sunucudan olumlu bir yanıtla düzenlenmezse, sipariş verilmedi. yer almak
 

Tüm ticaret işlemlerini kaydetmeniz gerekir. Örneğin şöyle:

ilk olarak, "başlıkta" CTrade ticaret sınıfını bağlarız

#include <Trade\Trade.mqh>
CTrade         m_trade;                       // trading object

ve işte bir Satın Alma işlemi örneği:

   if (m_trade.Buy(lots, NULL ,m_symbol. Ask (),sl,tp))
     {
       if (m_trade.ResultDeal()== 0 )
         Print ("Buy -> false . Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

       else
         Print ("Buy -> true . Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
       Print ("Buy -> false . Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

yani, iki kez hata alabilirsiniz: ilk seviye - işlem temel kontrolü geçmedi ve ikinci savunma seviyesi - işlem biletini kontrol etme .

Daha sonra, eğer bir bindirme varsa, bunu loglardan anlamak mümkün olacaktır.

Eklendi: Yukarıdaki, SENKRON çalışma modu için geçerlidir.

 

Şu anda ve burada gurular öğretecek))

Объясните что не так, как решить данную проблему? 

Tecrübenle, burada bu tür soruları sormak uygun değil.

 
Vladimir Karputov :

Tüm işlemleri kaydetmeniz gerekir. Örneğin şöyle:

ilk olarak, "başlıkta" CTrade ticaret sınıfını bağlarız

#include <Trade\Trade.mqh>
CTrade         m_trade;                       // trading object

ve işte bir Satın Alma işlemi örneği:

   if (m_trade.Buy(lots, NULL ,m_symbol. Ask (),sl,tp))
     {
       if (m_trade.ResultDeal()== 0 )
         Print ("Buy -> false . Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

       else
         Print ("Buy -> true . Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
       Print ("Buy -> false . Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

yani, iki kez hata alabilirsiniz: ilk seviye - işlem temel kontrolü geçmedi ve ikinci savunma seviyesi - işlem biletini kontrol etme .

Daha sonra, eğer bir bindirme varsa, bunu loglardan anlamak mümkün olacaktır.

Eklendi: Yukarıdaki, SENKRON çalışma modu için geçerlidir.

Yani tam olarak bunu yaptım

   bool res= false ;
  res= OrderSend (Request,Results);
   if (res)
  {
     if (Results.deal> 0 ) return ( true );
     else return ( false );
  }
   return ( false );
sadece senin kodunla
 
Vladimir Karputov :

Tüm ticaret işlemlerini kaydetmeniz gerekir. Örneğin şöyle:

ilk olarak, "başlıkta" CTrade ticaret sınıfını bağlarız

#include <Trade\Trade.mqh>
CTrade         m_trade;                       // trading object

ve işte bir Satın Alma işlemi örneği:

   if (m_trade.Buy(lots, NULL ,m_symbol. Ask (),sl,tp))
     {
       if (m_trade.ResultDeal()== 0 )
         Print ("Buy -> false . Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

       else
         Print ("Buy -> true . Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
       Print ("Buy -> false . Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

yani, iki kez hata alabilirsiniz: ilk seviye - işlem temel kontrolü geçmedi ve ikinci savunma seviyesi - işlem biletini kontrol etme .

Daha sonra, eğer bir bindirme varsa, bunu loglardan anlamak mümkün olacaktır.

Eklendi: Yukarıdakiler SENKRON çalışma modu için geçerlidir.

Ve yine de, standart fonksiyon emirlerin yürütülmesini, onların doldurulmasını destekliyor mu, çünkü daha önce açmak için CiTrade'i kullandım, emirlerin yerine getirilmesini istemediğim borsaya gelene kadar, çünkü. dolguyu belirlemek imkansızdı
 
Gennady Mazur :
Yani tam olarak bunu yaptım

   bool res= false ;
  res= OrderSend (Request,Results);
   if (res)
  {
     if (Results.deal> 0 ) return ( true );
     else return ( false );
  }
   return ( false );
sadece senin kodunla
Peki ya günlüğe kaydetme? Hem işlemin başarıyla tamamlandığının hem de özellikle hata kodu ile başarısızlığın görüntülenmesi gerekmektedir.
Neden: