Помогите по выставлению SL

 

Следующий код выдает ошибку 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]

 

uint OrderSL()
 {
  if(PositionSelect(_Symbol))
  {
  if (PositionGetDouble(POSITION_SL)==0)
     {MqlTradeRequest   request;
        MqlTradeResult          result;
        request.action=TRADE_ACTION_SLTP;
        double price=PositionGetDouble(POSITION_PRICE_OPEN);
        //volume=PositionGetDouble(POSITION_VOLUME);
        request.symbol=Symbol();
        request.deviation=3;
           
           if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) 
           {    request.sl=NormalizeDouble(price+SL*MyPoint,_Digits);
                request.tp=0.0;
           }
           if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)         
           {    request.sl=NormalizeDouble(price-SL*MyPoint,_Digits);
                request.tp=0.0;
           }
   
// отправляем запрос на торговый сервер
           if(OrderSend(request,result)==false)
             {
              Print("OrderSend возвратил ошибку: "+IntegerToString(result.retcode)+"/"+result.comment);
              return result.retcode;
             }
        
           return result.retcode;
                }
 }      
  
  return (0);           
        
}
 
dimeon:

Следующий код выдает ошибку 10013. (Неправильный запрос). Где ошибка? 

Попробуйте обнулить переменные request и result после их объявления.
 
Yedelkin:
Попробуйте обнулить переменные request и result после их объявления.
MqlTradeRequest request;
    MqlTradeResult result;
    ZeroMemory(request);

    ZeroMemory(result);

... 

 

так - не помогло.

Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
 
Что такое MyPoint?

Используй _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;
           }
 
Kos:
Что такое MyPoint?

Используй _Point

MyPoint=_Point*10; для 4-5 знака сделано 

 
papaklass:

Правильно что дает ошибку. У Вас при модификации sell позиции закоментирован request.tp. Поэтому в запросе не хватает обязательных полей...

Ну так он же обнулял всю переменную request после её объявления, как я предлагал. Говорит - не помогло. Значит, дело не в закомментированности.
 
papaklass:

Какой смысл обнулять то, чего нет. В запросе должно быть определенное количество параметров. Если количество параметров в запросе != требуемому количеству параметров, то будет ошибка. Обнуление здесь не причем.

Интересный у Вас подход к обнулению объявленных  переменных типа структур и к результатам такого обнуления :) Даже переубеждать не буду :) Надеюсь, Вы сами разберётесь с этим вопросом и примените правильные выводы к конкретному примеру.
 

Вообще, введение функции ZeroMemory применительно к переменным торгового приказа является избыточной, т.к. в документации указан необходимый и достаточный перечень параметров структуры MqlTradeRequest для каждого случая.

Но, как это уже стало понятно, MQ не всегда способно конструктивно вопринимать критику в свой адрес. :) 

Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
 
dimeon:

Следующий код выдает ошибку 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);

За время, прошедшее с момента открытия позиции цена могла измениться.

Таким образом, вы рискуете словить ошибку о неверных стопах (ближе допустимых).

Лучше берите значение текущего Вида/Аска (в зависимости от направления позиции).

Плюс к этому, будет нелишним явно проверить на близость стоп-уровням и фриз-уровням.

 

 
papaklass:

Вы действительно бестолковый или прикидываетесь? Запрос не правильный ([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 ("параметр" по Вашей терминологии) было конкретным и нулевым. Что полностью совпадало с замыслом автора кода, который в закомментированной строчке также это поле обнулял.

Лекция закончена.

 
voix_kas:

Вообще, введение функции ZeroMemory применительно к переменным торгового приказа является избыточной, т.к. в документации указан необходимый и достаточный перечень параметров структуры MqlTradeRequest для каждого случая.

Но, как это уже стало понятно, MQ не всегда способно конструктивно вопринимать критику в свой адрес. :) 

Ну было же обсуждение и не одно, что с некоторых пор использование необнулённых ("непроинициализированных") переменных типа MqlTradeRequest стало приводить к ошибкам при обработке запроса. Типа "неинициализированные" поля запроса стали  влиять на общее состояние самого запроса и на его обработку. Поэтому разработчики сослались на неправильность использования "неинициализированных" переменных в таких случаях  и предложили их обнулять. Что уж тут поделаешь.
Причина обращения: