Помощь в написании индикаторов и советников на платформе cTrader - Страница 6
Страница 6 из 7 ПерваяПервая ... 2 3 4 5 6 7 ПоследняяПоследняя
Показано с 51 по 60 из 61

Тема: Помощь в написании индикаторов и советников на платформе cTrader

  1. #51
    Новичок
    Регистрация
    13.08.2013
    Сообщений
    11
    Promo (¢)
    190
    Благодарности
    Получено: 3
    Отправлено: 7
    Цитата Сообщение от viktan Посмотреть сообщение
    Вы хотите практически готовый советник, о функционале которого можно лишь догадываться по списку входных параметров?
    Извините, но это нереально.
    Попробую подсказать по некоторым функциям:
    ограничение работы по часам и дням
    PHP код:
                if(Time.Hour StartHour || Time.Hour EndHour)
                    return;
                if(!
    TradeMonday && Time.DayOfWeek == DayOfWeek.Monday//TradeMonday должна иметь тип bool
                    
    return; 
    Подсчет ордеров
    PHP код:
                int allOrders 0profitOrders 0lossOrders 0;
                foreach(var 
    trade in History)
                    if(
    trade.EntryTime.Date == Time.Date)
                    {
                        
    allOrders ++;
                        if(
    trade.NetProfit 0)
                            
    profitOrders ++;
                        else
                            
    lossOrders ++;
                    }
                
    allOrders += Positions.Count// к закрытым ордерам прибавляем еще открытые
                
                
    if(allOrders >= TodayOrders || profitOrders >= TodayProfit || lossOrders >= TodayLoss)
                    return; 
    Расчет размера лота от риска:
    PHP код:
                //extRisk =   риск в процентах
                //extSL =  стоп лосс в пунктах
                
    long volume = (long)Math.Round((Account.Balance 100 extRisk) / extSL Symbol.PipValue 1000) * 1000;
                
    volume = ?(volume Symbol.VolumeMin Symbol.VolumeMin volume); //если лот меньше минимального - повышаем до минимума 

    Инициализация и использование индикатора

    PHP код:
           //объявление дескриптора в области глобальных переменных
           
    private StochasticOscillator _SOC;

            protected 
    override void OnStart()
            {
                
    //инициализация дескриптора 
                
    _SOC Indicators.StochasticOscillator(Period_KSlowingPeriod_DSt_Ma_Type);

            }

            protected 
    override void OnTick()
            {
                 
    //Использование:
                 
    var PercentK _SOC.PercentK.LastValue;
                 var 
    PercentD _SOC.PercentD.LastValue;
             } 

    Касательно расчета размера лота, то всё-таки я бы заменил в формуле выше

    PHP код:
    Account.Balance 
    на

    PHP код:
    Account.FreeMargin 
    Ведь новые позиции могут рассчитывать лишь на свободные средства депозита.

    И ещё отношение

    PHP код:
    extSL Symbol.PipValue 
    на

    PHP код:
    Math.Abs(extOP extSL) / Symbol.PipValue 
    , если стоИт вопрос, сколькими пипами мы рискуем в сделке.

    А выражение

    PHP код:
    volume = ?(volume Symbol.VolumeMin Symbol.VolumeMin volume); 
    должно, наверное, выглядеть так:

    PHP код:
    double qMin Symbol.VolumeInUnitsToQuantity(Symbol.VolumeInUnitsMin);
    double qMax Symbol.VolumeInUnitsToQuantity(Symbol.VolumeInUnitsMax);
                
    //если лот меньше минимального - повышаем до минимума
    if (volume qMin)
       
    volume 0.0;
    else
       
    //если лот больше максимального - понижаем до максимума
       
    if (volume qMax)
          
    volume qMax

    Вы не можете благодарить!
    Последний раз редактировалось Mapseam; 06.11.2018 в 16:11.

  2. #52
    Новичок
    Регистрация
    13.08.2013
    Сообщений
    11
    Promo (¢)
    190
    Благодарности
    Получено: 3
    Отправлено: 7
    Переделываю бота с MQL4 на cAlgo (точнее, в C#).
    С последним знаком поверхностно.

    Бот практикует частичные закрытия.
    В MQL4 после частичного закрытия коммент ордера содержит "from #".

    А в cAlgo как пограмотнее отследить факт, закрывалась ли позиция частично или ещё нет?

    Заранее очень благодарен за подсказку!

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

  3. #53
    Уважаемый Аватар для viktan
    Регистрация
    18.09.2014
    Адрес
    Far, far away...
    Сообщений
    3,028
    Promo (¢)
    11,670
    Благодарности
    Получено: 2,436
    Отправлено: 1,320
    Цитата Сообщение от Mapseam Посмотреть сообщение
    Переделываю бота с MQL4 на cAlgo (точнее, в C#).
    С последним знаком поверхностно.

    Бот практикует частичные закрытия.
    В MQL4 после частичного закрытия коммент ордера содержит "from #".

    А в cAlgo как пограмотнее отследить факт, закрывалась ли позиция частично или ещё нет?

    Заранее очень благодарен за подсказку!
    Если ордера открываются с фиксированным лотом - просто сравниваем текущий объем лота со стартовым. Если лот плавающий или возможен рестарт бота с другими настройками начального лота - при открытии ордера пишем в комментарии стартовый лот ордера. Далее читаем из коммента, сравниваем, делаем выводы.

    Вы не можете благодарить!
    Хоть и не ново, я напомню снова: перед лицом и друга и врага, Ты - господин несказанного слова, а сказанного слова - ты слуга.
    ©Омар Хайам

  4. #54
    Новичок
    Регистрация
    13.08.2013
    Сообщений
    11
    Promo (¢)
    190
    Благодарности
    Получено: 3
    Отправлено: 7
    На https://ctrader.com/algos/indicators/show/1086 приведен код индикатора, строящего ренко.

    Инициализирую в OnStart():
    Код:
    renko = Indicators.GetIndicator<Renko>(RenkoPips, BricksToShow, 3, "SeaGreen", "Tomato")
    ;

    Но
    Код:
    renko.Bricks.Count()
    почему-то = 0.
    Хотя на графике ужЕ отрисовалось несколько "кирпичей".

    Почему же счетчик равен нулю?

    Вы не можете благодарить!
    Последний раз редактировалось Mapseam; 08.11.2018 в 18:08.

  5. #55
    Новичок
    Регистрация
    13.08.2013
    Сообщений
    11
    Promo (¢)
    190
    Благодарности
    Получено: 3
    Отправлено: 7
    Даже так:
    Код:
    09/10/2018 18:26:00.000 | Crashed in OnTick with NotSupportedException: Partial close is not supported in backtesting, use ModifyPosition instead
    - - - Добавлено - - -

    Не нашел готового значение LotStep.
    Вышел из положения так:
    Код:
    double lotStep = Symbol.VolumeInUnitsToQuantity(Symbol.VolumeInUnitsStep);
    Как думаете, правильно?

    Вы не можете благодарить!
    Последний раз редактировалось Mapseam; 08.11.2018 в 18:08.

  6. #56
    Уважаемый Аватар для viktan
    Регистрация
    18.09.2014
    Адрес
    Far, far away...
    Сообщений
    3,028
    Promo (¢)
    11,670
    Благодарности
    Получено: 2,436
    Отправлено: 1,320
    Цитата Сообщение от Mapseam Посмотреть сообщение
    renko.Bricks.Count()
    Попробуйте
    PHP код:
    renko.Bricks.Count
    - - - Добавлено - - -

    Цитата Сообщение от Mapseam Посмотреть сообщение
    Даже так:
    Код:
    09/10/2018 18:26:00.000 | Crashed in OnTick with NotSupportedException: Partial close is not supported in backtesting, use ModifyPosition instead
    Пролема известная и давняя. В начале этого года обещали "вот-вот исправить", но, видимо, что то пошло не так...
    Цитата Сообщение от Mapseam Посмотреть сообщение
    Не нашел готового значение LotStep.
    Вышел из положения так:
    Код:
    double lotStep = Symbol.VolumeInUnitsToQuantity(Symbol.VolumeInUnitsStep);
    Как думаете, правильно?
    Если работает - значит правильно. Я вообще не сторонник "единственно верных и по фень-шую правильных вариантов"

    Вы не можете благодарить!
    Хоть и не ново, я напомню снова: перед лицом и друга и врага, Ты - господин несказанного слова, а сказанного слова - ты слуга.
    ©Омар Хайам

  7. #57
    Новичок
    Регистрация
    13.08.2013
    Сообщений
    11
    Promo (¢)
    190
    Благодарности
    Получено: 3
    Отправлено: 7
    Цитата Сообщение от viktan Посмотреть сообщение
    Попробуйте
    PHP код:
    renko.Bricks.Count
    Да, пробовал. "Те же яйца..." (С).

    Обращаюсь, допустим, к
    Код:
    renko.Close.Last(0)
    А поскольку в это время
    Код:
    renko.Bricks.Count
    равен 0, то и получаю исключение IndexOutOfRangeException

    Это странно потому, что в другом варианте (когда проверяю не
    Код:
    renko.Bricks.Count
    , а
    Код:
    renko.Close.Count
    ) я сразу после проверки кол-ва цен закрытия обращаюсь к элементу Close списка Bricks
    Код:
    renko.Bricks[pos].Close
    и никакого исключения не возбуждается.

    Полный пример:
    Код:
            //+------------------------------------------------------------------+
            double C(int pos = 1)
            {
                if (IsUseIndicatorOfRenko)
                    pos--;
    
                if (pos < 0 || pos >= (IsUseIndicatorOfRenko ? renko.Close.Count : MarketSeries.Close.Count))
                //if (pos < 0 || pos >= (IsUseIndicatorOfRenko ? renko.Bricks.Count : MarketSeries.Close.Count))
                    throw new IndexOutOfRangeException();
    
                //double v = (IsUseIndicatorOfRenko ? renko.Close.Last(pos) : MarketSeries.Close[pos]);
                double v = (IsUseIndicatorOfRenko ? renko.Bricks[pos].Close : MarketSeries.Close[pos]);
    
                return (v);
            }
    - - - Добавлено - - -

    Вообще индюк с https://ctrader.com/algos/indicators/show/1086, о котором веду речь - лишь заготовка.
    Для "кирпичей" не хранится ни High, ни Low, ни Volume.
    Кроме того, если бы я соображал в написании индюков, то вместо IndicatorDataSeries обращался бы к элементу списка Bricks (по полю). Сейчас это затруднительно - такое ощущение, что новый элемент списка вставляется туда с задержкой.
    Класс Bricks - тоже бы спрятал (нравится однозначность). А для класса Renko учредил бы св-во Count.

    Вы не можете благодарить!
    Последний раз редактировалось Mapseam; 10.11.2018 в 07:49.

  8. #58
    Уважаемый Аватар для viktan
    Регистрация
    18.09.2014
    Адрес
    Far, far away...
    Сообщений
    3,028
    Promo (¢)
    11,670
    Благодарности
    Получено: 2,436
    Отправлено: 1,320
    Цитата Сообщение от Mapseam Посмотреть сообщение
    Обращаюсь, допустим, к
    renko.Close.Last(0)
    А поскольку в это время
    renko.Bricks.Count равен 0, то и получаю исключение IndexOutOfRangeException
    Суть тут такая - индикатор создается как объект и заполнятся сериями данных не в момент получения хендла (renko = Indicators.GetIndicator<Renko>(RenkoPips, BricksToShow, 3, "SeaGreen", "Tomato")), а в момент обращения к его выходным данным. При обращении к свойствам, не помеченным как [Output], объект не создается и вызывается исключение, если он не был создан ранее. Пересчет данных индикатора тоже идет только при обращении к выходным сериям. То есть получив один раз объект, например. через
    PHP код:
    renko.Close.Count 
    в дальнейшем, обращаясь только к полю "Bricks", вы каждый раз будете получать одно и то же значение. Данные обновятся только при повторном обращении к серии.
    Например вот этот код:
    PHP код:
            protected override void OnStart()
            {
                
    // Put your initialization logic here
                
    renko Indicators.GetIndicator<Renko>(101003"SeaGreen""Tomato");
                Print(
    renko.Close.Last(0));
            } 
    Работает нормально, и потом можно спокойно обращаться к полю Bricks. Только обновляться оно не будет...

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

    Цитата Сообщение от Mapseam Посмотреть сообщение
    Для "кирпичей" не хранится ни High, ни Low, ни Volume.
    Зачем для ренко бара хай и лоу? Объем добавить не сложно в исходный индюк.

    Цитата Сообщение от Mapseam Посмотреть сообщение
    Кроме того, если бы я соображал в написании индюков, то вместо IndicatorDataSeries обращался бы к элементу списка Bricks (по полю). Сейчас это затруднительно - такое ощущение, что новый элемент списка вставляется туда с задержкой.
    Класс Bricks - тоже бы спрятал (нравится однозначность). А для класса Renko учредил бы св-во Count.
    Как выше написано - это бессмысленно. Только если переносить логику расчета ренко в сам бот и вручную организовывать пересчет данных.

    Вы не можете благодарить!
    Хоть и не ново, я напомню снова: перед лицом и друга и врага, Ты - господин несказанного слова, а сказанного слова - ты слуга.
    ©Омар Хайам

  9. #59
    Новичок
    Регистрация
    13.08.2013
    Сообщений
    11
    Promo (¢)
    190
    Благодарности
    Получено: 3
    Отправлено: 7
    Благодарю за полезную инфу по индикаторам в cAlgo.

    Зачем для ренко бара хай и лоу? Объем добавить не сложно в исходный индюк.
    Не критично, но, бывает, нужны и High, и Low.
    Кроме объёма, весьма логично, чтобы у "кирпича" было время его открытия.
    Говорю ж - заготовка, а не готовый индюк.

    Как выше написано - это бессмысленно. Только если переносить логику расчета ренко в сам бот и вручную организовывать пересчет данных.
    А почему бессмысленно скрывать список Bricks?
    Ведь, когда он паблик, то получается двойной способ получения тех же Open\Close.
    Это как в ОС Windows - одно и то же действие можно выполнить, в большинстве случаев, более чем одним способом.
    Другое дело, что, возможно, автор завел список Bricks, чтобы он хранил лишь Open\Close тех "кирпичей", что размещены на видимой части чарта...

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

  10. #60
    Уважаемый Аватар для viktan
    Регистрация
    18.09.2014
    Адрес
    Far, far away...
    Сообщений
    3,028
    Promo (¢)
    11,670
    Благодарности
    Получено: 2,436
    Отправлено: 1,320
    Цитата Сообщение от Mapseam Посмотреть сообщение
    Не критично, но, бывает, нужны и High, и Low.
    У ренко нет тени, поэтому хай и лоу будут совпадать с опен и клоз. То есть хранение этих серий - лишний расход памяти, не более.
    Цитата Сообщение от Mapseam Посмотреть сообщение
    Кроме объёма, весьма логично, чтобы у "кирпича" было время его открытия.
    Опять же для ренко параметр бесполезный. Суть ренко - уйти от времени и сосредоточится только на цене.
    Цитата Сообщение от Mapseam Посмотреть сообщение
    Ведь, когда он паблик, то получается двойной способ получения тех же Open\Close.
    Если делать расчет ренко баров внутри бота - то да, от серий опен/клоз можно уйти и пользоваться только коллекцией Bricks. Если пользовать отдельный индикатор - только [Output] серии. Причины я уже озвучил.

    Вы не можете благодарить!
    Хоть и не ново, я напомню снова: перед лицом и друга и врага, Ты - господин несказанного слова, а сказанного слова - ты слуга.
    ©Омар Хайам

Страница 6 из 7 ПерваяПервая ... 2 3 4 5 6 7 ПоследняяПоследняя

Похожие темы

  1. Вопросы и ответы по платформе cTrader
    от RoboForex Administrator в разделе Торговая платформа cTrader
    Ответов: 425
    Последнее сообщение: 25.07.2018, 13:10
  2. Поиск/переделка индикаторов cTrader
    от RoboForex Administrator в разделе Торговая платформа cTrader
    Ответов: 7
    Последнее сообщение: 16.07.2018, 16:06
  3. Новый тип счёта на платформе cTrader
    от RoboForex Administrator в разделе Архив. RoboForex
    Ответов: 0
    Последнее сообщение: 25.06.2015, 11:28
  4. Набор индикаторов объема для платформы cTrader
    от ZigzagAK в разделе Торговая платформа cTrader
    Ответов: 2
    Последнее сообщение: 30.05.2015, 10:14
  5. Ответов: 0
    Последнее сообщение: 24.07.2013, 09:06

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

Ваши права

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