Обсуждение статьи "Рецепты MQL5 - Как не получить ошибку при установке/изменении торговых уровней?" - страница 2

 
tatankaska:
Здравствуйте, при тестировании вашего советника в тестере стратегий на GOLD я постоянно получал сообщения Failed to open position - Invalid stops - no positions were opened. Что не так? Это было написано для того, чтобы избежать такого рода ошибок?
Боюсь, нам нужен код, чтобы помочь вам. Наиболее вероятно, что ошибка действительно существует в вашем коде. Проверьте, что ваши стопы больше минимально допустимого расстояния и что вы случайно не перепутали стопы покупки и продажи. Также убедитесь, что ваш брокер позволяет указывать стопы при открытии позиции - некоторые из них требуют добавлять стопы только к существующим позициям (так называемое"рыночное исполнение").
 
marketeer:
Боюсь, что для того, чтобы помочь вам, нам нужен код. Наиболее вероятно, что ошибка действительно существует в вашем коде. Проверьте, не превышают ли ваши стопы минимально допустимое расстояние и не перепутали ли вы случайно стопы на покупку и продажу. Также убедитесь, что ваш брокер позволяет указывать стопы при открытии позиции - некоторые из них требуют добавлять стопы только к существующим позициям (так называемое"рыночное исполнение").

Здравствуйте, я тестировал только советник, прикрепленный к статье Как избежать ошибок при установке/изменении торгового уровня, без каких-либо изменений (Positionpropertiesplus). Платформа Instatrader от Instaforex. Функции в этом советнике написаны так, что если я задаю неправильные параметры стопов, то они устанавливаются на минимально допустимые. Поэтому в норме я не должен получать никаких сообщений об ошибках - это справедливо для форекс пар. Но на GOLD в этой платформе я получаю при каждой попытке советника positionpropertiesplus открыть позицию со стопами, сообщение об ошибке invalid stops и ни одна позиция в тестере стратегий не была открыта. Это тот случай, о котором вы упомянули - проблема с платформой instatrader и брокером? В свойствах символа GOLD написано мгновенное исполнение.

Вот пример функции расчета стоплосса из упомянутого советника - я использовал советник, приложенный к упомянутой статье, без каких-либо изменений, только вместо форекс пар использовал GOLD:

//+------------------------------------------------------------------+

//| Расчет значения стоп-лосса|

//+------------------------------------------------------------------+

double CalculateStopLoss(ENUM_ORDER_TYPE order_type)

  {

//--- Если требуется Стоп Лосс

   if(StopLoss>0)

     {

      //--- Для рассчитанного значения Stop Loss

      double sl=0.0;

      //--- Если вам нужно рассчитать значение для позиции BUY

      if(order_type==ORDER_TYPE_BUY)

        {

         // Рассчитать уровень

         sl=NormalizeDouble(sym_ask-CorrectValueBySymbolDigits(StopLoss*sym_point),sym_digits);

         //--- Верните вычисленное значение, если оно меньше нижней границы уровня Стоп

         // Если значение больше или равно, верните скорректированное значение

         return(sl<sym_down_level ? sl : sym_down_level-sym_offset);

        }

      //--- Если вам нужно рассчитать значение для позиции SELL

      if(order_type==ORDER_TYPE_SELL)

        {

         //--- Вычислите уровень

         sl=NormalizeDouble(sym_bid+CorrectValueBySymbolDigits(StopLoss*sym_point),sym_digits);

         //--- Верните вычисленное значение, если оно больше верхней границы уровня Stops

         // Если значение меньше или равно, верните скорректированное значение

         return(sl>sym_up_level ? sl : sym_up_level+sym_offset);

        }

     }

//---

   return(0.0);

  } 
 
tatankaska:
...

Форум о трейдинге, автоматизированных торговых системах и тестировании торговых стратегий


Здравствуйте,

Пожалуйста, используйте кнопку SRC при размещении кода. Спасибо.


В этот раз я отредактировал его для вас.


 
tatankaska:

Здравствуйте, тестировал только советник, прикрепленный к статье Как избежать ошибок при установке/изменении торгового уровня, без каких-либо изменений (Positionpropertiesplus). Платформа Instatrader от Instaforex. Функции в этом советнике написаны так, что если я задаю неправильные параметры стопов, то они устанавливаются на минимально допустимые. Поэтому в норме я не должен получать никаких сообщений об ошибках - это справедливо для форекс пар. Но на GOLD в этой платформе я получаю при каждой попытке советника positionpropertiesplus открыть позицию со стопами, сообщение об ошибке invalid stops и ни одна позиция в тестере стратегий не была открыта. Это тот случай, о котором вы упомянули - проблема с платформой instatrader и брокером? В свойствах символа GOLD написано мгновенное исполнение.

Вот пример функции для расчета стоплосса из упомянутого советника - я использовал советник, приложенный к упомянутой статье, без изменений, только вместо форекс пар использовал GOLD:

Да, так и было. По GOLD в Instatrader стопы можно было выставлять только после открытия позиции. Когда позиция открывалась без стопов и после открытия модифицировалась, все было в порядке. Спасибо, ребята.
 

Еще раз о расчете стопов (SL/TP) в прилагаемом советнике - они корректно рассчитываются только по инструментам, где symbol point = symbol tick size. В случае с GOLD это не так.

Стопы должны быть в этом случае (по GOLD) скорректированы до действительного размера тика символа, иначе вы получите сообщение об ошибке - invalid stops .

Таким образом, подсказки GOLD об ошибках не являются результатом рыночного исполнения. Советник нуждается в небольшой коррекции при расчете SL/TP, если вы хотите использовать его с GOLD.

 
А как же закрыть позицию? Если в эксперте есть и условия (сигнал) на закрытие позиций, как это сделать, где можно посмотреть такие же  примеры?
 
Nauris:
А как же закрыть позицию? Если в эксперте есть и условия (сигнал) на закрытие позиций, как это сделать, где можно посмотреть такие же примеры?
В статье используется класс CTrade стандартной библиотеки. В нём есть метод PositionClose. Можете воспользоваться им. 
 
Я изменил код следующим образом

//+------------------------------------------------------------------+
//| Настройка информационной панели|
//|------------------------------------------------------------------+
void SetInfoPanel()
  {
//--- Режимы визуализации или реального времени
   if(ShowInfoPanel && (IsVisualMode() || IsRealtime()))
     {
     // Оставшийся код функции SetInfoPanel()
     // ...
     }
  }