Пишу простого робота - сначала робот в диаппазоне выставляет лимитные заявки с указанным ТП отдельно для каждой лимитной заявки. Если срабатывает более одной лимитки, то меняет ТП относительно среденей цены входа относительно сработавших лимиток. У меня включен режим хэджирования в МТ5.
Пытаюсь для открытых позиций поменять значения ТП, СЛ в советнике не использую, но при модификации возникает ошибка 10016.
for (int i = PositionsTotal() - 1; i >= 0; i--){
if (PositionSelectByTicket(PositionGetTicket(i))){
if (PositionGetInteger(POSITION_MAGIC) == MAGIC_NUMBER){
ZeroMemory (request);
ZeroMemory (result);
request.action = TRADE_ACTION_SLTP;
request.position = PositionGetInteger(POSITION_TICKET);
request.symbol = PositionGetString(POSITION_SYMBOL);
request.sl = PositionGetDouble(POSITION_SL);
request.tp = NormalizeDouble(TakeAll, Digits());
if(!OrderSend(request,result)) {
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
}
}
Подскажите, пожалуйста, как исправить.
1. Получается «масло масляное» Лучше просто
ulong posTicket=PositionGetTicket(i);
2. Какое значение переменной TakeAll?
3. Научитесь правильно вставлять код.
1. Получается «масло масляное» Лучше просто
2. Какое значение переменной TakeAll?
3. Научитесь правильно вставлять код.
Спасибо за ответ! Но не помогает.
3. Когда нибудь научусь.
2. Ошибка со стоплосом, хотя мне его не нужно менять. Тейк вычисляется так:
for (int i = PositionsTotal() - 1; i >= 0; i--){
posTicket=PositionGetTicket(i);
if (PositionSelectByTicket(posTicket)){
if (PositionGetInteger(POSITION_MAGIC) == MAGIC_NUMBER){
VolPrice = VolPrice + PositionGetDouble(POSITION_VOLUME) * PositionGetDouble(POSITION_PRICE_OPEN);
VolAllOrders = VolAllOrders + PositionGetDouble(POSITION_VOLUME);
count = count + 1;
}
}
}
TakeAll = (VolPrice / VolAllOrders) * (1 + TakeProfit / 100); // общий тейк
1. Код переделал, но ошибка осталась.
for (int i = PositionsTotal() - 1; i >= 0; i--){
posTicket=PositionGetTicket(i);
if (PositionSelectByTicket(posTicket)){
if (PositionGetInteger(POSITION_MAGIC) == MAGIC_NUMBER){
ZeroMemory (request);
ZeroMemory (result);
request.action = TRADE_ACTION_SLTP;
request.position = PositionGetInteger(POSITION_TICKET);
request.symbol = PositionGetString(POSITION_SYMBOL);
request.sl = PositionGetDouble(POSITION_SL);
request.tp = NormalizeDouble(TakeAll, Digits());
if(!OrderSend(request,result)) {
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
Должна быть проверка на уровни стопов.stop level ,но проще к диапазону размер 3х спредов добавить
И уровень заморозки тоже надо проверять.
- www.mql5.com
Что то я совсем не понимаю. Тестер выдаёт ошибку при попытке модификации позиции, но закрытие позиций происходит по общему тейку.
BUY_LIMIT это не позиция

- www.mql5.com
Это возможная причина. Подробнее тут https://www.mql5.com/ru/articles/2555#invalid_SL_TP_for_position
И уровень заморозки тоже надо проверять.
Спасибо за ответ! Но не помогает.
3. Когда нибудь научусь.
2. Ошибка со стоплосом, хотя мне его не нужно менять. Тейк вычисляется так:
for (int i = PositionsTotal() - 1; i >= 0; i--){
posTicket=PositionGetTicket(i);
if (PositionSelectByTicket(posTicket)){
if (PositionGetInteger(POSITION_MAGIC) == MAGIC_NUMBER){
VolPrice = VolPrice + PositionGetDouble(POSITION_VOLUME) * PositionGetDouble(POSITION_PRICE_OPEN);
VolAllOrders = VolAllOrders + PositionGetDouble(POSITION_VOLUME);
count = count + 1;
}
}
}
TakeAll = (VolPrice / VolAllOrders) * (1 + TakeProfit / 100); // общий тейк
1. Код переделал, но ошибка осталась.
for (int i = PositionsTotal() - 1; i >= 0; i--){
posTicket=PositionGetTicket(i);
if (PositionSelectByTicket(posTicket)){
if (PositionGetInteger(POSITION_MAGIC) == MAGIC_NUMBER){
ZeroMemory (request);
ZeroMemory (result);
request.action = TRADE_ACTION_SLTP;
request.position = PositionGetInteger(POSITION_TICKET);
request.symbol = PositionGetString(POSITION_SYMBOL);
request.sl = PositionGetDouble(POSITION_SL);
request.tp = NormalizeDouble(TakeAll, Digits());
if(!OrderSend(request,result)) {
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
Выделенное не ошибка. Это просто «масло масляное» о чём и было сказано.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пишу простого робота - сначала робот в диаппазоне выставляет лимитные заявки с указанным ТП отдельно для каждой лимитной заявки. Если срабатывает более одной лимитки, то меняет ТП относительно среденей цены входа относительно сработавших лимиток. У меня включен режим хэджирования в МТ5.
Пытаюсь для открытых позиций поменять значения ТП, СЛ в советнике не использую, но при модификации возникает ошибка 10016.
for (int i = PositionsTotal() - 1; i >= 0; i--){
if (PositionSelectByTicket(PositionGetTicket(i))){
if (PositionGetInteger(POSITION_MAGIC) == MAGIC_NUMBER){
ZeroMemory (request);
ZeroMemory (result);
request.action = TRADE_ACTION_SLTP;
request.position = PositionGetInteger(POSITION_TICKET);
request.symbol = PositionGetString(POSITION_SYMBOL);
request.sl = PositionGetDouble(POSITION_SL);
request.tp = NormalizeDouble(TakeAll, Digits());
if(!OrderSend(request,result)) {
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
}
}
Подскажите, пожалуйста, как исправить.