- www.mql5.com
if (prev_calculated) EventChartCustom(Chart, 0, Index, 0, NULL);Olay kuyruğa alınmamışsa, tikleri atlayabilirsiniz. Bazen böyle olur (genellikle VPS’lerde veya yavaş bilgisayarlarda).
Ne yazık ki, sadece OnTick işlevine sahip basit danışmanlar bile tikleri atlar. İşlevsel danışmanlar için, tikleri atlamadan çalışabilmeleri amacıyla CopyTicks işlevleri ve diğer hileler kullanılır.
Bu kütüphane, yalnızca Test Cihazında tikleri kesinlikle atlamadığını garanti eder. Her şey OnTick ile olduğu gibi aynıdır.
/* // https://www.mql5.com/ru/blogs/post/755348 #define VIRTUAL_TESTER_MULTI // OnTickMulti sanal ticaret ortamında çalıştırma #define VIRTUAL_LIMITS_TP_SLIPPAGE // Limit emirleri ve TP, ilk kabul edilen fiyattan gerçekleştirilir - pozitif kayma #define VIRTUAL_CLOSEALL_BYEND // Testin sonunda tüm emirleri zorla kapatır // #define VIRTUAL_ALTERNATIVE // Alternatif hesaplama hızı */ #include <MT4Orders.mqh> // https://www.mql5.com/tr/code/16006 #include <fxsaber\OnTickMulti\OnTickMulti.mqh> // https://www.mql5.com/tr/code/47647 /* #define REPORT_TESTER // Test programında raporlar otomatik olarak kaydedilecektir #define REPORT_BROWSER // Tarayıcıyı başlatarak rapor oluşturma - DLL izni gerektirir. #include <Report.mqh> // https://www.mql5.com/tr/code/18801 */ input group "Trading" input double LotSize=0.01; input double TPdist=0.1; // TP (%) input double SLdist=0.2; // SL (%) input long MyMagic=123; input group "Benchmark: https://www.mql5.com/ru/forum/282062/page49#comment_50801337" input int inRange = 0; // Çok karakterli OnTick. void OnTickMulti( const string &Symb, const int &Index ) { TradeStep(Symb, Index); } double OnTester() { return AccountInfoDouble(ACCOUNT_BALANCE); } int GetHour( const datetime time ) { return((int)(time / 3600) % 24); } void TradeStep( const string &symbol, const int &Index ) { if(GetHour(TimeTradeServer()) < 2) return; DoTrade(symbol, Index); } bool IsMySymbol( const string &Symb, const int &Index ) { return(OnTickMulti.IsOnlySymbolBase || ( #ifdef __VIRTUAL__ VIRTUAL::GetHandle() ? (OrderSymbolID() == Index) : // https://www.mql5.com/ru/forum/282062/page52#comment_51051261 #endif // #ifdef __VIRTUAL__ (OrderSymbol() == Symb))); } void DoTrade(const string &symbol, const int &Index ) { int total=OrdersTotal(); bool haveBuy=false; bool haveSell=false; for(int i=0; i<total; i++) { if(OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber()==MyMagic && IsMySymbol(symbol, Index)) { int type=OrderType(); if(type==OP_BUY) haveBuy=true; if(type==OP_SELL) haveSell=true; } } if(!haveBuy) { double price=SymbolInfoDouble(symbol,SYMBOL_ASK); int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); double tp=NormalizeDouble(price*(1.0+TPdist/100.0), digits); double sl=NormalizeDouble(price*(1.0-SLdist/100.0), digits); OrderSend( symbol, OP_BUY, LotSize, price, 0, sl, tp, NULL, MyMagic); } if(!haveSell) { double price=SymbolInfoDouble(symbol,SYMBOL_BID); int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); double tp=NormalizeDouble(price*(1.0-TPdist/100.0), digits); double sl=NormalizeDouble(price*(1.0+SLdist/100.0), digits); OrderSend( symbol, OP_SELL, LotSize, price, 0, sl, tp, NULL, MyMagic); } }
Test Cihazı Ayarları.
Hızlandırma.
Başlangıçtaki birkaç satırı yorum satırından çıkararak hızlandırma sağlanabilir.
| Yapılandırma | Sonuç |
|---|---|
| Virtual.mqh olmadan. | en kısa geçiş süresi 0:00:13.184, en uzun geçiş süresi 0:00:15.031, ortalama geçiş süresi 0:00:13.633 |
| Virtual.mqh ile, inVirtualTester = false. | en kısa geçiş süresi 0:00:14.735, en uzun geçiş süresi 0:00:16.384, ortalama geçiş süresi 0:00:15.081 |
| Virtual.mqh ile, inVirtualTester = true. | en kısa geçiş süresi 0:00:05.872, en uzun geçiş süresi 0:00:05.964, ortalama geçiş süresi 0:00:05.919 |
| Virtual.mqh ile, inVirtualTester = true + VIRTUAL_ALTERNATIVE. | en kısa geçiş süresi 0:00:06,172, en uzun geçiş süresi 0:00:07,791, ortalama geçiş süresi 0:00:06,524 |
Ekspert danışman son derece basittir (her bir sembol için 0-2 açık pozisyon, sabit SL/TP değerleri, ertelenmiş emirler yok); bu nedenle bu varyantta yalnızca 2,5 kat hız artışı elde edilebilir.
TickValue+Swap+Commission.
Yukarıdaki testler, her tikte TickValue'yi yeniden hesaplamak zorunda kalmamak için pip modunda gerçekleştirilmiştir (ayar ekranına bakınız); bunun için diğer semboller eklenmiştir. Bu modda sonuçlar aynıdır.
Tam hızda hızlandırma gerekiyorsa, bu çözümü kullanmanız gerekir.
- 2023.12.25
- www.mql5.com
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesine ilişkin forum
fxsaber, 18.03.2024 18:36
void DoTrade(const string &symbol, const int &Index ) { int total=OrdersTotal(); bool haveBuy=false; bool haveSell=false; for(int i=0; i<total; i++) { if(OrderSelect(i, SELECT_BY_POS) && (OrderMagicNumber()==Index)) { int type=OrderType(); if(type==OP_BUY) haveBuy=true; if(type==OP_SELL) haveSell=true; } } if(!haveBuy) { double price=SymbolInfoDouble(symbol,SYMBOL_ASK); int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); double tp=NormalizeDouble(price*(1.0+TPdist/100.0), digits); double sl=NormalizeDouble(price*(1.0-SLdist/100.0), digits); OrderSend( symbol, OP_BUY, LotSize, price, 0, sl, tp, NULL, Index); } if(!haveSell) { double price=SymbolInfoDouble(symbol,SYMBOL_BID); int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); double tp=NormalizeDouble(price*(1.0-TPdist/100.0), digits); double sl=NormalizeDouble(price*(1.0+SLdist/100.0), digits); OrderSend( symbol, OP_SELL, LotSize, price, 0, sl, tp, NULL, Index); } }
| Yapılandırma | Sonuç |
|---|---|
| Virtual.mqh olmadan. | en kısa geçiş 0:00:13.184, en uzun geçiş 0:00:15.031, ortalama geçiş 0:00:13.633 |
Yukarıda, herhangi bir Virtual kütüphanesi kullanmadan çoklu para birimli otomatik işlem sistemini hızlandırmanın basit bir yolunu kodda gösterdim.
| Yapılandırma | Sonuç |
|---|---|
| Virtual.mqh +MagicNumberOrderSymbol olmadan | en kısa geçiş süresi 0:00:08.608, en uzun geçiş süresi 0:00:10.236, ortalama geçiş süresi 0:00:08.942 |
1,5 kat hız artışı, hem de ücretsiz!
Tek karakterli moddan çoklu karakterli moda geçerken Testör'ün yavaşlamasını kontrol ettim. Bunu tam olarak kusursuz bir şekilde yapmadım — danışman boş bir danışman.
Tek sembollü danışman.
#property tester_no_cache input group "Benchmark: https://www.mql5.com/ru/forum/282062/page49#comment_50801337" input int inRange = 0; const ulong StartTime = GetMicrosecondCount(); int AmountTicks = 0; double OnTester() { return((double)(GetMicrosecondCount() - StartTime)); // return(AmountTicks); // return((double)AmountTicks / (GetMicrosecondCount() - StartTime)); } void OnTick() { AmountTicks++; }
| Yapılandırma (OnTick) | Zaman Uzunluğu (mcs) | Tick Sayısı | Performans (tick/mcs) |
|---|---|---|---|
| EURUSD | 1079331 | 9927153 | 9,19 |
| GBPUSD | 1229032 | 11309740 | 9,20 |
| USDJPY | 1307322 | 11986756 | 9,16 |
| USDCHF | 1121541 | 10359511 | 9,23 |
| AUDUSD | 1175578 | 10758136 | 9,15 |
Tester'ın birim zamandaki tik sayısı olarak ifade edilen performansının sembole bağlı olmadığı açıkça görülmektedir (pip modunda).
Çoklu sembol danışmanı.
#property tester_no_cache input group "Benchmark: https://www.mql5.com/ru/forum/282062/page49#comment_50801337" input int inRange = 0; #include <fxsaber\OnTickMulti\OnTickMulti.mqh> // https://www.mql5.com/tr/code/47647 const ulong StartTime = GetMicrosecondCount(); int AmountTicks = 0; double OnTester() { return((double)(GetMicrosecondCount() - StartTime)); // return(AmountTicks); // return((double)AmountTicks / (GetMicrosecondCount() - StartTime)); } // Çok karakterli OnTick. void OnTickMulti( const string &Symb, const int &Index ) { AmountTicks++; }
| Yapılandırma (OnTickMulti) | Zaman Uzunluğu (OnTickMulti) | Zaman Uzunluğu (OnTick) | Tik Sayısı | Performans (OnTickMulti) | Performans (OnTick) |
|---|---|---|---|---|---|
| EURUSD | 3455901 | 1.079.331 | 9927153 | 2,87 | 9,19 |
| EURUSD, GBPUSD | 6617085 | 2.308.363 | 21236893 | 3,20 | 9,19 |
| EURUSD, GBPUSD, USDJPY | 9188781 | 3615685 | 33223649 | 3,61 | 9,18 |
| EURUSD, GBPUSD, USDJPY, USDCHF | 11517804 | 4737226 | 43.583.160 | 3,78 | 9,20 |
| EURUSD, GBPUSD, USDJPY, USDCHF, AUDUSD | 16058223 | 5912804 | 54.341.296 | 3,38 | 9,19 |
Verimlilik, karakter sayısına çok az bağlıdır, ancak yine de üç kat daha düşüktür.
Sonuç:
Eğer çoklu para birimli danışmanınız, birbirinden bağımsız tek para birimli alt TSS'lerin bir karışımı ise, (en azından) her bir alt TS'yi ayrı ayrı optimize etmek (ve ardından Validate aracılığıyla tek bir geçişte birleştirmek), hepsini tek bir çoklu para birimli danışman içinde toplu olarak optimize etmekten üç kat daha hızlı olacaktır.
- www.mql5.com
// Çok karakterli OnTick. void OnTickMulti( const string &Symb, const u int &Index )
Merhaba,
Görünüşe göre son derlemelerde (5200+) kod artık derlenmiyor:
#include <fxsaber\OnTickMulti\OnTickMulti.mqh> // Çok karakterli OnTick. int TicksCounter[]; // Her bir belirlenen karakter için gelen tik sayacı. void OnInit() { // Gelen tik sayacını başlatıyoruz. ArrayResize(TicksCounter, ArraySize(OnTickMulti.Symbols)); ArrayInitialize(TicksCounter, 0); } double OnTester() { // Belirtilen her bir karakter için gelen tik sayısını yazdırıyoruz. for (uint i = ArraySize(TicksCounter); (bool)i--;) Print(OnTickMulti.Symbols[i] + " - " + (string)TicksCounter[i] + " ticks."); ArrayPrint(OnTickMulti.Symbols); // OnTickMulti karakter listesi. return(0); } // Çok karakterli OnTick. void OnTickMulti( const string &Symb, const uint &Index ) { TicksCounter[Index]++; // Belirtilen karakter için gelen tik sayacını artırdık. }
Kütüphane,MQL5_b5200+ sürümündekideğişikliklere uygun olarak güncellendi.
- 2025.07.31
- www.mql5.com
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Web sitesi politikasını ve kullanım şartlarını kabul edersiniz


OnTickMulti:
Multisymbol OnTick.
Author: fxsaber