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

 
voix_kas:

По теме. Представленный Вами код содержит потенциальную ошибку:

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

Судя по коду, автор стремится выставить SL, отталкиваясь от уровня открытия позиции. Его право. Другое дело, какое значение берётся для переменной SL.

Конечно же, нет проверки на близость к рынку. 

 
Yedelkin:

Судя по коду, автор стремится выставить SL, отталкиваясь от уровня открытия позиции. Его право. Другое дело, какое значение берётся для переменной SL.

Конечно же, нет проверки на близость к рынку. 

Значение стоплосса выставляю разное, ошибка - все та же.
 
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]

Ошибка гдет вне приведённого кода. Как таки задаётся SL и MyPoint ?
 
Yedelkin:

Судя по коду, автор стремится выставить SL, отталкиваясь от уровня открытия позиции. Его право. Другое дело, какое значение берётся для переменной SL.

Конечно же, нет проверки на близость к рынку.

Даже если допустить, что данный код выполняется непосредственно после открытия позиции, он также обречен на ошибки.

Исполнение торгового приказа на открытие позиции в реале занимает несколько секунд. В условиях: 1) быстрого рынка, 2) близких стопов - ошибка гарантирована.

Проверка в любом случае должна быть.

Вижу, что Вы за. Это скорее посыл к автору.

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

Ну, раз MQ согласились с избыточностью такого действия - уже хорошо. Жаль, что не довели дело до конца.

 
dimeon:
Значение стоплосса выставляю разное, ошибка - все та же.

А попробуйте, ради интереса, совет от voix_kas. Т.е. попробуйте выставить SL не от уровня открытия позиции, а от текущего значения Ask (для продажи) и размер SL установите пунктов в 1000 (5-знак). Всё равно пока догадок нет.

Вариант с обнулением переменных, разумеется. 

 

помогло обнуление. В первый раз обнуление не помогло, почему - так и не понял.

Всем огромное  спасибо. 

Вообще своего сова писал с год назад и потом забросил.

Торговая функция раньше работала, недавно хотел воспользоваться совом - не работает. Пришлось откуда то передрать функцию открытия позиций и ей воспользоваться.

Вообщем не правильно это как-то.

 

to dimeon:

Вот скрипт отрабатывает нормально, без каких либо ошибок, практически ваш вариант.

Желательно конечно еще добавить проверку OrderCheck(), ну и конечно "заглядывать" в готовые классы от разработчиков при разработке своих решений.

void OnStart()
  {
   uint SL=400;
   MqlTradeRequest   request;
   MqlTradeResult    result;
   ZeroMemory(request);
   ZeroMemory(result);
   
   if(PositionSelect(_Symbol))
     {
         request.action=TRADE_ACTION_SLTP;
         double price=(double)PositionGetDouble(POSITION_PRICE_OPEN);
         request.symbol=Symbol();
         request.deviation=3;
         request.tp=0.0;
         
         switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE))
           {
            case  POSITION_TYPE_SELL:
                request.sl=NormalizeDouble(price+SL*_Point,_Digits);
              break;
              
            case  POSITION_TYPE_BUY:
                request.sl=NormalizeDouble(price-SL*_Point,_Digits);
              break;
              
            default:
              break;
           }
        
         if(OrderSend(request,result)==false)
           {
            Print("OrderSend возвратил ошибку: "+IntegerToString(result.retcode)+"/"+result.comment);
           }
       
     }

  }
Причина обращения: