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

27 апреля 2018, 21:06
fxsaber
1
724

Платформа 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-брокерами и другими. Тонко настроить скальперов, проводить МО на еще одном источнике тиков и т.д.

Поделитесь с друзьями: