Kütüphaneler: OnTickMulti

 

OnTickMulti:

Multisymbol OnTick.

OnTickMulti

Author: fxsaber

 
Мультисимвольное виртуальное окружение.
Мультисимвольное виртуальное окружение.
  • www.mql5.com
Данный пост посвящен дополнительному функционалу библиотеки виртуального окружения Virtual : Мультисимвольность. Теперь можно торговать в VIrtual не по одному символу, а по любым в одном виртуальном
 
   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).
 
Alain Verleyen 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.

 
Aşağıda, OnTickMulti'nin kullanımını göstermeyi teklif ettiği, başkasına ait basit bir danışman kodunu bulabilirsiniz.
/*
// 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.


Ölçümler.

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.

OnTickMulti - с добавленными пересчетом прибыли в валюту депозита, свопами, комисссией в % за лот.
OnTickMulti - с добавленными пересчетом прибыли в валюту депозита, свопами, комисссией в % за лот.
  • 2023.12.25
  • www.mql5.com
Текущий вариант OnTickMulti https://www.mql5.com/ru/code/47647 считает прибыль в валюте каждого символа или можно получить в пипсах. Но на общий баланс они влияют в другой пропорции, согласно текущему
 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesine ilişkin forum

Kütüphaneler: OnTickMulti

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.

 
Apart modu eklendi.
Мультивалютный Apart-режим.
Мультивалютный Apart-режим.
  • www.mql5.com
Большинство мультивалютных советников представляют из себя портфель независимых (по логике торговых сигналов) друг от друга ТС, где если связь и есть, то за счет ММ - все ТС оказывают влияние на общие
 
OnTickMulti işlevinin imzası biraz değişti.
// Ç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.
}
 
Marat Sultanov #:

Görünüşe göre son derlemelerde (5200+) kod artık derlenmiyor

Kütüphane,MQL5_b5200+ sürümündekideğişikliklere uygun olarak güncellendi.

Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5 - Версия MetaTrader 5 расширила поддержку библиотеки линейной алгебры OpenBLAS.
Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5 - Версия MetaTrader 5 расширила поддержку библиотеки линейной алгебры OpenBLAS.
  • 2025.07.31
  • www.mql5.com
SylvesterEquationTriangular решает уравнение Сильвестра для вещественных квазитреугольных или комплексных треугольных матриц верхнетреугольные. SylvesterEquationTriangularBlocked решает уравнение Сильвестра для вещественных квазитреугольных или комплексных треугольных матриц верхнетреугольные матрицы