Использование cTrade, как источника тиковой истории пользовательских символов MT5

Платформа cTrade содержит тиковую историю, которую можно перенести в MT5.
Ниже показан вариант, как это сделать.
Поскольку совсем не знаю cTrade и C#, то использовал решение DataExportTicks, как основу cTrade-бота
1. Устанавливаем платформу (cTrade+cAlgo) от интересующего вас брокера.
2. Устанавливаем упомянутый советник.
3. Заменяем его исходник на этот.
// ------------------------------------------------------------------------------------------------- // // DataExportTicks // // This cBot is intended to download tick level history to an external CSV File. // Target file can not be open in excel or will fail to open export file. // // Export Historical // To use set the Backtest Begin date and End Test Date to reflect desired date range. // Set the time frame to 1 tick. // Set the backtest Data to "1 tick Data from Server" // Then start the backtest. // Some fields are not populated for backtesting // // Note: Calgo load all the backtest data into memory. It used over 2.88 // Gig of memory when I instructed back test to go back to Jan-1 2014. // didn't crash but did grind to a halt. You may want to limit // size of request. It created a size 1.082 Gig. // // // Note: Could not test with live data due to weekend. // Export Live Ticks // Can be used to download current ticks by runing as an active strategy. // If you open the file in shared mode with a readline() pending it will // deliver new ticks as they become available. // // When using to read data in other processes suggest using fast memory // RamDrive or fast SSD. Otherwise may need to use NamedPipe. Our other // process did not support windows named pipes so just using a fast SSD. // // Want to collaborate: www.linkedin.com/pub/joe-ellsworth/0/22/682/ or // http://bayesanalytic.com // // No Promises, No Warranty. Terms of use MIT http://opensource.org/licenses/MIT // ------------------------------------------------------------------------------------------------- using System; using System.Linq; using System.IO; using cAlgo.API; using cAlgo.API.Indicators; using cAlgo.API.Internals; using cAlgo.Indicators; namespace cAlgo { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FileSystem)] public class DataExportTicks : Robot { // QUESTION: How do I set default Source Timeframe to T1 (1 tick) //[Parameter("TimeFrame ")] //public TimeFrame TFrame { get; set; } // QUESTION: How do I get Backteset to default to 1 tick from server // so don't have to manually reset? [Parameter("Data Dir", DefaultValue = "c:\\download\\calgo")] public string DataDir { get; set; } [Parameter("GMT + Hour", DefaultValue = 3)] public double GMTOffset { get; set; } private string fiName; private System.IO.FileStream fstream; private System.IO.StreamWriter fwriter; private string csvhead = ""; protected override void OnStart() { var ticktype = MarketSeries.TimeFrame.ToString(); fiName = DataDir + "\\" + "exp-" + Symbol.Code + "-ticks.csv"; Print("fiName=" + fiName); if (System.IO.File.Exists(fiName) == false) { // generate new file with CSV header only if // one does not already exist. System.IO.File.WriteAllText(fiName, csvhead); } // had to open file this way to prevent .net from locking it and preventing // access by other processes when using to download live ticks. fstream = File.Open(fiName, FileMode.Open, FileAccess.Write); // setup to append to end of file Print("File is Open"); fstream.Seek(0, SeekOrigin.Begin); // write stream has to be created after seek due to .net wierdness // creating with 0 prevents buffering since we want tick data // to be available to consumers right away. fwriter = new System.IO.StreamWriter(fstream); // QUESTION: How to tell when in Backtest mode so we // can create the stream with a large buffer and turn off // auto flush to improve IO performance. Print("Fwriter is created"); fwriter.AutoFlush = true; // with autoflush true will autocleanup // since we can not close since we may run forever Print("done onStart()"); } protected override void OnTick() { var sa = new System.Collections.Generic.List<string>(); sa.Add(MarketSeries.OpenTime.LastValue.AddHours(GMTOffset).ToString("yyyy-MM-dd HH:mm:ss.fff")); sa.Add(Symbol.Bid.ToString("F6")); sa.Add(Symbol.Ask.ToString("F6")); var sout = string.Join(",", sa); //System.IO.File.AppendAllText(fiName, sout); fwriter.WriteLine(sout); fwriter.Flush(); } protected override void OnStop() { Print("OnStop()"); fwriter.Close(); fstream.Close(); // Put your deinitialization logic here } } }
4. Компилируем.
5. Открываем Тестер.
6. Настраиваем свойства одиночного прогона и запускаем.
7. Появится соответствующий CSV-файл с тиковой историей.
8. Переносим его в песочницу MT5 - MQL5\Files\.
9. Запускаем в MT5 этот скрипт
// Создает пользовательский символ с тиковой историей из CSV-файла. #property script_show_inputs input string inSymbName = "TESTER"; // SymbolName input string inFileName = "exp-GBPAUD-ticks.csv"; // FileName with TickHistory #include <fxsaber\ThirdPartyTicks\CustomSymbol.mqh> // https://www.mql5.com/ru/code/20225 void CSVToSymbol( const string FileName, const string SymbName, const bool OpenChart = true ) { CUSTOMSYMBOL Symb(SymbName); // Создали символ if (Symb.IsCustom()) { Symb.SetProperty(SYMBOL_TRADE_STOPS_LEVEL, 0); // Сделали валюты символа валютой счета Symb.SetProperty(SYMBOL_CURRENCY_PROFIT, AccountInfoString(ACCOUNT_CURRENCY)); Symb.SetProperty(SYMBOL_CURRENCY_MARGIN, AccountInfoString(ACCOUNT_CURRENCY)); Symb.SetProperty(SYMBOL_CURRENCY_BASE, AccountInfoString(ACCOUNT_CURRENCY)); uchar Bytes[]; if (FileLoad(FileName, Bytes) > 0) { Print("Creating symbol - " + Symb.Name); const ulong StartTime = ::GetMicrosecondCount(); const long TotalTicks = Symb.AddTicks(Bytes); const ulong Interval = ::GetMicrosecondCount() - StartTime; Print("Total Ticks (" + FileName + ") = " + (_CS(true) ? (string)TotalTicks + (Interval ? " (" + (string)(TotalTicks * 1000000 / Interval) + " ticks/sec.)" : NULL) : "Stopped!")); Print("Recording..."); const int Amount = _CS(true) ? Symb.DataToSymbol() : -1; if (Amount <= 0) { Print(Symb.Name + " error write ticks - " + (_CS(true) ? (string)GetLastError() : "Stopped!")); Symb.Delete(); } else if (Symb.On()) { Print(Symb.Name + " saved ticks = " + (string)Amount); if (OpenChart) ChartOpen(Symb.Name, PERIOD_M1); } } } } void OnStart() { CSVToSymbol(inFileName, inSymbName); }
10. Будет создан пользовательский символ с тиковой историей из полученного CSV.
2018.04.27 19:59:55.723 Creating symbol - TESTER 2018.04.27 19:59:56.403 Total Ticks (exp-GBPAUD-ticks.csv) = 2161490 (3178572 ticks/sec.) 2018.04.27 19:59:56.403 Recording... 2018.04.27 20:00:04.086 TESTER saved ticks = 2161490
11. Теперь его можно использовать в Терминале и Тестере для MT5-советников/скриптов/индикаторов.
Для чего это может быть нужно.
Часто cTrade соседствует с MT4. Вы можете написать кроссплатформенный советник (MT4/5) и тестировать его по реальным тикам в Тестере/Оптимизаторе MT5, взяв показанным способом тиковую историю из cTrade. А далее с полученными настройками запустить советник в торговлю уже на MT4.
Также Вы можете быстро сравнить торговые условия cTrade-брокера с MT5-брокерами и другими. Тонко настроить скальперов, проводить МО на еще одном источнике тиков и т.д.