Показать сообщение отдельно
Старый 16.10.2011, 16:07
#815
Мастер
 
Имя: Владислав
Пол: Мужской
Возраст: 49
Инвестирую в: Свой бизнес
Регистрация: 09.04.2011
Сообщений: 2,330
Благодарностей: 1,862

награды Волшебный горшочек 
Re: Советник Ilan 1.6 Dynamic

Цитата:
Сообщение от unit Посмотреть сообщение
я видел возможность добавить в советник функцию постановки "замка" на всю серию открытую Иланом против тренда, с таким же объемом. Меня интересует такая функция при достижении мин величины свободных средств
Насколько я понял, Вы хотите определять минимальную величину свободных средств по отношению к балансу на счете (в процентах), а не конкретное установленное минимальное значение свободных средств (в валюте счета).
Придется ввести еще один идентификационный номер для локового ордера (добавляем в тело параметров настройки советника, например, после extern int MagicNumber), например:
Цитата:
extern int MagicNumberLock=12345;
также вводим новый параметр AccountEquityMinPercent, который будет определять процентное отношение средств от баланса, при котором следует открыть локовый ордер:
Цитата:
extern double AccountEquityMinPercent = 50; //в данном случае при уменьшении объема свободных средств до 50% и меньше от баланса счета будет открываться локирующий серию ордер
теперь в начало функции Start() добавим код, который будет определять наличие локового ордера (и ничего не предпринимать в этом случае), считать суммарный объем серии и определять направление серии (BUY или SELL), также код сравнения баланса счета со свободными средствами и открытия локирующего ордера при выполнении заданного условия:
Цитата:
bool flag1 = false; //флаг наличия последнего открытого ордера серии
double alllots = 0; //счетчик, суммирующий объем серии
int lasttype = -1; //тип серии (BUY или SELL)
for ( int trade = OrdersTotal() - 1; trade >= 0; trade-- )
{
if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && (OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
{
if ( !flag1 )
{
lasttype = OrderType(); //запоминаем тип последнего открытого ордера (направление торговли всей серии)
flag1 = true;
}
alllots+=OrderLots();
}
//есть локирующий ордер - ничего не предпринимаем
if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && (OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderMagicNumber() == MagicNumberLock && OrderSymbol() == Symbol() ) return (0);
}
//если свободные средства счета достигли минимального заданного значения от баланса счета, то открываем локовый ордер объемом alllots лот
if ( AccountEquity()/AccountBalance()<=AccountEquityMinPercent/100 )
{
if ( lasttype==OP_BUY )
{
ticket = OrderSend(Symbol(), OP_SELL, NormalizeDouble(alllots, 2), NormalizeDouble(Bid, Digits), slip, 0, 0, "Lock-Sell", MagicNumberLock, 0, Violet);
}
if ( lasttype==OP_SELL )
{
ticket = OrderSend(Symbol(), OP_BUY, NormalizeDouble(alllots, 2), NormalizeDouble(Ask, Digits), slip, 0, 0, "Lock-Buy", MagicNumberLock, 0, Violet);
}
//модифицируем все ордера серии путем обнуления параметра тейк-профит
for ( trade = OrdersTotal() - 1; trade >= 0; trade-- )
{
if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
{
OrderModify(OrderTicket(), OrderOpenPrice(), 0, 0, 0, Cyan);
}
}
return (0);
}
Вроде все. Сам еще не тестил. Попробуйте, что получится.

Как что работает можно будет посмотреть в режиме визуализации терминала MT4

добавлено через 20 минут
Да, чуть не забыл.... В этом случае нам придется постоянно наблюдать за движением цены поскольку в случае отката цены в направлении серии сработает тейк профит серии и мы получим огромный минус от локирующего ордера. Поэтому если Вы не можете постоянно присутствовать при торговле, то придется добавить следующий код, обнуляющий тейк профиты всей серии, дабы исключить то, о чем я написал выше:
Цитата:
//модифицируем все ордера серии путем обнуления параметра тейк-профит
for ( trade = OrdersTotal() - 1; trade >= 0; trade-- )
{
if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
{
OrderModify(OrderTicket(), OrderOpenPrice(), 0, 0, 0, Cyan);
}
}
Этот код надо добавить перед оператором return (0); последнего куска кода (ВСЕ ДОБАВИЛ).

добавлено через 41 минуту
Протестировал. все работает. При достижении заданного условия торговля на паре EURCHF прекратилась выставлением локирующего ордера.

добавлено через 52 минуты
При этом помните, что лок еще надо уметь разрулить... Но это совсем другая история.
__________________
Торгую здесь и здесь

Последний раз редактировалось Владислав Сергеев; 16.10.2011 в 17:00. Причина: Добавлено сообщение
Владислав Сергеев вне форума
Сказали спасибо:
unit (16.10.2011)
Перейти в тему этого сообщения: Советник Ilan 1.6 Dynamic