Основы программирования в cAlgo
Страница 1 из 3 1 2 3 ПоследняяПоследняя
Показано с 1 по 10 из 28

Тема: Основы программирования в cAlgo

  1. #1
    Программист Аватар для Azizkin
    Регистрация
    05.02.2013
    Адрес
    Шервудский лес
    Сообщений
    2,078
    Promo (¢)
    250
    Благодарности
    Получено: 2,119
    Отправлено: 3,717

    Question Основы программирования в cAlgo

    Создание советников и индикаторов в платформе cAlgo в настоящее время несколько затруднено из-за отсутствия справочных материалов на русском языке. Целью этой темы будет восполнение пробелов в процессе программирования советников и индикаторов cAlgo. Так как я не имею большого опыта в написании учебников, за основу будет взята стандартная справочная информация по API cAlgo с сайта производителя платформы. В дальнейшем, при необходимости, определенные ньюансы будут описаны подробнее. Материалы буду добавлять по мере наличия свободного времени, прошу отнестись с пониманием и сразу камнями не закидывать).

    Предисловие

    cBot-ы (далее советники) - это автоматизированные стратегии, которые могут совершать сделки без вашего присутствия или мониторинга. Можно кодировать cBot-ов с помощью редактора cAlgo, тестировать их для проверки и, наконец, выполнять их. Вам просто нужно запустить cBot-а для начала работы, в то же время у вас всегда есть возможность остановить его вручную или программно. cBot-ы облегчают точное выполнение сделок. Главным преимуществом автоматизированной торговли является то, что торговые приказы отправляются быстрее, чем вручную. Помимо этого, новая торговая API из cAlgo обеспечивает как синхронные, так и асинхронные методы алгоритмической торговли. Асинхронный режим означает, что каждый оператор в коде выполняется независимо от завершения предыдущего. Мы начнем с описания синхронных методов, а затем охватим асинхронные методы. Советники, которые будут присутствовать в статье, не предназначены для реальной торговли и используются только в качестве примеров. Кроме того, изучение этой темы предполагает базовые знания языка программирования C#.

    Создание шаблона для советника


    Чтобы создать новый шаблон советника, необходимо перейти на вкладку cBots, а затем нажать кнопку "Добавить" рядом с этой категорией.

    После этого в текстовом редакторе программы появится готовый шаблон нового советника.В самом начале шаблона объявляются необходимые библиотеки, объявляется пространство имен. Далее объявляются дополнительные атрибуты. Атрибуты советника с перечисленными свойствами, например, с часовым поясом, должны предшествовать объявлению класса имен и основному коду.
    В шаблоне уже указаны основные методы, необходимые для работы советника:
    OnStart()- метод,выполняемый при инициализации советника.
    OnTick() - метод, выполняемый при поступлении каждого нового тика.
    OnStop() - метод, выполняемый при деинициализации (остановке) советника.

    Код:
    using System;                 // подключение необходимых
    using cAlgo.API;              // для работы робота
    using cAlgo.API.Indicators;   // библиотек (DLL)
    using cAlgo.Indicators;       //
    
    namespace cAlgo.Robots        //объявление рабочего пространства имен
    {
     [Robot(TimeZone = TimeZones.UTC)] // дополнительные атрибуты советника
    
     public class NewcBot: Robot   // объявление класса имен 
      {
       protected override void OnStart()
        {
        // сюда вводится логика инициализации советника
        }
       protected override void OnTick()
        {
        // сюда вводится основная логика советника
        }
       protected override void OnStop()
        {
        // сюда вводится логика деинициализации при остановке советника
        }
      }
    }
    (...)

    Вы не можете благодарить!
    Последний раз редактировалось Azizkin; 02.11.2014 в 12:02.

  2. #2
    Теоретик
    Регистрация
    01.06.2013
    Сообщений
    624
    Promo (¢)
    635
    Благодарности
    Получено: 35
    Отправлено: 14
    О, наконец то ). Большущее спасибо что взялись за эту работу. Пускай даже не часто будете писать но это как для меня очень полезно. Можно будет наконец то пробовать что то самому написать. Вы как раз начали с того о чем я и просил. Кроме того Вроде бы Алексей Волчанский если захочет то думаю сможет помочь в этой теме.

    - - - Добавлено - - -

    Извините но у меня еще один вопрос: как сильно отличается C# от С++? Я начал изучать С++ и по нему есть много обучающих материалов. Стоит ли отдельно изучать C# или основные понятия и функции для них одинаковы. Кроме того где можно взять описание функций для cAlgo пускай и на английском, я попробую переводить (с помощью переводчика).

    Вы не можете благодарить!

  3. #3
    Программист Аватар для Azizkin
    Регистрация
    05.02.2013
    Адрес
    Шервудский лес
    Сообщений
    2,078
    Promo (¢)
    250
    Благодарности
    Получено: 2,119
    Отправлено: 3,717
    Цитата Сообщение от Vitalyak Посмотреть сообщение
    Извините но у меня еще один вопрос: как сильно отличается C# от С++?
    Разница есть, довольно существенная в синтаксисе. Но это все равно родственные языки. Изучайте, тем более что для DLL советников разница незаметна.

    Цитата Сообщение от Vitalyak Посмотреть сообщение
    Кроме того где можно взять описание функций для cAlgo пускай и на английском, я попробую переводить (с помощью переводчика).
    Можно использовать справку самой платформы - она располагается в правой вкладке. Там есть все основные функции с кратким описанием. Кроме того, документация есть на оф. сайте cAlgo.

    Вы не можете благодарить!

  4. #4
    Программист Аватар для Azizkin
    Регистрация
    05.02.2013
    Адрес
    Шервудский лес
    Сообщений
    2,078
    Promo (¢)
    250
    Благодарности
    Получено: 2,119
    Отправлено: 3,717
    Рыночные ордера

    Открытие рыночных ордеров производится с использованием функции ExecuteMarketOrder()
    Типичный синтаксис функции:
    Код:
    ExecuteMarketOrder(TradeType tradeType, Symbol symbol, long volume, string label, double? stopLossPips, double? takeProfitPips, double? marketRangePips, string comment)
    где:
    tradeType - тип открываемого ордера
    symbol - тикер валютной пары (по умолчанию текущий)
    volume - объем позиции в валюте ордера
    label - метка ордера
    stopLossPips - стоп-лосс
    takeProfitPips - тейк-профит
    marketRangePips - проскальзывание
    comment - комментарий.

    Пример 1 - Простой советник с выводом результата
    Следующий простой советник создает рыночный ордер и сохраняет результат в переменной, названной "result". Если выполнение приказа прошло успешно, цена открытия печатается в журнале.
    Код:
    [Robot]
    public class Sample_cBot: Robot
     {
     protected override void OnStart()
      {
       var result = ExecuteMarketOrder(TradeType.Buy, Symbol, 10000);
       if (result.IsSuccessful)
         {
         var position = result.Position;
         Print("Position entry price is {0}", position.EntryPrice);
         }
       }
     }
    Журнал
    | cBot "Sample_cBot" was started successfully for EURUSD, m1.
    | Executing Market Order to Buy 10k EURUSD
    | > Executing Market Order to Buy 10k EURUSD SUCCEEDED, Position PID156168
    | Position entry price is 1.34577

    Пример 2 - Простой советник с обработкой неудачного результата
    Если мы изменим параметр объема в примере на значение "-1", которое является недопустимым, в журнале появится запись об ошибке. Далее мы можем изменить советник, чтобы остановить его в случае такой ошибки:

    Код:
    [Robot(TimeZone = TimeZones.UTC)]
    public class Sample_cBot: Robot
     {
     protected override void OnStart()
      {
      var result = ExecuteMarketOrder(TradeType.Buy, Symbol, -1);
      if (!result.IsSuccessful)
      Stop();
      }
     }
    Журнал
    | cBot "Sample_cBot" was started successfully for EURUSD, h1.
    | Executing Market Order to Buy -1 EURUSD
    | > Executing Market Order to Buy -1 EURUSD FAILED with error "BadVolume"
    | cBot "Sample_cBot" was stopped for EURUSD, h1.

    Пример 3 - Выполнение рыночного ордера с несколькими параметрами
    В предыдущих примерах использован минимум параметров метода ExecuteMarketOrder, а именно: тип ордера, символ и объем. К дополнительным параметрам относятся: метка ордера, указание стоп-лосса, тейк-профита, проскальзывание и комментарий. В следующем примере при открытии ордера указывается стоп-лосс, тейк-профит и метка ордера:

    Код:
    [Robot(TimeZone = TimeZones.UTC)]
    public class Sample_cBot : Robot
     {
     protected override void OnStart()
      {
      var result = ExecuteMarketOrder((TradeType.Buy, Symbol, 10000,
      "order 1", 10, 10);
      if (result.IsSuccessful)
       {
       var position = result.Position;
       Print("Position entry price is {0}", position.EntryPrice);
       Print("Position SL price is {0}", position.StopLoss);
       }
      }
     }
    Журнал
    | cBot "Sample_cBot" was started successfully for EURUSD, m1.
    | Executing Market Order to Buy 10k EURUSD (SL: 10, TP: 10)
    | > Executing Market Order to Buy 10k EURUSD (SL: 10, TP: 10) SUCCEEDED, Position ID156169
    | Position entry price is 1.34693
    | Position SL price is 1.34593

    (...)

    Вы не можете благодарить!

  5. #5
    Теоретик
    Регистрация
    01.06.2013
    Сообщений
    624
    Promo (¢)
    635
    Благодарности
    Получено: 35
    Отправлено: 14
    Уважаемый Azizkin! Спасибо за Ваши посты, извините что нет активности поскольку учу еще Си шарп. Образовался только вопрос такой :
    в Вашем первом посте было такое
    PHP код:
    using System;                 // подключение необходимых
    using cAlgo.API;              // для работы робота
    using cAlgo.API.Indicators;   // библиотек (DLL)
    using cAlgo.Indicators
    Это обязательные строки типа как в mql
    PHP код:
    extern string 
    и т.д.?
    Далее OnStart() аналогично init, OnStop() - deinit, OnTick() - start ?
    Но в следующих Ваших примерах там нету всех выше перечисленных строк?
    P.S. Извините если вопрос тупой

    Вы не можете благодарить!

  6. #6
    Программист Аватар для Azizkin
    Регистрация
    05.02.2013
    Адрес
    Шервудский лес
    Сообщений
    2,078
    Promo (¢)
    250
    Благодарности
    Получено: 2,119
    Отправлено: 3,717
    Цитата Сообщение от Vitalyak Посмотреть сообщение
    в Вашем первом посте было такое
    Да, эти строки должны быть обязательно в каждом советнике. Если вы захотите добавить еще какую-нибудь длл, она тоже должна будет быть объявлена.

    Цитата Сообщение от Vitalyak Посмотреть сообщение
    Далее OnStart() аналогично init, OnStop() - deinit, OnTick() - start ?
    Да, правильно понимаете.

    Цитата Сообщение от Vitalyak Посмотреть сообщение
    Но в следующих Ваших примерах там нету всех выше перечисленных строк?
    Далее я привожу только участки кода c описываемыми функциями. То есть эти примеры только кусочек кода, который, как правило, будет в функции OnTick(), иногда в функции OnStart().

    З.Ы. Пока немного занят, скоро описание продолжу.

    Вы не можете благодарить!

  7. #7
    Теоретик
    Регистрация
    01.06.2013
    Сообщений
    624
    Promo (¢)
    635
    Благодарности
    Получено: 35
    Отправлено: 14
    Большое спасибо, можете не спешить сильно но только не забывайте эту тему пожалуйста поскольку думаю что кроме меня еще многим она пригодится потом. И еще если можно подскажите нормальные ли котировки в cTrader-е при тестировании ботов и как там делается оптимизация ботов. И как выводятся в настройки советника разные параметры? Спасибо.

    Вы не можете благодарить!

  8. #8
    Программист Аватар для Azizkin
    Регистрация
    05.02.2013
    Адрес
    Шервудский лес
    Сообщений
    2,078
    Promo (¢)
    250
    Благодарности
    Получено: 2,119
    Отправлено: 3,717
    Цитата Сообщение от Vitalyak Посмотреть сообщение
    Большое спасибо, можете не спешить сильно но только не забывайте эту тему пожалуйста поскольку думаю что кроме меня еще многим она пригодится потом. И еще если можно подскажите нормальные ли котировки в cTrader-е при тестировании ботов и как там делается оптимизация ботов. И как выводятся в настройки советника разные параметры? Спасибо.
    Котировки хорошие. Про оптимизацию и параметры напишу.

    Вы не можете благодарить!

  9. #9
    Программист Аватар для Azizkin
    Регистрация
    05.02.2013
    Адрес
    Шервудский лес
    Сообщений
    2,078
    Promo (¢)
    250
    Благодарности
    Получено: 2,119
    Отправлено: 3,717
    Изменение позиций


    Модификация позиций

    Функция модификации позиций ModifyPosition() имеет следующий синтаксис:
    Код:
    ModifyPosition(Position position, double? stopLoss, double? takeProfit)
    где:
    Position position - выбранная для модификации позиция,
    double? stopLoss - цена закрытия по стопу,
    double? takeProfit - цена закрытия по тейк-профиту.

    Ниже показан пример модификации позиции. При запуске эксперта создается рыночный ордер на покупку с уровнем тейк-профита, равным 10 пунктам и без установки стоп-лосса. Далее, при успешном открытии ордера, устанавливаем стоп-лосс позиции, равный 10 пунктам, при помощи функции ModifyPosition():

    Код:
    [Robot()]
    public class SamplecBbot : Robot
    {
    protected override void OnStart()
    {
    var result = ExecuteMarketOrder(TradeType.Buy, Symbol, 10000,
    "order 1", null, 10);                                         // создаем рыночный ордер
    if (result.IsSuccessful)                                      // если ордер появился
    {
    var position = result.Position;
    Print("Position SL price is {0}", position.StopLoss);
    var stopLoss = position.EntryPrice - 10*Symbol.PipSize;       //рассчитываем уровень стоп-лосса
    ModifyPosition(position, stopLoss, position.TakeProfit);      //модифицируем позицию
    Print("New Position SL price is {0}", position.StopLoss);     
    }
    }
    }
    Журнал
    | cBot "Sample_cBot" was started successfully for EURUSD, m1.
    | Executing Market Order to Buy 10k EURUSD (TP: 10)
    | → Executing Market Order to Buy 10k EURUSD (TP: 10) SUCCEEDED, Position PID156170
    | Position SL price is null
    | Modifing position PID156170 (SL: 1.34571, TP: 1.34771)



    Закрытие позиции

    Закрытие позиций производится с помощью функции ClosePosition().

    В примере ниже показан метод принудительного закрытия позиции при достижении определенного профита.
    При запуске эксперта создается рыночный ордер, который при работе эксперта отслеживается методом Positions.Find(), и при достижении профита в размере > 10 в валюте депозита ордер закрывается.

    Код:
    [Robot()]
    public class Sample_cBot : Robot
    {
    protected override void OnStart()
    {
    ExecuteMarketOrder(TradeType.Buy, Symbol, 10000, "myLabel"); //создаем рыночную позицию
    }
    protected override void OnTick()
    {
    var position = Positions.Find("myLabel");                    // находим позицию с меткой "myLabel"
    if (position != null && position.GrossProfit > 10)           // если позиция имеется и профит по ней >10
    {
    ClosePosition(position);                                     // закрываем позицию
    Stop();                                                      // останавливаем эксперта
    }
    }
    }
    Журнал
    | cBot "Sample_cBot" was started successfully for EURUSD, m1.
    | Executing Market Order to Buy 10k EURUSD
    | → Executing Market Order to Buy 10k EURUSD SUCCEEDED, Position PID156171
    | Closing position PID156171
    | → Closing position PID156171 SUCCEEDED, Position PID156171
    | cBot "Sample_cBot" was stopped for EURUSD, m1.


    Частичное закрытие позиций

    В предыдущем примере при старте робота создавалась рыночная позиция с меткой "myLabel". В следующем примере создадим две позиции. При поступлении нового тика советник будет искать все позиции с отметкой "myLabel" и при объеме позиции выше или равном 20000 закрывать часть этой позиции в размере 15000. Для поиска позиций в примере используется метод FindAll() :

    Код:
    [Robot()]
    public class Sample_cBot : Robot
    {
    protected override void OnStart()
    {
    ExecuteMarketOrder(TradeType.Buy, Symbol, 20000, "myLabel");          // создаем позицию объемом 20к
    ExecuteMarketOrder(TradeType.Buy, Symbol, 30000, "myLabel");          // создаем позицию объемом 30к
    }
    protected override void OnTick()
    {
    var positions = Positions.FindAll("myLabel", Symbol, TradeType.Buy);  // ищем все позиции Buy с меткой "myLabel"
    foreach (var position in positions)   
    {
    if (position.Volume >= 20000)                                         // если объем позиции больше или равен 20к
    {
    ClosePosition(position, 15000);                                       // закрываем часть позиции объемом 15к
    }
    }
    }
    }
    Журнал
    | cBot "Sample_cBot" was started successfully for EURUSD, h1.
    | Executing Market Order to Buy 20k EURUSD
    | → Executing Market Order to Buy 20k EURUSD SUCCEEDED, Position PID664437
    | Executing Market Order to Buy 30k EURUSD
    | → Executing Market Order to Buy 30k EURUSD SUCCEEDED, Position PID664438
    | Closing position PID664437 (15k)
    | → Closing position PID664437 (15k) SUCCEEDED, Position PID664437
    | Closing position PID664438 (15k)
    | → Closing position PID664438 (15k) SUCCEEDED, Position PID664438


    (...)

    Вы не можете благодарить!
    Последний раз редактировалось Azizkin; 08.12.2014 в 12:20.

  10. #10
    Теоретик
    Регистрация
    21.07.2013
    Адрес
    Одесса
    Сообщений
    740
    Promo (¢)
    30
    Благодарности
    Получено: 150
    Отправлено: 17
    Цитата Сообщение от Azizkin Посмотреть сообщение
    Разница есть, довольно существенная в синтаксисе. Но это все равно родственные языки. Изучайте, тем более что для DLL советников разница незаметна.


    Можно использовать справку самой платформы - она располагается в правой вкладке. Там есть все основные функции с кратким описанием. Кроме того, документация есть на оф. сайте cAlgo.
    Тут нельзя говорить, что разница в синтаксисе. Если брать тоолько синтаксис, то си шарп можно оценивать как расширение си плюс плюс, поднимающего его на новый уровень. Сам язык идеологией ближе к Java- код выполняется в аналоге виртуальной машины, компилируется в промежуточный код, который транслируется в машинный код прямо во время исполнения. Кстати это помогает на ходу подстаиваться под особенности архитектуры процессора. И самое главное в этом языке - автоматический сборщик мусора и отсутствие указателей. Хотя их вроде и в MQL4 нет.

    Вы не можете благодарить!

Страница 1 из 3 1 2 3 ПоследняяПоследняя

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •