Попробуйте обнулить переменные request и result после их объявления.
ZeroMemory(result);
...
так - не помогло.
- www.mql5.com
Используй _Point
if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) { request.sl=NormalizeDouble(price+SL*_Point,_Digits); request.tp=0.0; } if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) { request.sl=NormalizeDouble(price-SL*_Point,_Digits); request.tp=0.0; }
Что такое MyPoint?
Используй _Point
MyPoint=_Point*10; для 4-5 знака сделано
Правильно что дает ошибку. У Вас при модификации sell позиции закоментирован request.tp. Поэтому в запросе не хватает обязательных полей...
Какой смысл обнулять то, чего нет. В запросе должно быть определенное количество параметров. Если количество параметров в запросе != требуемому количеству параметров, то будет ошибка. Обнуление здесь не причем.
Вообще, введение функции ZeroMemory применительно к переменным торгового приказа является избыточной, т.к. в документации указан необходимый и достаточный перечень параметров структуры MqlTradeRequest для каждого случая.
Но, как это уже стало понятно, MQ не всегда способно конструктивно вопринимать критику в свой адрес. :)
- www.mql5.com
Следующий код выдает ошибку 10013. (Неправильный запрос). Где ошибка?
2012.03.29 19:04:08 Trades '1000053': failed modify sell 2.70 EURCHF sl: 0.00000, tp: 0.00000 -> sl: 1.23499, tp: 0.00000 [Invalid request]
По теме. Представленный Вами код содержит потенциальную ошибку:
double price=PositionGetDouble(POSITION_PRICE_OPEN);
За время, прошедшее с момента открытия позиции цена могла измениться.
Таким образом, вы рискуете словить ошибку о неверных стопах (ближе допустимых).
Лучше берите значение текущего Вида/Аска (в зависимости от направления позиции).
Плюс к этому, будет нелишним явно проверить на близость стоп-уровням и фриз-уровням.
Вы действительно бестолковый или прикидываетесь? Запрос не правильный ([Invalid request]). Вы в торговом приказе указываете НЕ ВЕРНОЕ КОЛИЧЕСТВО ПАРАМЕТРОВ. Обнуляйте параметры, не обнуляйте - от этого их количество в торговои приказе не изменится.
Ну, во-первых. Хамить не стоит. Цели не достигнете. Даже если Вы умнее всех.
Второе. Слушайте лекцию:
Все мы знаем, что функция OrderSend() предназначена для совершения торговых операций через отправку запросов на торговый сервер. И все мы знаем, что запрос представлен специальной предопределенной структурой MqlTradeRequest. Теперь начинается самое интересное, а именно: то, чего не знаете конкретно Вы.
Специальная предопределенная структура MqlTradeRequest содержит все поля, необходимые для заключения торговых сделок, и выглядит следующим образом:
struct MqlTradeRequest { ENUM_TRADE_REQUEST_ACTIONS action; // Тип выполняемого действия ulong magic; // Штамп эксперта (идентификатор magic number) ulong order; // Тикет ордера string symbol; // Имя торгового инструмента double volume; // Запрашиваемый объем сделки в лотах double price; // Цена double stoplimit; // Уровень StopLimit ордера double sl; // Уровень Stop Loss ордера double tp; // Уровень Take Profit ордера ulong deviation; // Максимально приемлемое отклонение от запрашиваемой цены ENUM_ORDER_TYPE type; // Тип ордера ENUM_ORDER_TYPE_FILLING type_filling; // Тип ордера по исполнению ENUM_ORDER_TYPE_TIME type_time; // Тип ордера по времени действия datetime expiration; // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED) string comment; // Комментарий к ордеру };
Будучи внимательным, Вы можете заметить, что приведённая выше структура имеет ограниченное, конечное и фиксированное число полей. Т.е., объявляя переменные типа такой структуры, Вы всегда получаете переменные с одним и тем же количеством полей. Поэтому Ваше утверждение "В запросе должно быть определенное количество параметров" - оно как бы ни о чём. Потому что в запросе и так всегда одно и то же определенное количество полей.
Другое дело, что в зависимости от вида торговой операции необходимо указывать те или иные обязательные поля торгового запроса. Как Вы сами прекрасно понимаете, вне зависимости от вида торговой операции общее количество полей в запросе остаётся всегда одним и тем же.
Теперь, будучи проницательным, задумайтесь, а что происходит при обнулении переменных типа структур? - Правильно, обнуляется каждое поле переменной типа структуры. Я изначально знал, что Вы сами с этим можете разобраться.
А теперь вернитесь к примеру. Человек говорит, что обнулял переменные типа структуры после их объявления, но не помогло. Это означает, что при обнулении переменной request полю request.tp было присвоено нулевое значение. Поскольку в дальнейшем это поле было закомментировано, его значение не менялось, и функция OrderSend() отправила торговый запрос, в котором поле request.tp содержало нулевое значение. Иными словами, в варианте отправки торгового запроса
SL & TP Modification
Торговый приказ на модификацию уровней StopLoss и/или TakeProfit. Требуется указание 4 полей:
action
symbol
sl
tp
поле tp ("параметр" по Вашей терминологии) было конкретным и нулевым. Что полностью совпадало с замыслом автора кода, который в закомментированной строчке также это поле обнулял.
Лекция закончена.
Вообще, введение функции ZeroMemory применительно к переменным торгового приказа является избыточной, т.к. в документации указан необходимый и достаточный перечень параметров структуры MqlTradeRequest для каждого случая.
Но, как это уже стало понятно, MQ не всегда способно конструктивно вопринимать критику в свой адрес. :)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Следующий код выдает ошибку 10013. (Неправильный запрос). Где ошибка?
2012.03.29 19:04:08 Trades '1000053': failed modify sell 2.70 EURCHF sl: 0.00000, tp: 0.00000 -> sl: 1.23499, tp: 0.00000 [Invalid request]