MQL5 Cookbook: TradeTransaction Olayının İşlenmesi
Giriş
Bu makalede, MQL5 araçlarını kullanarak alım satım olaylarını kontrol etmenin yollarından birini tanıtmak istiyorum. Zaten halihazırda birkaç makalenin bu konuya ayrıldığını belirtmem gerek. Expert Advisor'da "OnTrade() işlevini kullanarak alım satım olaylarının işlenmesi" bunlardan biridir. Diğer yazarları tekrar etmeyeceğim ve başka bir işleyici kullanacağım - OnTradeTransaction().
Okuyucuların dikkatini şöyle bir noktaya çekmek isterim. MQL5 dilinin geçerli sürümü, İstemci Terminalinde resmi olarak 14 tane olay işleyicisi sayar. Ek olarak, bir programcının EventChartCustom() ile özel olaylar oluşturma ve bunları OnChartEvent() ile işleme olanağı vardır. Ancak Belgelerde, 'Olay güdümlü programlama' (EDP) teriminden hiç bahsedilmemektedir. MQL5'te herhangi bir programın EDP prensiplerine dayalı olarak oluşturulduğu gerçeği göz önüne alındığında bu gariptir. Mesela kullanıcıya, herhangi bir Expert Advisor şablonunda 'Expert için Olay işleyici' adımında seçim yapması önerilir.
MQL5'teki Olay-güdümlü Programlama mekanizmasının değişik şekillerde kullanıldığı açıktır. Dil, iki bölümden oluşan program blokları içerebilir: olayın seçilmesi ve işlenmesi. Dahası İstemci Terminali olaylarından bahsedersek, programcı sadece ikinci kısım üzerinde kontrole sahiptir, yani olay işleyicisinde. Dürüst olmak gerekirse, bazı olaylar için istisnalar olabilir. Zamanlayıcı ve özel olay bunların arasındadır. Bu olayların kontrolü tamamen programcıya bırakılmıştır.
1. TradeTransaction Olayı
Konumuza derinlemesine girmeden önce resmi bilgilere değinelim.
Belgelere göre TradeTransaction olayı, alım satım hesabıyla yapılan belirli işlemlerin sonucudur. Operasyonun kendisi, işlemler tarafından belirlenen bir dizi aşamadan oluşur. Mesela, alım satım hesabıyla yapılan en popüler operasyonlardan biri olan piyasa talimatı ile pozisyon açma işlemi aşağıdaki aşamalarda gerçekleştirilir:
- Bir alım satım talebi yapın;
- Alım satım talebini doğrulayın;
- Takas talebini sunucuya gönderin;
- Sunucudaki alım satım talimatının yürütülmesi hakkında bir yanıt alın.
Ancak bu sıralama yalnızca, EA kodunun dizelerinde yansıtılan terminal-sunucu çiftinin çalışma mantığını gösterir. TradeTransaction alım satım olayı açısından, piyasada pozisyon açmak şu şekilde gerçekleşir:
- MQL5 programı, sunucudan tamamlanan talebin sonucu hakkında bir bildirim alır;
- Tek biletli talimat şeklindeki talep, açık siparişler listesine dahil edilir;
- Talimat gerçekleştirildikten sonra, açık talimat listesinden silinir;
- Ardından talimat, hesap geçmişine gider;
- Hesap geçmişi, aynı zamanda talimatın gerçekleştirildiği yatırımla ilgili verileri de içerir.
Bu nedenle bir pozisyon açmak, OnTradeTransaction() işleyicisi için beş çağrı gerektirir.
Program kodunu biraz sonra detaylı olarak tartışacağız ve şimdi işlevin başlığına yakından bakacağız. Üç giriş parametresi vardır.
void OnTradeTransaction( const MqlTradeTransaction& trans, // structure of the trade transaction const MqlTradeRequest& request, // structure of the request const MqlTradeResult& result // structure of the response );
Bu parametreler Belgeler bölümünde ayrıntılı olarak açıklanmıştır. Alım satım işlem yapı parametresinin, işleyicinin mevcut çağrı sırasında aldığı bilgilerin bir tür dökümü olduğunu belirtmek isterim.
Alım satım işlem türü hakkında da çokça karşılaşacağımız için birkaç şey söylemeliyim.
MQL5'te ENUM_TRADE_TRANSACTION_TYPE, alım satım işlemi türünden sorumlu özel bir numaralandırmadır. Bir alım satım işlemin hangi türe ait olduğunu bulmak için MqlTradeTransaction türünün parametre sabitine başvurmamız gerekir.
struct MqlTradeTransaction { ulong deal; // Ticket of the deal ulong order; // Ticket of the order string symbol; // Trade symbol ENUM_TRADE_TRANSACTION_TYPE type; // Type of the trade transaction ENUM_ORDER_TYPE order_type; // Type of the order ENUM_ORDER_STATE order_state; // Status of the order ENUM_DEAL_TYPE deal_type; // Type of the deal ENUM_ORDER_TYPE_TIME time_type; // Order expiration type datetime time_expiration; // Order expiration time double price; // Price double price_trigger; // Price that triggers the Stop Limit order double price_sl; // Level of Stop Loss double price_tp; // Level of Take Profit double volume; // Volume in lots };
Yapının dördüncü alanı, aradığımız numaralandırmanın ta kendisidir.
2. Pozisyonların İşlenmesi
Neredeyse pozisyon işlenmesiyle ilgili tüm alım satım işlemleri, OnTradeTransaction() işleyicisinin beş çağrısını gerektirir. Bunlar arasında:
- bir pozisyonun açılması;
- pozisyon;
- pozisyonun tersine çevrilmesi;
- pozisyona lot eklemek;
- pozisyonun kısmi kapanması vardır.
Bir pozisyonu değiştirmek, TradeTransaction olay işleyicisini iki kez çağıran tek işlemdir.
Belirli alım satım operasyonlarından hangi işlem türlerinin sorumlu olduğu hakkında bilgi bulunmadığı için bunu deneme yanılma yoluyla bulacağız.
Bundan önce, TradeTransaction olay işleyicisini içerecek bir Expert şablonu oluşturmamız gerekecektir. Şablon sürümünü TradeProcessor.mq5 olarak adlandırdım. Logdaki yapı alanlarının değerleri hakkında bilgi gösterme erişimi için bir özellik ekledim. Bu değerler, olay işleyicisinin parametreleridir. Bu kayıtları analiz etmek zaman alacaktır ancak sonunda olayların tam resmini sunarak işe yarayacaktır.
Expert'i, MetaTrader 5 terminalindeki herhangi bir grafikte ve hata ayıklama modunda tekrar başlatmamız gereklidir.
Manuel bir pozisyon açın ve koda bir göz atın. İşleyicinin ilk çağrısı şu şekilde olacaktır (Şekil 1).
Şek.1. Tür alanı, TRADE_TRANSACTION_REQUEST'e eşittir
Aşağıdaki girişler logda şu şekilde görünecektir:
IO 0 17:37:53.233 TradeProcessor (EURUSD,H1) ---===Transaction===--- NK 0 17:37:53.233 TradeProcessor (EURUSD,H1) Ticket of the deal: 0 RR 0 17:37:53.233 TradeProcessor (EURUSD,H1) Type of the deal: DEAL_TYPE_BUY DE 0 17:37:53.233 TradeProcessor (EURUSD,H1) Ticket of the order: 0 JS 0 17:37:53.233 TradeProcessor (EURUSD,H1) Status of the order: ORDER_STATE_STARTED JN 0 17:37:53.233 TradeProcessor (EURUSD,H1) Type of the order: ORDER_TYPE_BUY FD 0 17:37:53.233 TradeProcessor (EURUSD,H1) Price: 0.0000 FN 0 17:37:53.233 TradeProcessor (EURUSD,H1) Level of Stop Loss: 0.0000 HF 0 17:37:53.233 TradeProcessor (EURUSD,H1) Level of Take Profit: 0.0000 FQ 0 17:37:53.233 TradeProcessor (EURUSD,H1) Price that triggers the Stop Limit order: 0.0000 RR 0 17:37:53.233 TradeProcessor (EURUSD,H1) Trade symbol: HD 0 17:37:53.233 TradeProcessor (EURUSD,H1) Pending order expiration time: 1970.01.01 00:00 GS 0 17:37:53.233 TradeProcessor (EURUSD,H1) Order expiration type: ORDER_TIME_GTC DN 0 17:37:53.233 TradeProcessor (EURUSD,H1) Type of the trade transaction TRADE_TRANSACTION_REQUEST FK 0 17:37:53.233 TradeProcessor (EURUSD,H1) Volume in lots: 0.00
Bu blokta bizi sadece işlem türüne ilişkin kayıt ilgilendirir. Gördüğümüz gibi bu tür (TRADE_TRANSACTION_REQUEST) talebine aittir.
Talep detayları hakkında bilgi "Talep" bloğundan elde edilebilir.
QG 0 17:37:53.233 TradeProcessor (EURUSD,H1) ---===Request===--- HL 0 17:37:53.233 TradeProcessor (EURUSD,H1) Type of the trade operation: TRADE_ACTION_DEAL EE 0 17:37:53.233 TradeProcessor (EURUSD,H1) Comment to the order: JP 0 17:37:53.233 TradeProcessor (EURUSD,H1) Deviation from the requested price: 0 GS 0 17:37:53.233 TradeProcessor (EURUSD,H1) Order expiration time: 1970.01.01 00:00 LF 0 17:37:53.233 TradeProcessor (EURUSD,H1) Magic number of the EA: 0 FM 0 17:37:53.233 TradeProcessor (EURUSD,H1) Ticket of the order: 22535869 EJ 0 17:37:53.233 TradeProcessor (EURUSD,H1) Price: 1.3137 QR 0 17:37:53.233 TradeProcessor (EURUSD,H1) Stop Loss level of the order: 0.0000 IJ 0 17:37:53.233 TradeProcessor (EURUSD,H1) Take Profit level of the order: 0.0000 KK 0 17:37:53.233 TradeProcessor (EURUSD,H1) StopLimit level of the order: 0.0000 FS 0 17:37:53.233 TradeProcessor (EURUSD,H1) Trade symbol: EURUSD RD 0 17:37:53.233 TradeProcessor (EURUSD,H1) Type of the order: ORDER_TYPE_BUY
Talep yürütümünün sonucuna ilişkin veriler "Yanıt" bloğundan edinilebilir.
KG 0 17:37:53.233 TradeProcessor (EURUSD,H1) ---===Response===--- JR 0 17:37:53.233 TradeProcessor (EURUSD,H1) Code of the operation result: 10009 GD 0 17:37:53.233 TradeProcessor (EURUSD,H1) Ticket of the deal: 15258202 NR 0 17:37:53.233 TradeProcessor (EURUSD,H1) Ticket of the order: 22535869 EF 0 17:37:53.233 TradeProcessor (EURUSD,H1) Volume of the deal: 0.11 MN 0 17:37:53.233 TradeProcessor (EURUSD,H1) Price of the deal: 1.3137 HJ 0 17:37:53.233 TradeProcessor (EURUSD,H1) Bid: 1.3135 PM 0 17:37:53.233 TradeProcessor (EURUSD,H1) Ask: 1.3137 OG 0 17:37:53.233 TradeProcessor (EURUSD,H1) Comment to the operation: RQ 0 17:37:53.233 TradeProcessor (EURUSD,H1) Request ID: 1
İşleyicinin talep ve yanıt yapıları gibi diğer parametrelerini analiz ettikten sonra, talep hakkında ilk çağrıda ek bilgi alabilirsiniz.
İkinci çağrı, talimatları açık talimatlar listesine eklemekle ilgilidir (Şek. 2).
Şek.2. Tür alanı, TRADE_TRANSACTION_ORDER_ADD'ye eşittir
"İşlem" bloğu, logda ihtiyacımız olan tek bloktur.
MJ 0 17:41:12.280 TradeProcessor (EURUSD,H1) ---===Transaction===--- JN 0 17:41:12.280 TradeProcessor (EURUSD,H1) Ticket of the deal: 0 FG 0 17:41:12.280 TradeProcessor (EURUSD,H1) Type of the deal: DEAL_TYPE_BUY LM 0 17:41:12.280 TradeProcessor (EURUSD,H1) Ticket of the order: 22535869 LI 0 17:41:12.280 TradeProcessor (EURUSD,H1) Status of the order: ORDER_STATE_STARTED LP 0 17:41:12.280 TradeProcessor (EURUSD,H1) Type of the order: ORDER_TYPE_BUY QN 0 17:41:12.280 TradeProcessor (EURUSD,H1) Price: 1.3137 PD 0 17:41:12.280 TradeProcessor (EURUSD,H1) Level of Stop Loss: 0.0000 NL 0 17:41:12.280 TradeProcessor (EURUSD,H1) Level of Take Profit: 0.0000 PG 0 17:41:12.280 TradeProcessor (EURUSD,H1) Price that triggers the Stop Limit order: 0.0000 DL 0 17:41:12.280 TradeProcessor (EURUSD,H1) Trade symbol: EURUSD JK 0 17:41:12.280 TradeProcessor (EURUSD,H1) Pending order expiration time: 1970.01.01 00:00 QD 0 17:41:12.280 TradeProcessor (EURUSD,H1) Order expiration type: ORDER_TIME_GTC IQ 0 17:41:12.280 TradeProcessor (EURUSD,H1) Type of the trade transaction: TRADE_TRANSACTION_ORDER_ADD PL 0 17:41:12.280 TradeProcessor (EURUSD,H1) Volume in lots: 0.11
Gördüğümüz gibi talimat, biletini ve diğer parametrelerini (sembol, fiyat ve hacim) zaten aldı ve açık talimat listesine dahil edildi.
Olay işleyicisinin üçüncü çağrısı, talimatın açık olanlar listesinden silinmesiyle bağlantılıdır (Şekil 3).
Şek.3. Tür alanı TRADE_TRANSACTION_ORDER_DELETE'e eşittir
"İşlem" bloğu, logda ihtiyacımız olan tek bloktur.
PF 0 17:52:36.722 TradeProcessor (EURUSD,H1) ---===Transaction===--- OE 0 17:52:36.722 TradeProcessor (EURUSD,H1) Ticket of the deal: 0 KL 0 17:52:36.722 TradeProcessor (EURUSD,H1) Type of the deal: DEAL_TYPE_BUY EH 0 17:52:36.722 TradeProcessor (EURUSD,H1) Ticket of the order: 22535869 QM 0 17:52:36.722 TradeProcessor (EURUSD,H1) Status of the order: ORDER_STATE_STARTED QK 0 17:52:36.722 TradeProcessor (EURUSD,H1) Type of the order: ORDER_TYPE_BUY HS 0 17:52:36.722 TradeProcessor (EURUSD,H1) Price: 1.3137 MH 0 17:52:36.722 TradeProcessor (EURUSD,H1) Level of Stop Loss: 0.0000 OP 0 17:52:36.722 TradeProcessor (EURUSD,H1) Level of Take Profit: 0.0000 EJ 0 17:52:36.722 TradeProcessor (EURUSD,H1) Price that triggers the Stop Limit order: 0.0000 IH 0 17:52:36.722 TradeProcessor (EURUSD,H1) Trade symbol: EURUSD KP 0 17:52:36.722 TradeProcessor (EURUSD,H1) Pending order expiration time: 1970.01.01 00:00 LO 0 17:52:36.722 TradeProcessor (EURUSD,H1) Order expiration type: ORDER_TIME_GTC HG 0 17:52:36.722 TradeProcessor (EURUSD,H1) Type of the trade transaction: TRADE_TRANSACTION_ORDER_DELETE CG 0 17:52:36.722 TradeProcessor (EURUSD,H1) Volume in lots: 0.11
Bu blokta işlem türü dışında yeni bir bilgi yoktur.
İşleyici, geçmişte yeni bir geçmişe dönük talimat göründüğünde dördüncü kez çağrılır (Şekil 4).
Şek.4. Tür alanı TRADE_TRANSACTION_ORDER_ADD'ye eşittir
İlgili bilgileri "İşlem" bloğundan sahip olabiliriz.
QO 0 17:57:32.234 TradeProcessor (EURUSD,H1) ---===Transaction==--- RJ 0 17:57:32.234 TradeProcessor (EURUSD,H1) Ticket of the deal: 0 NS 0 17:57:32.234 TradeProcessor (EURUSD,H1) Type of the deal: DEAL_TYPE_BUY DQ 0 17:57:32.234 TradeProcessor (EURUSD,H1) Ticket of the order: 22535869 EH 0 17:57:32.234 TradeProcessor (EURUSD,H1) Status of the order: ORDER_STATE_FILLED RL 0 17:57:32.234 TradeProcessor (EURUSD,H1) Type of the order: ORDER_TYPE_BUY KJ 0 17:57:32.234 TradeProcessor (EURUSD,H1) Price: 1.3137 NO 0 17:57:32.234 TradeProcessor (EURUSD,H1) Level of Stop Loss: 0.0000 PI 0 17:57:32.234 TradeProcessor (EURUSD,H1) Level of Take Profit: 0.0000 FS 0 17:57:32.234 TradeProcessor (EURUSD,H1) Price that triggers the Stop Limit order: 0.0000 JS 0 17:57:32.234 TradeProcessor (EURUSD,H1) Trade symbol: EURUSD LG 0 17:57:32.234 TradeProcessor (EURUSD,H1) Pending order expiration time: 1970.01.01 00:00 KP 0 17:57:32.234 TradeProcessor (EURUSD,H1) Order expiration type: ORDER_TIME_GTC OL 0 17:57:32.234 TradeProcessor (EURUSD,H1) Type of the trade transaction: TRADE_TRANSACTION_HISTORY_ADD JH 0 17:57:32.234 TradeProcessor (EURUSD,H1) Volume in lots: 0.00
Bu aşamada talimatın yerine getirildiğini görebiliriz.
Son olarak, geçmişe bir yatırım eklendiğinde son (beşinci) çağrı gerçekleşir (Şekil 5).
Şek.5. Tür alanı TRADE_TRANSACTION_DEAL_ADD'ye eşittir
Logda yine, sadece "İşlem" bloğuyla ilgileniyoruz.
OE 0 17:59:40.718 TradeProcessor (EURUSD,H1) ---===Transaction===--- MS 0 17:59:40.718 TradeProcessor (EURUSD,H1) Ticket of the deal: 15258202 RJ 0 17:59:40.718 TradeProcessor (EURUSD,H1) Type of the deal: DEAL_TYPE_BUY HN 0 17:59:40.718 TradeProcessor (EURUSD,H1) Ticket of the order: 22535869 LK 0 17:59:40.718 TradeProcessor (EURUSD,H1) Status of the order: ORDER_STATE_STARTED LE 0 17:59:40.718 TradeProcessor (EURUSD,H1) Type of the order: ORDER_TYPE_BUY MM 0 17:59:40.718 TradeProcessor (EURUSD,H1) Price: 1.3137 PF 0 17:59:40.718 TradeProcessor (EURUSD,H1) Level of Stop Loss: 0.0000 NN 0 17:59:40.718 TradeProcessor (EURUSD,H1) Level of Take Profit: 0.0000 PI 0 17:59:40.718 TradeProcessor (EURUSD,H1) Price that triggers the Stop Limit order: 0.0000 DJ 0 17:59:40.718 TradeProcessor (EURUSD,H1) Trade symbol: EURUSD JM 0 17:59:40.718 TradeProcessor (EURUSD,H1) Pending order expiration time: 1970.01.01 00:00 QI 0 17:59:40.718 TradeProcessor (EURUSD,H1) Order expiration type: ORDER_TIME_GTC CK 0 17:59:40.718 TradeProcessor (EURUSD,H1) Type of the trade transaction: TRADE_TRANSACTION_DEAL_ADD RQ 0 17:59:40.718 TradeProcessor (EURUSD,H1) Volume in lots: 0.11
Bu bloktaki önemli dize, yatırımın biletidir.
İşlemin bir şemasını sunacağım. Pozisyonlar için sadece ikisi olacak. İlki Şekil 6'daki gibi görünmektedir.
Şek.6. İşlem sürecinin ilk şeması
Pozisyonların işlenmesiyle bağlantılı tüm alım satım işlemleri bu şemaya göre gerçekleştirilir. Buradaki tek istisna, bir pozisyonu değiştirme operasyonudur. Son operasyon, aşağıdaki iki işlemin işlenmesini içerir (Şekil 7).
Şek.7. İşlem sürecinin ikinci şeması
Bu nedenle bir pozisyonun modifikasyonu, yatırım ve talimat geçmişinde izlenemez.
Bu tamamen pozisyonlarla ilgilidir.
3. Beklemede Olan Talimatların İşlenmesi
Beklemede olan talimatlara gelirsek, onlarla yapılan operasyonların daha az işlem gerektirdiği bir kenara not edilmelidir. Aynı zamanda, talimatlarla çalışıldığında daha fazla işlem türü kombinasyonu olur.
Bir talimatı değiştirmek için, işleyici bir pozisyonu değiştirmeye benzer şekilde iki kez çağrılır. Bir talimatın verilmesi ve silinmesi üç çağrıyla gerçekleşir. TradeTransaction olayı, talimatın silinmesi veya yürütülmesi sırasında dört kez gerçekleşir.
Şimdi beklemede olan bir talimat vereceğiz. Expert'i, MetaTrader 5 terminalindeki herhangi bir çizelgede ve hata ayıklama modunda tekrar başlatmamız gereklidir.
İşleyicinin ilk çağrısı istekle bağlantılı olacaktır (Şekil 8).
Şek.8. Tür alanı, TRADE_TRANSACTION_REQUEST'e eşittir
Log aşağıdaki girdileri içerecektir:
IO 0 18:13:33.195 TradeProcessor (EURUSD,H1) ---===Transaction===--- NK 0 18:13:33.195 TradeProcessor (EURUSD,H1) Ticket of the deal: 0 RR 0 18:13:33.195 TradeProcessor (EURUSD,H1) Type of the deal: DEAL_TYPE_BUY DE 0 18:13:33.195 TradeProcessor (EURUSD,H1) Ticket of the order: 0 JS 0 18:13:33.195 TradeProcessor (EURUSD,H1) Status of the order: ORDER_STATE_STARTED JN 0 18:13:33.195 TradeProcessor (EURUSD,H1) Type of the order: ORDER_TYPE_BUY FD 0 18:13:33.195 TradeProcessor (EURUSD,H1) Price: 0.0000 FN 0 18:13:33.195 TradeProcessor (EURUSD,H1) Level of Stop Loss: 0.0000 HF 0 18:13:33.195 TradeProcessor (EURUSD,H1) Level of Take Profit: 0.0000 FQ 0 18:13:33.195 TradeProcessor (EURUSD,H1) Price that triggers the Stop Limit order: 0.0000 RR 0 18:13:33.195 TradeProcessor (EURUSD,H1) Trade symbol: HD 0 18:13:33.195 TradeProcessor (EURUSD,H1) Pending order expiration time: 1970.01.01 00:00 GS 0 18:13:33.195 TradeProcessor (EURUSD,H1) Order expiration type: ORDER_TIME_GTC DN 0 18:13:33.195 TradeProcessor (EURUSD,H1) Type of the trade transaction: TRADE_TRANSACTION_REQUEST FK 0 18:13:33.195 TradeProcessor (EURUSD,H1) Volume in lots: 0.00 NS 0 18:13:33.195 TradeProcessor (EURUSD,H1) QG 0 18:13:33.195 TradeProcessor (EURUSD,H1) ---===Request==--- IQ 0 18:13:33.195 TradeProcessor (EURUSD,H1) Type of the trade operation: TRADE_ACTION_PENDING OE 0 18:13:33.195 TradeProcessor (EURUSD,H1) Order comment: PQ 0 18:13:33.195 TradeProcessor (EURUSD,H1) Deviation from the requested price: 0 QS 0 18:13:33.195 TradeProcessor (EURUSD,H1) Order expiration time: 1970.01.01 00:00 FI 0 18:13:33.195 TradeProcessor (EURUSD,H1) Magic number of the EA: 0 CM 0 18:13:33.195 TradeProcessor (EURUSD,H1) Ticket of the order: 22535983 PK 0 18:13:33.195 TradeProcessor (EURUSD,H1) Price: 1.6500 KR 0 18:13:33.195 TradeProcessor (EURUSD,H1) Stop Loss level of the order: 0.0000 OI 0 18:13:33.195 TradeProcessor (EURUSD,H1) Take Profit level of the order: 0.0000 QK 0 18:13:33.195 TradeProcessor (EURUSD,H1) StopLimit level of the order: 0.0000 QQ 0 18:13:33.195 TradeProcessor (EURUSD,H1) Trade symbol: GBPUSD RD 0 18:13:33.195 TradeProcessor (EURUSD,H1) Type of the order: ORDER_TYPE_BUY_LIMIT LS 0 18:13:33.195 TradeProcessor (EURUSD,H1) Order execution type: ORDER_FILLING_RETURN MN 0 18:13:33.195 TradeProcessor (EURUSD,H1) Order expiration type: ORDER_TIME_GTC IK 0 18:13:33.195 TradeProcessor (EURUSD,H1) Volume in lots: 0.14 NS 0 18:13:33.195 TradeProcessor (EURUSD,H1) CD 0 18:13:33.195 TradeProcessor (EURUSD,H1) ---===Response===--- RQ 0 18:13:33.195 TradeProcessor (EURUSD,H1) Code of the operation result: 10009 JI 0 18:13:33.195 TradeProcessor (EURUSD,H1) Ticket of the deal: 0 GM 0 18:13:33.195 TradeProcessor (EURUSD,H1) Ticket of the order: 22535983 LF 0 18:13:33.195 TradeProcessor (EURUSD,H1) Volume of the deal: 0.14 JN 0 18:13:33.195 TradeProcessor (EURUSD,H1) Price of the deal: 0.0000 MK 0 18:13:33.195 TradeProcessor (EURUSD,H1) Bid: 0.0000 CM 0 18:13:33.195 TradeProcessor (EURUSD,H1) Ask: 0.0000 IG 0 18:13:33.195 TradeProcessor (EURUSD,H1) Comment to the operation: DQ 0 18:13:33.195 TradeProcessor (EURUSD,H1) Request ID: 1
İşleyicinin ikinci çağrısı, talimatı açık olanlar listesine ekleyecektir (Şekil 9).
Şek.9. Tür alanı TRADE_TRANSACTION_ORDER_ADDED'a eşittir
Logda sadece "İşlem" bloğunu görmemiz gereklidir.
HJ 0 18:17:02.886 TradeProcessor (EURUSD,H1) ---===Transaction===--- GQ 0 18:17:02.886 TradeProcessor (EURUSD,H1) Ticket of the deal: 0 CH 0 18:17:02.886 TradeProcessor (EURUSD,H1) Type of the deal: DEAL_TYPE_BUY RL 0 18:17:02.886 TradeProcessor (EURUSD,H1) Ticket of the order: 22535983 II 0 18:17:02.886 TradeProcessor (EURUSD,H1) Status of the order: ORDER_STATE_STARTED OG 0 18:17:02.886 TradeProcessor (EURUSD,H1) Type of the order: ORDER_TYPE_BUY_LIMIT GL 0 18:17:02.886 TradeProcessor (EURUSD,H1) Price: 1.6500 IE 0 18:17:02.886 TradeProcessor (EURUSD,H1) Level of Stop Loss: 0.0000 CO 0 18:17:02.886 TradeProcessor (EURUSD,H1) Level of Take Profit: 0.0000 IF 0 18:17:02.886 TradeProcessor (EURUSD,H1) Price that triggers the Stop Limit order: 0.0000 PL 0 18:17:02.886 TradeProcessor (EURUSD,H1) Trade symbol: GBPUSD OL 0 18:17:02.886 TradeProcessor (EURUSD,H1) Pending order expiration time: 1970.01.01 00:00 HJ 0 18:17:02.886 TradeProcessor (EURUSD,H1) Order expiration type: ORDER_TIME_GTC LF 0 18:17:02.886 TradeProcessor (EURUSD,H1) Type of the trade transaction: TRADE_TRANSACTION_ORDER_ADD FR 0 18:17:02.886 TradeProcessor (EURUSD,H1) Volume in lots: 0.14
İşleyicinin üçüncü çağrısı, verileri verilen sıraya göre yenileyecektir (Şekil 10).
Talimat statüsü özellikle ORDER_STATE_PLACED değerini alacaktır.
Şek.10. Tür alanı TRADE_TRANSACTION_ORDER_UPDATE'e eşittir
Logdaki "İşlem" bloğundaki kayıtları görmemiz gereklidir.
HS 0 18:21:27.004 TradeProcessor (EURUSD,H1) ---===Transaction==--- GF 0 18:21:27.004 TradeProcessor (EURUSD,H1) Ticket of the deal: 0 CO 0 18:21:27.004 TradeProcessor (EURUSD,H1) Type of the deal: DEAL_TYPE_BUY RE 0 18:21:27.004 TradeProcessor (EURUSD,H1) Ticket of the order: 22535983 KM 0 18:21:27.004 TradeProcessor (EURUSD,H1) Status of the order: ORDER_STATE_PLACED QH 0 18:21:27.004 TradeProcessor (EURUSD,H1) Type of the order: ORDER_TYPE_BUY_LIMIT EG 0 18:21:27.004 TradeProcessor (EURUSD,H1) Price: 1.6500 GL 0 18:21:27.004 TradeProcessor (EURUSD,H1) Level of Stop Loss: 0.0000 ED 0 18:21:27.004 TradeProcessor (EURUSD,H1) Level of Take Profit: 0.0000 GO 0 18:21:27.004 TradeProcessor (EURUSD,H1) Price that triggers the Stop Limit order: 0.0000 RE 0 18:21:27.004 TradeProcessor (EURUSD,H1) Trade symbol: GBPUSD QS 0 18:21:27.004 TradeProcessor (EURUSD,H1) Pending order expiration time: 1970.01.01 00:00 JS 0 18:21:27.004 TradeProcessor (EURUSD,H1) Order expiration type: ORDER_TIME_GTC RD 0 18:21:27.004 TradeProcessor (EURUSD,H1) Type of the trade transaction: TRADE_TRANSACTION_ORDER_UPDATE JK 0 18:21:27.004 TradeProcessor (EURUSD,H1) Volume in lots: 0.14
Buradaki en önemli dize, talimat statüsüdür.
Pozisyonların işlenmesinden farklı olarak, bekleyen talimatların işlenmesi şema ile uygulanamaz. Beklemede olan bir talimatla bağlantılı her alım satım işlemi, alım satım işlemi türleri içinde benzersiz olacaktır.
Beklemede olan bir talimat vermek üç işlemle yapılır (Şek. 11).
Şek.11. İşlemler, İşlemler, beklemede olan bir talimatın işleme koyulması
Beklemede olan bir talimatı değiştirmek, iki işlem yaratacaktır (Şek. 12).
Şek.12. İşlemler, beklemede olan bir talimat değişikliğinin işlenmesi
Beklemede olan talimat silinecekse, o zaman OnTradeTransaction() işleyicisi dört kez çağrılır (Şek. 13).
Şek.13. İşlemler, beklemede olan bir talimat silinmesinin işlenmesi
Beklemede olan bir talimatın silinmesi aşağıdaki şema ile tanımlanır (Şek. 14).
Şek.14. İşlemler, bekleyen talimatın silinmesinin işlenmesi
Bekleyen bir talimatın tetiklenmesi, son alım satım işlemi dört farklı işlemi tetikleyecektir (Şekil 15).
Şek.15. İşlemler, bekleyen bir siparişin aktivasyonunun işlenmesi
Her işlem kombinasyonu için log girişleri vermeyeceğim. Okuyucu bu kadar istekli hissediyorsa, kodu çalıştırarak bunları inceleyebilir.
4. Evrensel İşleyici
TradeTransaction etkinliği ile çalışabilecek programa son kullanıcının gözünden bir göz atalım. Son kullanıcının hem talimatlar hem de pozisyonlar ile kusursuz çalışabilecek bir programa ihtiyacı olması çok muhtemeldir. Bir programcı, OnTradeTransaction() kodunu, neyin işlendiğine (bir pozisyon veya talimat) aldırmadan tüm işlemleri ve bunların kombinasyonlarını tanımlamasına izin verecek şekilde yazmalıdır. İdeal olarak, program işlem dizisinin işlenmesi tamamlandıktan sonra hangi operasyonun gerçekleştiğini gösterebilmelidir.
Aşağıdaki örnekte, işlemi sıralı işleme yöntemi kullanılmaktadır. MQL5 geliştiricisi aşağıdakileri belirtir:
Yani ideale yakın çalışan bir program yazmak isteniyorsa, önerilen örneği iyileştirebilir ve işlemlerin geliş sırasından bağımsız olarak işlenmesini sağlayabilirsiniz.
Genel olarak, pozisyonlar ve talimatlar ortak işlem türlerine sahip olabilir. 11 çeşit işlem vardır. Bu sayıdan sadece dördünün terminalde alım satım işlemiyle ilgisi var:
- TRADE_TRANSACTION_DEAL_UPDATE;
- TRADE_TRANSACTION_DEAL_DELETE;
- TRADE_TRANSACTION_HISTORY_UPDATE;
- TRADE_TRANSACTION_HISTORY_DELETE.
Bu makalede bunları tartışmayacağız. Geliştiriciye göre bu türler, ticaret sunucusu tarafında işlevselliği genişletmek için tasarlandı. İtiraf etmeliyim ki daha önce bu türlerle uğraşmadım.
Bu, bize en sık OnTradeTransaction() içinde işlenen tam özellikli yedi tür bırakmaktadır.
İşleyicinin gövdesindeki geçerli işlem türünü tanımlayan bölüm önemli bir role sahip olacaktır.
//--- ========== Types of transaction [START] switch(trans_type) { //--- 1) if it is a request case TRADE_TRANSACTION_REQUEST: { //--- break; } //--- 2) if it is an addition of a new open order case TRADE_TRANSACTION_ORDER_ADD: { //--- break; } //--- 3) if it is a deletion of an order from the list of open ones case TRADE_TRANSACTION_ORDER_DELETE: { //--- break; } //--- 4) if it is an addition of a new order to the history case TRADE_TRANSACTION_HISTORY_ADD: { //--- break; } //--- 5) if it is an addition of a deal to history case TRADE_TRANSACTION_DEAL_ADD: { //--- break; } //--- 6) if it is a modification of a position case TRADE_TRANSACTION_POSITION: { //--- break; } //--- 7) if it is a modification of an open order case TRADE_TRANSACTION_ORDER_UPDATE: { //--- break; } } //--- ========== Types of transactions [END]
Hangi alım satım işlemini yaptığımızı mevcut işlem türüne göre tanımlamaya çalışacağız. Neyle çalıştığımızı anlamak için - bir pozisyon veya bir talimat, alım satım operasyon türünü hatırlatma işlemini, talep işleme durum modülüne devredeceğiz.
Modülün kendisi aşağıdaki gibi görünecektir:
//--- 1) if it is a request case TRADE_TRANSACTION_REQUEST: { //--- last_action=request.action; string action_str; //--- what is the request for? switch(last_action) { //--- а) on market case TRADE_ACTION_DEAL: { action_str="place a market order"; trade_obj=TRADE_OBJ_POSITION; break; } //--- б) place a pending order case TRADE_ACTION_PENDING: { action_str="place a pending order"; trade_obj=TRADE_OBJ_ORDER; break; } //--- в) modify position case TRADE_ACTION_SLTP: { trade_obj=TRADE_OBJ_POSITION; //--- StringConcatenate(action_str,request.symbol,": modify the levels of Stop Loss", " and Take Profit"); //--- break; } //--- г) modify order case TRADE_ACTION_MODIFY: { action_str="modify parameters of the pending order"; trade_obj=TRADE_OBJ_ORDER; break; } //--- д) delete order case TRADE_ACTION_REMOVE: { action_str="delete pending order"; trade_obj=TRADE_OBJ_ORDER; break; } } //--- if(InpIsLogging) Print("Request received: "+action_str); //--- break; }
Bu durumda birkaç değişkeni değiştirmek zor değildir.
static ENUM_TRADE_REQUEST_ACTIONS last_action; // market operation at the first pass
last_action değişkeni, olay işleyicinin neden başlatıldığını hatırlatacaktır.
static ENUM_TRADE_OBJ trade_obj; // specifies the trade object at the first pass
trade_obj değişkeni, işleneni - bir pozisyon veya bir talimat- bellekte tutacaktır. Bunun için ENUM_TRADE_OBJ numaralandırmasını oluşturacağız.
Ardından TRADE_TRANSACTION_ORDER_ADD türündeki işlemleri gerçekleştirecek olan modüle geçeceğiz:
//--- 2) if it is an addition of a new open order case TRADE_TRANSACTION_ORDER_ADD: { if(InpIsLogging) { if(trade_obj==TRADE_OBJ_POSITION) Print("Open a new market order: "+ EnumToString(trans.order_type)); //--- else if(trade_obj==TRADE_OBJ_ORDER) Print("Place a new pending order: "+ EnumToString(trans.order_type)); } //--- break; }
Bu modül oldukça basittir. Pozisyon ilk adımda işlendiği için, mevcut olanda "Yeni bir piyasa talimatı aç" log girişi, aksi takdirde "Beklemede olan yeni bir talimat verin" görünecektir. Bu blokta bilgilendirme dışında başka bir işlem yoktur.
Şimdi TRADE_TRANSACTION_ORDER_DELETE türünü işleyen üçüncü modülün sırasıdır:
//--- 3) if it is a deletion of an order from the list of open ones case TRADE_TRANSACTION_ORDER_DELETE: { if(InpIsLogging) PrintFormat("Order deleted from the list of open ones: #%d, "+ EnumToString(trans.order_type),trans.order); //--- break; }
Ayrıca bu modül sadece bilgilendirici bir role sahiptir.
Dördüncü durum modülü, TRADE_TRANSACTION_HISTORY_ADD türünü işler:
//--- 4) if it is an addition of a new order to the history case TRADE_TRANSACTION_HISTORY_ADD: { if(InpIsLogging) PrintFormat("Order added to the history: #%d, "+ EnumToString(trans.order_type),trans.order); //--- if a pending order is being processed if(trade_obj==TRADE_OBJ_ORDER) { //--- if it is the third pass if(gTransCnt==2) { //--- if the order was canceled, check the deals datetime now=TimeCurrent(); //--- request the history of orders and deals HistorySelect(now-PeriodSeconds(PERIOD_H1),now); //--- attempt to find a deal for the order CDealInfo myDealInfo; int all_deals=HistoryDealsTotal(); //--- bool is_found=false; for(int deal_idx=all_deals;deal_idx>=0;deal_idx--) if(myDealInfo.SelectByIndex(deal_idx)) if(myDealInfo.Order()==trans.order) is_found=true; //--- if the deal was not found if(!is_found) { is_to_reset_cnt=true; //--- PrintFormat("Order canceled: #%d",trans.order); } } //--- if it is the fourth pass if(gTransCnt==3) { is_to_reset_cnt=true; PrintFormat("Order deleted: #%d",trans.order); } } //--- break; }
Bu modül, talimatın geçmişe eklendiği kaydına ek olarak, başlangıçta bekleyen bir emir ile çalışıp çalışmadığımızı kontrol eder. Bunu yaptığımız durumda, işleyicinin mevcut geçişinin hangi numaraya sahip olduğunu bulmamız gereklidir. Mesele şu ki bu tür bir işlem, beklemede olan talimat iptal edildiyse, talimat ile çalışılırken üçüncü geçişte ortaya çıkabilir. Dördüncü geçişte, beklemede olan talimat silindiğinde bu tür ortaya çıkabilir.
Üçüncü geçişi kontrol eden modül dizilerinde, yatırımların geçmişine bir kez daha bakmamız gereklidir. Mevcut talimat için bir yatırım bulunamazsa, bu şekilde bir talimatı iptal edilmiş sayacağız.
Beşinci durum modülü, TRADE_TRANSACTION_DEAL_ADD türünü işler. Bu dize boyutuna göre programın en büyük bloğudur.
Yatırım bu blokta kontrol edilir. Özelliklerine erişmek için bilete göre bir yatırım seçmek önemlidir. Yatırım türü, pozisyonun açık, kapalı vb. olup olmadığı konusunda bilgi sağlayabilir. Beklemede olan bir talimatın tetiklenmesiyle ilgili bilgiler de buradan alınabilir. Beklemede olan bir talimat TradeTransaction olay işleyicisinin çalışma bağlamında yatırım oluşturabileceği tek durumdur.
//--- 5) if it is an addition of a deal to history case TRADE_TRANSACTION_DEAL_ADD: { is_to_reset_cnt=true; //--- ulong deal_ticket=trans.deal; ENUM_DEAL_TYPE deal_type=trans.deal_type; //--- if(InpIsLogging) PrintFormat("Deal added to history: #%d, "+EnumToString(deal_type),deal_ticket); if(deal_ticket>0) { datetime now=TimeCurrent(); //--- request the history of orders and deals HistorySelect(now-PeriodSeconds(PERIOD_H1),now); //--- select a deal by the ticket if(HistoryDealSelect(deal_ticket)) { //--- check the deal CDealInfo myDealInfo; myDealInfo.Ticket(deal_ticket); long order=myDealInfo.Order(); //--- parameters of the deal ENUM_DEAL_ENTRY deal_entry=myDealInfo.Entry(); double deal_vol=0.; //--- if(myDealInfo.InfoDouble(DEAL_VOLUME,deal_vol)) if(myDealInfo.InfoString(DEAL_SYMBOL,deal_symbol)) { //--- position CPositionInfo myPos; double pos_vol=WRONG_VALUE; //--- if(myPos.Select(deal_symbol)) pos_vol=myPos.Volume(); //--- if the market was entered if(deal_entry==DEAL_ENTRY_IN) { //--- 1) opening of a position if(deal_vol==pos_vol) PrintFormat("\n%s: new position opened",deal_symbol); //--- 2) addition to the open position else if(deal_vol<pos_vol) PrintFormat("\n%s: addition to the current position",deal_symbol); } //--- if the market was exited else if(deal_entry==DEAL_ENTRY_OUT) { if(deal_vol>0.0) { //--- 1) closure of a position if(pos_vol==WRONG_VALUE) PrintFormat("\n%s: position closed",deal_symbol); //--- 2) partial closure of the open position else if(pos_vol>0.0) PrintFormat("\n%s: partial closing of the current position",deal_symbol); } } //--- if position was reversed else if(deal_entry==DEAL_ENTRY_INOUT) { if(deal_vol>0.0) if(pos_vol>0.0) PrintFormat("\n%s: position reversal",deal_symbol); } } //--- order activation if(trade_obj==TRADE_OBJ_ORDER) PrintFormat("Pending order activation: %d",order); } } //--- break; }
TRADE_TRANSACTION_POSITION işlem türü benzersizdir ve yalnızca bir pozisyon değiştirildiğinde işlenir:
//--- 6) if it is a modification of a position case TRADE_TRANSACTION_POSITION: { is_to_reset_cnt=true; //--- PrintFormat("Modification of a position: %s",deal_symbol); //--- if(InpIsLogging) { PrintFormat("New price of stop loss: %0."+ IntegerToString(_Digits)+"f",trans.price_sl); PrintFormat("New price of take profit: %0."+ IntegerToString(_Digits)+"f",trans.price_tp); } //--- break; }
Son durum modülü, TRADE_TRANSACTION_ORDER_UPDATE türü işlenirken etkinleştirilir.
Bu tür yalnızca beklemede olan bir talimatla çalışmak için ortaya çıkar. Beklemede olan talimatla ilgili herhangi bir alım satım işleminin tetiklenmesiyle başlar ancak aşama değişebilir.
//--- 7) if it is a modification of an open order case TRADE_TRANSACTION_ORDER_UPDATE: { //--- if it was the first pass if(gTransCnt==0) { trade_obj=TRADE_OBJ_ORDER; PrintFormat("Canceling the order: #%d",trans.order); } //--- if it was the second pass if(gTransCnt==1) { //--- if it is an order modification if(last_action==TRADE_ACTION_MODIFY) { PrintFormat("Pending order modified: #%d",trans.order); //--- clear counter is_to_reset_cnt=true; } //--- if it is deletion of the order if(last_action==TRADE_ACTION_REMOVE) { PrintFormat("Delete pending order: #%d",trans.order); } } //--- if it was the third pass if(gTransCnt==2) { PrintFormat("A new pending order was placed: #%d, "+ EnumToString(trans.order_type),trans.order); //--- clear counter is_to_reset_cnt=true; } //--- break; }
Özetle bu tür OnTradeTransaction() tanıtıcısının ilk tetiklenmesinde ortaya çıktıysa, o zaman talimat iptal edilmiştir ya da gerçekleşmiştir.
Tür, olay işleyicinin ikinci başlatmasında ortaya çıktıysa, o zaman talimat silinmiştir veya değiştirilmiştir. Talimatın tam olarak ne ile sonuçlandığını öğrenmek için, son alım satım işlemiyle ilgili verileri içeren statik değişken last_action'a bakın.
Olay işleyicisinin üçüncü başlatması, bu türün görünebileceği son durumdur. Üçüncü başlatma, beklemede olan talimat verme prosedürünü tamamlar.
Ayrıca kodda boolean değişkeni is_to_reset_cnt kullanılır. Bu OnTradeTransaction() tanıtıcısı geçişlerinin sayacını temizlemek için bir bayrak rolüne sahiptir.
Bu tamamen TradeTransaction olayının işlenmesiyle ilgilidir. Ayrıca, işleyici çağrısının başına duraklama eklemek isterim. Bu, geçmişe dönerken yatırım veya talimatın ertelenme şansını en aza indirecektir.
Sonuç
Bu makalede, farklı alım satım operasyonlarının nasıl çalışabileceğini ve terminalde olup bitenler hakkında nasıl bilgi alınabileceğini göstermeye çalıştım.
Bu yaklaşımın en büyük avantajı, alım satım operasyonunun aşamalı uygulaması hakkında programın bilgi alabilmesidir. Benim görüşüme göre, böyle bir yaklaşım yatırımları bir terminalden diğerine kopyalamak için kullanılabilir.
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/1111
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz