English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
MQL5 Cookbook: TradeTransaction Olayının İşlenmesi

MQL5 Cookbook: TradeTransaction Olayının İşlenmesi

MetaTrader 5Örnekler | 14 Ocak 2022, 13:06
149 0
Denis Kirichenko
Denis Kirichenko

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:

  1. Bir alım satım talebi yapın;
  2. Alım satım talebini doğrulayın;
  3. Takas talebini sunucuya gönderin;
  4. 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:

  1. MQL5 programı, sunucudan tamamlanan talebin sonucu hakkında bir bildirim alır;
  2. Tek biletli talimat şeklindeki talep, açık siparişler listesine dahil edilir;
  3. Talimat gerçekleştirildikten sonra, açık talimat listesinden silinir;
  4. Ardından talimat, hesap geçmişine gider;
  5. 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

Ş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

Ş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.

Ş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_HISTORY_ADD'ye eşittir

Ş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

Ş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ı

Ş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ı

Ş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.

Ş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

Ş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.

Ş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, beklemede olan bir talimatın işleme koyulması

Ş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

Ş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

Ş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, beklemede olan bir talimat silinmesinin işlenmesi

Ş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 talimatın aktivasyonunun işlenmesi

Ş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:

...Terminalden veya OrderSend()/OrderSendAsync() işlevleri aracılığıyla manuel olarak gönderilen bir işlem talebi, işlem sunucusunda birkaç ardışık işlem oluşturabilir. Bu işlemlerin terminale varış önceliği garanti edilmez, bu nedenle işlem algoritması, bir grup işlemin birbiri ardına geleceği varsayımına dayalı olmamalıdır. Buna ek olarak, sunucudan terminale teslimat sırasında işlemler kaybolabilir...

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

Ekli dosyalar |
tradeprocessor.mq5 (31.35 KB)
MQL5 Cookbook: Özel Grafik Olaylarını İşleme MQL5 Cookbook: Özel Grafik Olaylarını İşleme
Bu makale, MQL5 ortamındaki özel grafik olayları sisteminin tasarım ve geliştirme yönlerini ele almaktadır. Olay sınıflandırmasına yaklaşım örneği, özel olay işleyici sınıfı ve olay sınıfı program kodunun yanı sıra burada da bulunabilir.
Üçüncü Nesil Nöral Ağlar: Derin Ağlar Üçüncü Nesil Nöral Ağlar: Derin Ağlar
Bu makale, makine öğreniminde yeni ve perspektif bir yön için ayrılmıştır - derin öğrenme veya daha doğrusu derin nöral ağlar. Bu, ikinci nesil nöral ağlar, bağlantılarının mimarisi ve ana türleri, öğrenme yöntemleri ve kuralları ve ana dezavantajları, ardından üçüncü nesil nöral ağ geliştirme tarihi, ana türleri, özellikleri ve eğitim yöntemleri hakkında kısa bir incelemedir. Gerçek veriler ile yığınlanmış bir otomatik kodlayıcının ağırlıkları tarafından başlatılan derin nöral ağ oluşturma ve eğitimi üzerine pratik deneyler yürütülmektedir. Girdi verilerinin seçilmesinden metrik türetmeye kadar tüm aşamalar ayrıntılı olarak tartışılmıştır. Makalenin son kısmı, MQL4/R'ye dayalı yerleşik göstergeye sahip bir Expert Advisor içinde derin nöral ağın yazılım uygulamasını içermektedir.
Rastgele Ormanlar Öngörü Trendleri Rastgele Ormanlar Öngörü Trendleri
Bu makale, Forex'te döviz çiftlerinin uzun ve kısa pozisyonlarını tahmin ederek formasyonların otomatik araması için Rattle paketi kullanmayı ele almaktadır. Bu makale hem acemi hem de deneyimli yatırımcılar için faydalı olabilir.
MetaTrader Sinyalleri hizmetini ve Sosyal Alım Satımı nasıl geliştirdik? MetaTrader Sinyalleri hizmetini ve Sosyal Alım Satımı nasıl geliştirdik?
Sinyal hizmetini geliştirmeye, mekanizmaları iyileştirmeye, yeni işlevler eklemeye ve kusurları düzeltmeye devam ediyoruz. 2012'nin MetaTrader Sinyal Hizmeti ve mevcut MetaTrader Sinyal Hizmeti tamamen farklı iki hizmet gibidir. Şu anda, MetaTrader istemci terminalinin belirli sürümlerini desteklemesi için sunucu ağından oluşan Sanal Barındırma Bulut hizmetini uyguluyoruz.