Я хочу закрыть позиции (несколько позиций с определённым "magic"). Выборочно.
int positions_total = PositionsTotal();
for(int i = positions_total - 1; i >= 0; i--)
{
// Получаем тикет позиции по индексуulong position_ticket = PositionGetTicket(i);
// Выбираем позицию по тикету и по магикуif( PositionSelectByTicket(position_ticket) && (PositionGetInteger(POSITION_MAGIC)==m) )
{
string symbol = PositionGetString(POSITION_SYMBOL);
// Закрываем позициюif (!trade.PositionClose(position_ticket))
{
PrintFormat("Не удалось закрыть позицию %I64u по символу %s. Ошибка: %d",
position_ticket, symbol, GetLastError());
}
else
{
PrintFormat("Позиция %I64u по символу %s успешно закрыта.",
position_ticket, symbol);
}
}
}
Магик задал следующим образом в начале эксперта:
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int m=222;
#define EXPERT_MAGIC m // MagicNumber of the expertintOnInit() // Задаём магик для всех позиций в блоке инициализации
{
//--- зададим MagicNumber для идентификации своих ордеровint magic=EXPERT_MAGIC;
trade.SetExpertMagicNumber(magic);
return(0);
}
То есть в чём проблема: позиции продолжают висеть, и не закрываются при достижении условия закрытия
Я хочу закрыть позиции (несколько позиций с определённым "magic"). Выборочно.
Магик задал следующим образом в начале эксперта:
То есть в чём проблема: позиции продолжают висеть, и не закрываются при достижении условия закрытия
int m=222;
#define EXPERT_MAGIC m // MagicNumber of the expert
Наверное, можно просто
#define EXPERT_MAGIC 222 // MagicNumber of the expert
Здесь лишнее PositionSelectByTicket(), PositionGetTicket() уже делает позицию активной (см. Справку).
// Получаем тикет позиции по индексу
ulong position_ticket = PositionGetTicket(i);
// Выбираем позицию по тикету и по магику
if( /*PositionSelectByTicket(position_ticket) && */(PositionGetInteger(POSITION_MAGIC)==m) )
{
Почему не работает...
Возможно здесь:
trade.SetExpertMagicNumber(magic);
или здесь (собственно не закрывается)
if (!trade.PositionClose(position_ticket))
В Терминале, ID эксперта позиции/ордера, правильный ? 222?
Здесь лишнее PositionSelectByTicket(), PositionGetTicket() уже делает позицию активной (см. Справку).
Почему не работает...
Возможно здесь:
или здесь (собственно не закрывается)
В Терминале, ID эксперта позиции/ордера, правильный ? 222?
Понял. Cпасибо. Убрал лишнее. Да ID эксперта позиции/ордера, правильный.
Кажется нашёл ошибку. Чуть отредактировал. ...
Но стало ещё интереснее. - "когда закрывает, а когда не закрывает!", пока не могу понять от чего это зависит - произвольное закрытие. Вобщем пока сам не пойму работает или нет. ( в тестере не прогонишь, приходится ждать в реале условий)
int positions_total = PositionsTotal();
for(int i = positions_total - 1; i >= 0; i--)
{
// Получаем тикет позиции по индексуulong position_ticket = PositionGetTicket(i);
ulong magic=PositionGetInteger(POSITION_MAGIC);
// Выбираем позицию по тикету и по магикуif (magic==EXPERT_MAGIC)
{
string symbol = PositionGetString(POSITION_SYMBOL);
// Закрываем позициюif (!trade.PositionClose(position_ticket))
{
PrintFormat("Не удалось закрыть позицию %I64u по символу %s. Ошибка: %d",
position_ticket, symbol, GetLastError());
}
else
{
PrintFormat("Позиция %I64u по символу %s успешно закрыта.",
position_ticket, symbol);
}
}
}
Но стало ещё интереснее. - "когда закрывает, а когда не закрывает!"
int positions_total = PositionsTotal();
for(int i = positions_total - 1; i >= 0; i--)
{
// Получаем тикет позиции по индексуulong position_ticket = PositionGetTicket(i);
ulong magic=PositionGetInteger(POSITION_MAGIC);
// Выбираем позицию по тикету и по магикуif(position_ticket>0)
{
if(PositionSelectByTicket(ticket)&&magic==EXPERT_MAGIC)
{
string symbol = PositionGetString(POSITION_SYMBOL);
// Закрываем позициюif(trade.PositionClose(position_ticket))
{
PrintFormat("Позиция %I64u по символу %s успешно закрыта.",
position_ticket, symbol);
}
else
{
PrintFormat("Не удалось закрыть позицию %I64u по символу %s. Ошибка: %d",
position_ticket, symbol, GetLastError());
}
}
}
}
int m=222;
#define EXPERT_MAGIC m // MagicNumber of the expert
Наверное, можно просто
#define EXPERT_MAGIC 222 // MagicNumber of the expert
Здесь лишнее PositionSelectByTicket(), PositionGetTicket() уже делает позицию активной (см. Справку).
// Получаем тикет позиции по индексу
ulong position_ticket = PositionGetTicket(i);
// Выбираем позицию по тикету и по магику
if( /*PositionSelectByTicket(position_ticket) && */(PositionGetInteger(POSITION_MAGIC)==m) )
{
Почему не работает...
Возможно здесь:
trade.SetExpertMagicNumber(magic);
или здесь (собственно не закрывается)
if (!trade.PositionClose(position_ticket))
В Терминале, ID эксперта позиции/ордера, правильный ? 222?
Я так и понял) Но вот как найти теперь решение?
Посмотрел первое ваше сообщение, надо в вашем коде типы явно приводить.
Спасибо! Как понял, это уже через фриланс.
Добрый день!
Подскажите пожалуйста в чём ошибка?
Я хочу закрыть позиции (несколько позиций с определённым "magic"). Выборочно.
Магик задал следующим образом в начале эксперта:
То есть в чём проблема: позиции продолжают висеть, и не закрываются при достижении условия закрытия
Добрый день!
Подскажите пожалуйста в чём ошибка?
Я хочу закрыть позиции (несколько позиций с определённым "magic"). Выборочно.
Магик задал следующим образом в начале эксперта:
То есть в чём проблема: позиции продолжают висеть, и не закрываются при достижении условия закрытия
Наверное, можно просто
Здесь лишнее PositionSelectByTicket(), PositionGetTicket() уже делает позицию активной (см. Справку).
// Получаем тикет позиции по индексу ulong position_ticket = PositionGetTicket(i); // Выбираем позицию по тикету и по магику if( /*PositionSelectByTicket(position_ticket) && */(PositionGetInteger(POSITION_MAGIC)==m) ) {Почему не работает...
Возможно здесь:
или здесь (собственно не закрывается)
if (!trade.PositionClose(position_ticket))В Терминале, ID эксперта позиции/ордера, правильный ? 222?
Наверное, можно просто
Здесь лишнее PositionSelectByTicket(), PositionGetTicket() уже делает позицию активной (см. Справку).
Почему не работает...
Возможно здесь:
или здесь (собственно не закрывается)
В Терминале, ID эксперта позиции/ордера, правильный ? 222?
Понял. Cпасибо. Убрал лишнее. Да ID эксперта позиции/ордера, правильный.
Кажется нашёл ошибку. Чуть отредактировал. ...
Но стало ещё интереснее. - "когда закрывает, а когда не закрывает!", пока не могу понять от чего это зависит - произвольное закрытие. Вобщем пока сам не пойму работает или нет. ( в тестере не прогонишь, приходится ждать в реале условий)
Но стало ещё интереснее. - "когда закрывает, а когда не закрывает!"
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Putnik, 2025.08.21 19:36
Наверное, можно просто
Здесь лишнее PositionSelectByTicket(), PositionGetTicket() уже делает позицию активной (см. Справку).
// Получаем тикет позиции по индексу ulong position_ticket = PositionGetTicket(i); // Выбираем позицию по тикету и по магику if( /*PositionSelectByTicket(position_ticket) && */(PositionGetInteger(POSITION_MAGIC)==m) ) {Почему не работает...
Возможно здесь:
или здесь (собственно не закрывается)
if (!trade.PositionClose(position_ticket))В Терминале, ID эксперта позиции/ордера, правильный ? 222?
У меня этот вариант работает без ошибок и пропусков
Я же не сказал, что не будет работать, или будет работать с пропусками…
Если вам так нравится, можете через строку ставить выбор позиции…
Потратил почти 3 часа времени, но решение не нашёл
Как получить вот такой шаг лотов,
начальный 0.01, коэффициент умножения 1.3
--
начальный 0.01, коэффициент умножения 1.4
--
Если коэффициент 1.5 и выше - без проблем
--
Как решить?