Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
iki değil bir :)
Bir sipariş bileti almak için OrderSendAsymc kullandığınızda TRADE_TRANSACTION_REQUEST gereklidir.
Ve orada yanlış olan ne? Nereden biliyorsun, belki OrderSendAsync() kullanıyorum?
Bunu, örneğin ticaret talebini gönderen Uzman Danışmanın damgasını kontrol etmek için kullanamaz mıyım? Veya örneğin, son işlemin yapıldığı pozisyonun biletini kontrol etmek için mi?
Son olarak, işlemin yapıldığı fiyatı kontrol etmek için bu olayı kullanabilirim (her ne kadar kabul etsem de, bu olaydaki fiyatı kontrol etmek yalnızca asenkron ticaret kullanıldığında anlamlıdır).
Yani, eşzamansız sipariş göndermeyi kullanırsam kod doğru mu?
Ve orada yanlış olan ne? Nereden biliyorsun, belki OrderSendAsync() kullanıyorum?
Bunu, örneğin ticaret talebini gönderen Uzman Danışmanın damgasını kontrol etmek için kullanamaz mıyım? Veya örneğin, son işlemin yapıldığı pozisyonun biletini kontrol etmek için mi?
Son olarak, işlemin yapıldığı fiyatı kontrol etmek için bu olayı kullanabilirim (her ne kadar kabul etsem de, bu olaydaki fiyatı kontrol etmek yalnızca asenkron ticaret kullanıldığında anlamlıdır).
Yani, eşzamansız sipariş göndermeyi kullanırsam kod doğru mu?
Konu denir
"OrderSend ile nasıl çalışılır"
Bu işlev (geliştiriciler tarafından tasarlandığı gibi) tamamen senkronize olmalıdır, yani bir sipariş gönderilmelidir ve bir bilet alındıysa,
o zaman her şey sırayla. Ancak şimdi bu işlev tam olarak doğru çalışmıyor, bu nedenle bir sipariş bileti aldıktan sonra,
OnTradeTransaction'da her şeyin yolunda olduğuna dair onay alınmalıdır.
Yani bu siparişteki veriler terminalde tamamen senkronize edilir.
// Expert TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch (trans.type)
{
case TRADE_TRANSACTION_ORDER_UPDATE :
switch (trans.order_state)
{
case ORDER_STATE_PLACED :
if (order_ticket==trans.order)
{
Print ( __FUNCTION__ , " Order plased done. Ticket = " ,trans.order);
if (order_ticket> 0 )
{
if ( OrderSelect (order_ticket))
{
//Данные по ордеру синхронизированы
}
else
{
Print ( __FUNCTION__ , " Order not select! Ticket = " ,trans.order);
}
}
else
{
Print ( __FUNCTION__ , " Wrong order ticket = " ,trans.order);
}
}
break ;
}
break ;
}
}
Konu denir
"OrderSend ile nasıl çalışılır"
Bu işlev (geliştiriciler tarafından tasarlandığı gibi) tamamen senkronize olmalıdır, yani bir sipariş gönderilmelidir ve bir bilet alındıysa,
o zaman her şey sırayla. Ancak şimdi bu işlev tam olarak doğru çalışmıyor, bu nedenle bir sipariş bileti aldıktan sonra,
OnTradeTransaction'da her şeyin yolunda olduğuna dair onay alınmalıdır.
Yani bu siparişteki veriler terminalde tamamen senkronize edilir.
// Expert TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch (trans.type)
{
case TRADE_TRANSACTION_ORDER_UPDATE :
switch (trans.order_state)
{
case ORDER_STATE_PLACED :
if (order_ticket==trans.order)
{
Print ( __FUNCTION__ , " Order plased done. Ticket = " ,trans.order);
if (order_ticket> 0 )
{
if ( OrderSelect (order_ticket))
{
//Данные по ордеру синхронизированы
}
else
{
Print ( __FUNCTION__ , " Order not select! Ticket = " ,trans.order);
}
}
else
{
Print ( __FUNCTION__ , " Wrong order ticket = " ,trans.order);
}
}
break ;
}
break ;
}
}
Harika! Bunu biliyorum. Sadece ben asenkron sipariş gönderimi kullanıyorum. Başka bir problemim var, aynı işlem için REQUEST olayı (işlemin son özeti anlamında) iki kez geldi.
OrderSEndAsync siparişleri verirken OnTradeTransaction'da mesajları nasıl işleyeceğinizi tam olarak anlamıyorsunuz
Bu Uzman Danışmanı kaydedin ve nasıl çalıştığını görün
OrderSEndAsync siparişleri verirken OnTradeTransaction'da mesajları nasıl işleyeceğinizi tam olarak anlamıyorsunuz
Bu Uzman Danışmanı kaydedin ve nasıl çalıştığını görün
Bu yüzden size TradeTransactions'ı nasıl doğru bir şekilde işleyeceğinizi soruyorum.
Bu yüzden size TradeTransactions'ı nasıl doğru bir şekilde işleyeceğinizi soruyorum.
OrderSendAsync için sipariş şudur:
OrderSendAsync komutuyla bir sipariş gönderirken, başarılı gönderimin ardından bir order_id alırsınız.
{
double price= SymbolInfoDouble ( Symbol (), SYMBOL_SESSION_PRICE_LIMIT_MAX );
MqlTradeRequest request={ 0 };
MqlTradeResult result={ 0 };
order_ticket= 0 ;
order_id= 0 ;
request.action = TRADE_ACTION_PENDING ;
request.magic = 9876543210 ;
request.symbol = Symbol ();
request.volume = 1 ;
request.price = price;
request.type= ORDER_TYPE_SELL_LIMIT ;
request.comment= "Async mode" ;
request.type_filling= ORDER_FILLING_RETURN ;
request.type_time= ORDER_TIME_DAY ;
if ( OrderSendAsync (request,result))
{
if ((result.retcode== TRADE_RETCODE_PLACED ) || (result.retcode== TRADE_RETCODE_DONE ))
{
if (result.request_id> 0 )
{
order_id=result.request_id;
Print ( __FUNCTION__ , " Order sent in async mode" );
return ( true );
}
else
{
Print ( __FUNCTION__ , " Error order sent in async mode! Retcode = " ,result.retcode);
}
}
else
{
Print ( __FUNCTION__ , " Error order sent in async mode! Retcode = " ,result.retcode);
}
}
else
{
Print ( __FUNCTION__ , " Order not sent in async mode." );
}
return ( false );
}
Ayrıca , TÜM diğer veriler OnTradeTransaction'da alınır
1. Bir sipariş bileti alma
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch (trans.type)
{
case TRADE_TRANSACTION_REQUEST :
if ((order_id> 0 ) && (order_id==result.request_id))
{
order_id= 0 ;
order_ticket=result.order;
Print ( __FUNCTION__ , " Order get ticket done. Ticket = " ,result.order);
}
break ;
}
}
2. Piyasa veya limit (beklemede olmayan) emir kullanıyorsanız, yani hemen gerçekleştirilenler
veya reddedilirse, TRADE_TRANSACTION_HISTORY_ADD'yi izlemeniz gerekir, çünkü her durumda
bu tür siparişler tarihe eklenir.
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch (trans.type)
{
case TRADE_TRANSACTION_HISTORY_ADD :
if (order_ticket==trans.order)
{
//Берем данные из истории
}
break ;
}
}
3. Bekleyen emirler kullanıyorsanız (parçalar halinde yürütülebilirler), o zaman izlemelisiniz
üç olayı durdurun TRADE_TRANSACTION_ORDER_UPDATE, TRADE_TRANSACTION_HISTORY_ADD, TRADE_TRANSACTION_DEAL_ADD
TRADE_TRANSACTION_ORDER_UPDATE - bir siparişin verildiği (değiştirildiği) bilgisini almak için kullanılır
TRADE_TRANSACTION_DEAL_ADD - bir anlaşmanın yapıldığını öğrenin
TRADE_TRANSACTION_HISTORY_ADD - İşlem sisteminde emir YOK, emir verilerine bakın
Hepsi "bilgelik"
Katma
OrderSendAsync ve OnTradeTransaction kombinasyonu kusursuz çalışıyor , FOREX'te de kontrol ettim (demo)
ve FORTS (gerçek)
Katma
OrderSendAsync ve OnTradeTransaction kombinasyonu kusursuz çalışıyor , FOREX'te de kontrol ettim (demo)
ve FORTS (gerçek)
Teşekkür ederim! Artık OnTradeTransaction() işlevini nasıl kullanacağımı biliyorum veya başka sırlar var mı?
TradeTransaction() olayının kaybolması nasıl sorun olmaz?
Teşekkür ederim! Artık OnTradeTransaction() işlevini nasıl kullanacağımı biliyorum veya başka sırlar var mı?
TradeTransaction() olayının kaybolması nasıl sorun olmaz?
Artık sır yok.
Kaybedilebilir (ancak 4-5 ayda 3-4 kez ve güçlü piyasa hareketliliği zamanlarında oldu),
böylece sigorta zarar vermez.
Ve işte bir siparişi kontrol etmenin özel bir örneği
Terminal günlüğü:
2017.01.05 11:46:02.895 Trades 'xxxxx': accepted buy limit 1.00 PLT-6.17 at 952.3
2017.01.05 11:46:02.896 Trades 'xxxxx': buy limit 1.00 PLT-6.17 at 952.3 placed for execution in 1223.187 ms
Uzman günlüğü:
Sipariş 2017.01.05 11:46:01.673 tarihinde gönderildi.
Sunucudan 1 saniyeden fazla yanıt gelmedi, sipariş kontrol edildi.
Normal modda cevap 7-10 ms içinde gelir.
" MT5'te OrderSend ile Nasıl Çalışılır " konusunun sorusunun yanıtlanması
basit bir cevap var
Geliştiriciler hatayı düzeltene kadar, o zaman
ulong order_ticket; //Тикет ордера
//---
if ( OrderSend (request,result))
{
if (result.retcode== TRADE_RETCODE_DONE )
{
pre_ticket=result.order;
}
}
//----------------------------------------------------------------+
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch (trans.type)
{
case TRADE_TRANSACTION_ORDER_UPDATE :
if ((pre_ticket> 0 ) && (trans.order==pre_ticket))
{
switch (trans.order_state)
{
case ORDER_STATE_PLACED :
order_ticket = pre_ticket;
break ;
}
}
break ;
}
}
Ve düzelttiklerinde
//---
if ( OrderSend (request,result))
{
if (result.retcode== TRADE_RETCODE_DONE )
{
order_ticket=result.order;
}
}