Спасибо, Сергей, за отклик! Ваш ответ ещё больше меня озадачил. Как же так? При запуске скрипта происходит опрос всех установленных отложенных ордеров. Из картинки видно, что на графике их два и, при этом, один тикет получился выбранным, а другой нет? Не совсем понятно.
Можете пояснить чуть подробнее?
Задаю вопрос не из праздного любопытства, а в целях продолжения самообучения.
С уважением, Владимир.
Вот, есть у Вас цикл, где Вы меняете итератор i от максимального индекса до 0. Что же происходит внутри? А вот что: первой командой Вы пытаетесь получить параметр ORDER_SYMBOL. Но у какого ордера Вы пытаетесь его получить?, ведь ордер будет выбран тремя строчками ниже!
Sergey Gridnev #: Вот, есть у Вас цикл, где Вы меняете итератор i от максимального индекса до 0. Что же происходит внутри? А вот что: первой командой Вы пытаетесь получить параметр ORDER_SYMBOL. Но у какого ордера Вы пытаетесь его получить?, ведь ордер будет выбран тремя строчками ниже!
Спасибо, Сергей, за очень подробное и доходчивое разъяснение! Поставил строчку с тикетом отложенного ордера сразу после запуска цикла и всё наладилось.
Да-а-а ... Внимательность и ещё раз внимательность. Вот чего мне точно не хватает. Ещё раз благодарю!
Сегодня столкнулся ещё с двумя непонятными для меня моментами, но уже в коде взятом целиком и полностью из справочника MQL5. В этот раз сам ничего не писал, а только взял готовый пример.
Открываю Справочник MQL5 / Константы, перечисления и структуры / Структуры данных / Структура торгового запроса. Там нахожу:
Структура торгового запроса
Modify Pending Order
Торговый приказ на модификацию уровней цен отложенного ордера. Требуется указание 7 полей:
action
order
price
sl
tp
type_time
expiration
Пример торговой операции TRADE_ACTION_MODIFY для модификации уровней цен отложенного ордера:
Это понятно. И далее идёт пример с таким вот кодом:
#define EXPERT_MAGIC 123456// MagicNumber эксперта//+------------------------------------------------------------------+//| Модификация отложенных ордеров |//+------------------------------------------------------------------+voidOnStart()
{
//-- объявление и инициализация запроса и результатаMqlTradeRequest request={};
MqlTradeResult result={};
int total=OrdersTotal(); // количество установленных отложенных ордеров//--- перебор всех установленных отложенных ордеровfor(int i=0; i<total; i++)
{
//--- параметры ордераulong order_ticket=OrderGetTicket(i); // тикет ордераstring order_symbol=Symbol(); // символint digits=(int)SymbolInfoInteger(order_symbol,SYMBOL_DIGITS); // количество знаков после запятойulong magic=OrderGetInteger(ORDER_MAGIC); // MagicNumber ордераdouble volume=OrderGetDouble(ORDER_VOLUME_CURRENT); // текущий объем ордераdouble sl=OrderGetDouble(ORDER_SL); // текущий Stop Loss ордераdouble tp=OrderGetDouble(ORDER_TP); // текущий Take Profit ордераENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // тип ордераint offset = 50; // отступ от текущей цены для установки ордера, в пунктахdouble price; // цена срабатывания ордераdouble point=SymbolInfoDouble(order_symbol,SYMBOL_POINT); // размер пункта//--- вывод информации об ордереPrintFormat("#%I64u %s %s %.2f %s sl: %s tp: %s [%I64d]",
order_ticket,
order_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),DoubleToString(sl,digits),
DoubleToString(tp,digits),
magic);
//--- если MagicNumber совпадает, Stop Loss и Take Profit не заданыif(magic==EXPERT_MAGIC && sl==0 && tp==0)
{
request.action=TRADE_ACTION_MODIFY; // тип торговой операции
request.order = OrderGetTicket(i); // тикет ордера
request.symbol =Symbol(); // символ
request.deviation=5; // допустимое отклонение от цены//--- установка уровня цены, тейк-профит и стоп-лосс ордера в зависимости от его типаif(type==ORDER_TYPE_BUY_LIMIT)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;
request.tp = NormalizeDouble(price+offset*point,digits);
request.sl = NormalizeDouble(price-offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
elseif(type==ORDER_TYPE_SELL_LIMIT)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;
request.tp = NormalizeDouble(price-offset*point,digits);
request.sl = NormalizeDouble(price+offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
elseif(type==ORDER_TYPE_BUY_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point;
request.tp = NormalizeDouble(price+offset*point,digits);
request.sl = NormalizeDouble(price-offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
elseif(type==ORDER_TYPE_SELL_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point;
request.tp = NormalizeDouble(price-offset*point,digits);
request.sl = NormalizeDouble(price+offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
//--- отправка запросаif(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки//--- информация об операции PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
//--- обнуление значений запроса и результатаZeroMemory(request);
ZeroMemory(result);
}
}
}
//+------------------------------------------------------------------+
Пытаюсь понять строчку, которая выделена желтым цветом. Сразу возник вопрос - причём здесьPositionGetDouble(POSITION_PRICE_OPEN), если пример связан с отложенными ордерами? Может здесь должна быть вот такая строчка:
Это первый момент. Второй момент появился, когда попытался запустить этот скрипт на графике с установленным мною отложенным ордером BUY_STOP (хотя всё тоже самое происходит и с другими типами отложенных ордеров). И что же происходит? А ничего не происходит! Никакой модификации отложенного ордера не наблюдаю. Может чего-то не понимаю?
Саша, хуже чем использовать примеры из документации или примеры барабашки не придумаешь ничего. Да ещё и куда-то потерял флаг принудительного завершения цикла while. В общем … слов нет.
Я сомневаюсь что примеры написанные в документацию и даже в стандартную библиотеку тщательно проверяют. Таких ошибок великое множество. Примеры, на мой взгляд, можно использовать только как образцы…
Я сомневаюсь что примеры написанные в документацию и даже в стандартную библиотеку тщательно проверяют. Таких ошибок великое множество. Примеры, на мой взгляд, можно использовать только как образцы…
Здравствуйте, Алексей!
Очень печально, что у такой серьезной компании, такое не серьёзное отношение к справочнику.
Очень печально, что у такой серьезной компании, такое не серьёзное отношение к справочнику.
С уважением, Владимир.
В этом примере есть ещё ошибка. Или совсем ослеп…
Среди перечисленных обязательных полей есть expiration, но в коде примера я не вижу где назначается экспирация. Вместо этого назначается допустимое отклонение от цены.
Среди перечисленных обязательных полей есть expiration, но в коде примера я не вижу где назначается экспирация. Вместо этого назначается допустимое отклонение от цены.
Мало того, кроме expiration (время истечения), там ещё должен быть:
Типы торговых операций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Спасибо, Сергей, за отклик! Ваш ответ ещё больше меня озадачил. Как же так? При запуске скрипта происходит опрос всех установленных отложенных ордеров. Из картинки видно, что на графике их два и, при этом, один тикет получился выбранным, а другой нет? Не совсем понятно.
Можете пояснить чуть подробнее?
Задаю вопрос не из праздного любопытства, а в целях продолжения самообучения.
С уважением, Владимир.
Вот, есть у Вас цикл, где Вы меняете итератор i от максимального индекса до 0. Что же происходит внутри? А вот что: первой командой Вы пытаетесь получить параметр ORDER_SYMBOL. Но у какого ордера Вы пытаетесь его получить?, ведь ордер будет выбран тремя строчками ниже!
Спасибо, Сергей, за очень подробное и доходчивое разъяснение! Поставил строчку с тикетом отложенного ордера сразу после запуска цикла и всё наладилось.
Да-а-а ... Внимательность и ещё раз внимательность. Вот чего мне точно не хватает. Ещё раз благодарю!
С уважением, Владимир.
Доброе утро, уважаемые эксперты!
Сегодня столкнулся ещё с двумя непонятными для меня моментами, но уже в коде взятом целиком и полностью из справочника MQL5. В этот раз сам ничего не писал, а только взял готовый пример.
Открываю Справочник MQL5 / Константы, перечисления и структуры / Структуры данных / Структура торгового запроса. Там нахожу:
Структура торгового запросаЭто понятно. И далее идёт пример с таким вот кодом:
Пытаюсь понять строчку, которая выделена желтым цветом. Сразу возник вопрос - причём здесь PositionGetDouble(POSITION_PRICE_OPEN), если пример связан с отложенными ордерами? Может здесь должна быть вот такая строчка:
Во вкладке эксперты нахожу только вот это: Уважаемые эксперты помогите разобраться с данным примером, почему он находится в справочнике, но при этом его код не работает?
С уважением, Владимир.
Уважаемые эксперты помогите разобраться с данным примером, почему он находится в справочнике, но при этом его код не работает?
С уважением, Владимир.
Несколько страниц взад я уже писал об этом
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Alexey Viktorov, 2022.02.20 10:24
Саша, хуже чем использовать примеры из документации или примеры барабашки не придумаешь ничего. Да ещё и куда-то потерял флаг принудительного завершения цикла while. В общем … слов нет.Несколько страниц взад я уже писал об этом
Здравствуйте, Алексей!
Очень печально, что у такой серьезной компании, такое не серьёзное отношение к справочнику.
С уважением, Владимир.
Здравствуйте, Алексей!
Очень печально, что у такой серьезной компании, такое не серьёзное отношение к справочнику.
С уважением, Владимир.
В этом примере есть ещё ошибка. Или совсем ослеп…
Среди перечисленных обязательных полей есть expiration, но в коде примера я не вижу где назначается экспирация. Вместо этого назначается допустимое отклонение от цены.
В этом примере есть ещё ошибка. Или совсем ослеп…
Среди перечисленных обязательных полей есть expiration, но в коде примера я не вижу где назначается экспирация. Вместо этого назначается допустимое отклонение от цены.
Мало того, кроме expiration (время истечения), там ещё должен быть:
С уважением, Владимир.
Мало того, кроме expiration (время истечения), там ещё должен быть:
С уважением, Владимир.
Обращаюсь к модератору и, по совместительству, организатору данной ветки Артёму Тришкину!
Вы, со своей стороны, имеете возможность передавать в MQL все вопросы, связанные со справочником MQL5?
Если не трудно, то хотя бы эту страницу можете обновить ?
С уважением, Владимир.Обращаюсь к модератору и, по совместительству, организатору данной ветки Артёму Тришкину!
Вы, со своей стороны, имеете возможность передавать в MQL все вопросы, связанные со справочником MQL5?
Если не трудно, то хотя бы эту страницу можно обновить ?
С уважением, Владимир.Вы тоже можете об этом сообщить в эту тему.
Вы тоже можете об этом сообщить в эту тему.
Спасибо за подсказку, Алексей! Сначала подожду ответ в этой ветке, но уж если будет тишина, вот тогда обращусь в тему Ошибки, баги, вопросы.
С уважением, Владимир.