Всем добрый день.
Подскажите, пожалуйста, как реализовать следующие условия в коде (на форуме и в документации подобного не нашел):
1. Если предыдущая свеча растущая (Input1.Close > Input1.Open), то на текущей свече покупаем 100 лотов по цене не выше цены открытия. По цене открытия может купиться не все 100 лотов, а меньше, например, 40 лотов, дальше цена может уйти вверх. А нужно, чтобы по цене открытия купились все 100 лотов. То есть, я предполагаю, в роботе надо как-то зафиксировать цену открытия этой свечи и ждать пока цена опустится до этой "фиксированной" цены.
2. Если цена становится на 1% больше цены, по которой мы купили (если успели), то сделку закрываем (продаем то количество лотов, которое успели купить по цене открытия).
С уважением,
Максим.
Стратегии и роботы > Купить по цене не выше цены открытия
Re: Купить по цене не выше цены открытия
В первом приближении можно так попробовать:
Код: Выделить всё
function Initialize()
{
StrategyName = "strateg";
AddParameter("Delta", 3.0, "", 1); // в %%
AddInput("Input1", Inputs.Candle, 1, true, "GAZP=МБ ЦК");
LongLimit = 100;
ShortLimit = 0;
}
function OnUpdate()
{
if (GetActiveOrders().LastOrDefault() == null && Input1.Close[0] > Input1.Open[0]) EnterLongLimit(Input1.Close[0]);
if (CurrentPosition() > 0 && Input1.Close[0] > AverPrice() * (1.0 + Delta/100.0)) ClosePosition();
}
-
- Сообщения: 535
- Зарегистрирован: 11 ноя 2018, 17:11
- Благодарил (а): 21 раз
- Поблагодарили: 92 раза
Re: Купить по цене не выше цены открытия
Учитывайте, что "стандартно" код робота вызывается однократно в момент закрытия бара, в этот момент цена открытия следующего бара (если вы собираетесь ориентироваться на нее) еще недоступна.
Вызов на еще не законченном ("живом") баре регулируется флагами UseClosedBar и OneSignalOnBar, см. "СКРИПТЫ ПОЛЬЗОВАТЕЛЬСКИХ ИНДИКАТОРОВ И СТРАТЕГИЙ", раздел "Флаги" на стр. 19.
Вызов на еще не законченном ("живом") баре регулируется флагами UseClosedBar и OneSignalOnBar, см. "СКРИПТЫ ПОЛЬЗОВАТЕЛЬСКИХ ИНДИКАТОРОВ И СТРАТЕГИЙ", раздел "Флаги" на стр. 19.
Re: Купить по цене не выше цены открытия
Maks, BugsDigger,
Благодарю за ответы. Получился такой код.
Пока работает так, как надо, если тестировать с 1 лотом на ликвидных инструментах. Однако, предполагаю, что возможны ситуации, когда 2 и 3 условия будут срабатывать не так, как мы хотим.
1 условие. Здесь вопросов нет, покупаем 100 лотов по цене открытия, если предыдущая свеча "зеленая":
2 условие. Логика: продать купленное количество по цене = средняя цена * 1.01.
В коде я решил использовать High текущего бара, то есть, когда High >= средней цены позиции * 1.01, то продаем. Код ниже.
Здесь у меня вопрос. Например, мы купили 100 лотов, но по цене High успели продать 30 лотов, дальше цена снизилась. Что произойдет с оставшимися 70 лотами? Они продадутся по рыночной цене (меньше средней цены позиции * 1.01) в момент, когда наступит High, или будут дожидаться, когда средняя цена опять станет больше на 1%?
3 условие. Логика: если мы не успеваем купить ни одного лота по цене открытия, цена уходит вверх и становится больше цены открытия на 1%, мы отменяем заявку.
Придумал такой код, однако сомневаюсь, корректен ли он.
Вы не могли бы подсказать, как правильно задать 2 и 3 условия в коде.
С уважением,
Максим.
Благодарю за ответы. Получился такой код.
Код: Выделить всё
function Initialize()
{
StrategyName = "strateg";
AddParameter("P1", 0, "", 1);
AddInput("Input1", Inputs.Candle, 5, true, "TATN=МБ ЦК");
LongLimit = 100;
ShortLimit = 0;
UseClosedBar = false;
LiveBarTimeout = 1;
}
function OnUpdate()
{
if (Input1.Close[1] > Input1.Open[1]) EnterLongLimit(Input1.Open[0]);
if (CurrentPosition() > 0 && Input1.High[0] >= AverPrice() * 1.01) ClosePosition();
if (CurrentPosition() < 1 && Input1.High[0] >= Input1.Open[0] * 1.01) CancelActiveOrders(true);
}
Пока работает так, как надо, если тестировать с 1 лотом на ликвидных инструментах. Однако, предполагаю, что возможны ситуации, когда 2 и 3 условия будут срабатывать не так, как мы хотим.
1 условие. Здесь вопросов нет, покупаем 100 лотов по цене открытия, если предыдущая свеча "зеленая":
Код: Выделить всё
if (Input1.Close[1] > Input1.Open[1]) EnterLongLimit(Input1.Open[0]);
2 условие. Логика: продать купленное количество по цене = средняя цена * 1.01.
В коде я решил использовать High текущего бара, то есть, когда High >= средней цены позиции * 1.01, то продаем. Код ниже.
Код: Выделить всё
if (CurrentPosition() > 0 && Input1.High[0] >= AverPrice() * 1.01) ClosePosition();
Здесь у меня вопрос. Например, мы купили 100 лотов, но по цене High успели продать 30 лотов, дальше цена снизилась. Что произойдет с оставшимися 70 лотами? Они продадутся по рыночной цене (меньше средней цены позиции * 1.01) в момент, когда наступит High, или будут дожидаться, когда средняя цена опять станет больше на 1%?
3 условие. Логика: если мы не успеваем купить ни одного лота по цене открытия, цена уходит вверх и становится больше цены открытия на 1%, мы отменяем заявку.
Придумал такой код, однако сомневаюсь, корректен ли он.
Код: Выделить всё
if (CurrentPosition() < 1 && Input1.High[0] >= Input1.Open[0] * 1.01) CancelActiveOrders(true);
Вы не могли бы подсказать, как правильно задать 2 и 3 условия в коде.
С уважением,
Максим.
Вернуться в «Стратегии и роботы»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 12 гостей