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

 
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?

Ek olarak, bir pozisyonun açılışını seçmeye çalışarak kontrol edebilirsiniz. Ve birkaç tane denemek daha iyidir

         int n = 0 ;
           do
           {
            n++;
           }
           while (! PositionSelectByTicket (tradeResult.deal) && n < 5 );
İşte hem gecikme hem de pozisyonun zaten yerinde olduğuna dair bir onay.

Ayrıca, kötü olan OrderCheck(Request, checkResult) kontrolünün olmadığını da fark ettim.
 

Evet ve ayrıca bir piyasa emrinde - fiyat = 0

Request.price= SymbolInfoDouble ( _Symbol , SYMBOL_BID ); unut gitsin

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={ 0 };
   MqlTradeResult   result={ 0 };
   order_ticket= 0 ;
   request.action = TRADE_ACTION_DEAL ;
   request.magic  = 9876543211 ;
   request.symbol = Symbol ();
   request.volume = 1 ;
   request.price  = 0 ;
   request.type= ORDER_TYPE_BUY ;
   request.comment= "Sync mode" ;
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time= ORDER_TIME_DAY ;
   if ( OrderSend (request,result))
     {
       if ((result.retcode== TRADE_RETCODE_DONE ) || (result.retcode== TRADE_RETCODE_PLACED ))
        {
         if (result.order> 0 )
           {
            order_ticket=result.order;
             Print ( __FUNCTION__ , " Order sent in sync mode" );
             return ( true );
           }
         else
           {
             Print ( __FUNCTION__ , " Error order sent in sync mode! Retcode = " ,result.retcode);
           }
        }
       else
        {
         Print ( __FUNCTION__ , " Error order sent in sync mode! Retcode = " ,result.retcode);
        }
     }
   else
     {
       Print ( __FUNCTION__ , " Order not sent in sync mode." );
     }
   return ( false );
  }
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   switch (trans.type)
     {
       case TRADE_TRANSACTION_HISTORY_ADD :
         if ((order_ticket > 0 ) && (trans.order == order_ticket))
      {
         //Вот здесь и смотрим что произошло
      }
       break ;
     }
  }
 
Alexey Viktorov :
Ek olarak, bir pozisyonun açılışını seçmeye çalışarak kontrol edebilirsiniz. Ve birkaç tane denemek daha iyidir

         int n = 0 ;
           do
           {
            n++;
           }
           while (! PositionSelectByTicket (tradeResult.deal) && n < 5 );
İşte hem gecikme hem de pozisyonun zaten yerinde olduğuna dair bir onay.

Ayrıca, kötü olan OrderCheck(Request, checkResult) kontrolünün olmadığını da fark ettim.

Ya zaten bir pozisyon varsa?

Yoksa zaten bir pozisyon var ama sipariş tam olarak doldurulmadı mı?

 
Alexey Viktorov :
Ek olarak, bir pozisyonun açılışını seçmeye çalışarak kontrol edebilirsiniz. Ve birkaç tane denemek daha iyidir

         int n = 0 ;
           do
           {
            n++;
           }
           while (! PositionSelectByTicket (tradeResult.deal) && n < 5 );
İşte hem gecikme hem de pozisyonun zaten yerinde olduğuna dair bir onay.

Ayrıca, kötü olan OrderCheck(Request, checkResult) kontrolünün olmadığını da fark ettim.

Bu oldukça mümkün ve OrderCheck'i ekleyeceğim (Request, checkResult)
teşekkürler

ama bu döngüyü pek sevmiyorum.

 
prostotrader :

Evet ve ayrıca bir piyasa emrinde - fiyat = 0

Request.price= SymbolInfoDouble ( _Symbol , SYMBOL_BID ); unut gitsin

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={ 0 };
   MqlTradeResult   result={ 0 };
   order_ticket= 0 ;
   request.action = TRADE_ACTION_DEAL ;
   request.magic  = 9876543211 ;
   request.symbol = Symbol ();
   request.volume = 1 ;
   request.price  = 0 ;
   request.type= ORDER_TYPE_BUY ;
   request.comment= "Sync mode" ;
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time= ORDER_TIME_DAY ;
   if ( OrderSend (request,result))
     {
       if ((result.retcode== TRADE_RETCODE_DONE ) || (result.retcode== TRADE_RETCODE_PLACED ))
        {
         if (result.order> 0 )
           {
            order_ticket=result.order;
             Print ( __FUNCTION__ , " Order sent in sync mode" );
             return ( true );
           }
         else
           {
             Print ( __FUNCTION__ , " Error order sent in sync mode! Retcode = " ,result.retcode);
           }
        }
       else
        {
         Print ( __FUNCTION__ , " Error order sent in sync mode! Retcode = " ,result.retcode);
        }
     }
   else
     {
       Print ( __FUNCTION__ , " Order not sent in sync mode." );
     }
   return ( false );
  }
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   switch (trans.type)
     {
       case TRADE_TRANSACTION_HISTORY_ADD :
         if ((order_ticket > 0 ) && (trans.order == order_ticket))
      {
         //Вот здесь и смотрим что произошло
      }
       break ;
     }
  }
Bu kadar detaylı anlatım ve anlatım için çok teşekkürler...
ama fiyat hakkında .... evet, MT4'e daha çok alışkınım ve orada her zaman fiyatı belirlemeniz gerekiyor ...
 
Sergey Chalyshev :

tekrarlıyorum

Ayrıca , siparişin durumunu ve tarihte görünüp görünmediğini de kontrol etmeniz gerekir.

Borsa pozisyonlarla çalışmaz, sadece emirlerle çalışır.

Gerçekten?
 
Gennady Mazur :
Gecikmeler koyarsam haklısınız ama ben piyasada çalışıyorum ve burada da Sonuçlar.deal kullanılarak bilet alınıyor .
Her neyse, önce emir gönderilir, sonra gerçekleştirilir.
 
Sergey Chalyshev :

Gülüşün ne anlama geliyor anlamadım?

Bunu senden duymayı beklemiyordum. Ne duraklıyor, yoksa şaka mı yapıyorsun?

Piyasa bilgilerinin ve geçmişin güncellenmesine izin vermek için OrderSend() 'den sonra duraklayın.
 
Sergey Chalyshev :

Kötü kalıtım Forex.

...

Lütfen ifadeleri seçin. Aksi takdirde, FOOOORTS taraftarlarının genetik mutasyonundan bahsedebilirsiniz.
 
Sergey Chalyshev :

Ya zaten bir pozisyon varsa?

Yoksa zaten bir pozisyon var ama sipariş tam olarak doldurulmadı mı?

Evet. Ve ben tamamen benim, çit hakkındayım. Pek haklı olmadığımı kabul ediyorum. Ya da tamamen yanlış. :-)