Визуализация SL на графике - страница 2

 
Vladimir Karputov:

OnCalculate() - это только для индикаторов. Если хотите сделать в советнике - значит нужно все уровни бывших Stop Loss рисовать объектами (например горизонтальная линии в стиле "отрезок").

Я вас понял. Не сильно изучал просто стандартную библиотеку. Сейчас попробую.
 
Fresto:
Я вас понял. Не сильно изучал просто стандартную библиотеку. Сейчас попробую.

Ну и сразу проблема номер раз:

отловить событие модификации позиции (и это при работе онлайн, про работу с историей торговли ещё рано)

 
Fresto:
Разобрался я в примере на сайте. Но там всё сделано в индикаторе, как можно сделать подобное в советнике?
Если я пишу буффер для значений линии, то мне пишет, что нету функции OnCalculate. Мне добавить данную функцию в советник?

*Функция OnCalculate() вызывается только в пользовательских индикаторах*

Нет в экспертах буферов. В эксперте можно рисовать только графические объекты. Вот вам пример - рисует точки на уровне стоп лосса.

// префикс для имён графических объектов
const string g_sObjectsPrefix = "SL ";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // удаление всех графических объектов по префиксу
   ObjectsDeleteAll(0, g_sObjectsPrefix);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // блок отображения стоп лосса позиции (вставить в самый конец функции OnTick())
   if(PositionSelect(Symbol()) == true)
   {
      double fPositionSL = PositionGetDouble(POSITION_SL);
      
      if(fPositionSL > 0)
      {
         // время текущего бара
         datetime dtTime[1];
        
         if(CopyTime(Symbol(), PERIOD_CURRENT, 0, 1, dtTime) > 0)
         {
            // отображаем уровень стоплосса точкой (символ 159 шрифта Wingdings)
            DrawText(0, g_sObjectsPrefix + TimeToString(dtTime[0]), 0, dtTime[0], fPositionSL,
                     CharToString(159), "Wingdings", 10, clrRed, 0, DoubleToString(fPositionSL, Digits()), ANCHOR_CENTER, ALIGN_CENTER);        
         }
      }
   }
}

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

bool DrawText( const long               nChartID        = 0,
               const string             sName           = "Text",
               const int                nSubWindow      = 0,
               const datetime           dtTime          = 0,
               const double             fPrice          = 0,
               const string             sText           = "Text",
               const string             sFontFace       = "Arial",
               const int                nFontSize       = 10,
               const color              cColor          = clrRed,
               const double             fAngle          = 0,
               const string             sTooltip        = "\n",
               const ENUM_ANCHOR_POINT  eAnchor         = ANCHOR_LEFT_UPPER,
               const ENUM_ALIGN_MODE    eAlign          = ALIGN_LEFT,
               const bool               bInBackground   = false,
               const bool               bSelectable     = false,
               const bool               bSelected       = false,
               const bool               bHidden         = true,
               const long               nZOrder         = 0)
{
   if(ObjectFind(nChartID, sName) != nSubWindow)
   {
      if(!ObjectCreate(nChartID, sName, OBJ_TEXT, nSubWindow, dtTime, fPrice))
         return(false);
   }
   else
   {
      ObjectMove(nChartID, sName, 0, dtTime, fPrice);
   }

   ObjectSetString (nChartID, sName, OBJPROP_TEXT,       sText);
   ObjectSetString (nChartID, sName, OBJPROP_FONT,       sFontFace);
   ObjectSetInteger(nChartID, sName, OBJPROP_FONTSIZE,   nFontSize);
   ObjectSetInteger(nChartID, sName, OBJPROP_COLOR,      cColor);
   ObjectSetDouble (nChartID, sName, OBJPROP_ANGLE,      fAngle);
   ObjectSetString (nChartID, sName, OBJPROP_TOOLTIP,    sTooltip);
   ObjectSetInteger(nChartID, sName, OBJPROP_ANCHOR,     eAnchor);
   ObjectSetInteger(nChartID, sName, OBJPROP_ALIGN,      eAlign);
   ObjectSetInteger(nChartID, sName, OBJPROP_BACK,       bInBackground);
   ObjectSetInteger(nChartID, sName, OBJPROP_SELECTABLE, bSelectable);
   ObjectSetInteger(nChartID, sName, OBJPROP_SELECTED,   bSelectable && bSelected);
   ObjectSetInteger(nChartID, sName, OBJPROP_HIDDEN,     bHidden);
   ObjectSetInteger(nChartID, sName, OBJPROP_ZORDER,     nZOrder);

   return(true);
}

//+------------------------------------------------------------------+
 
Stanislav Korotky:
Лучше (универсальнее) будет как раз отдельный индикатор. Только не понятно, нужны ли уровни только для открытых позиций или всех? И речь о какой версии платформы?
5 версия. Нужно, чтобы на графике были графически показаны SL, чтобы понимать, как двигается стоп при разных параметрах
 
Sergei Vladimirov:

Нет в экспертах буферов. В эксперте можно рисовать только графические объекты. Вот вам пример - рисует точки на уровне стоп лосса.

// префикс для имён графических объектов
const string g_sObjectsPrefix = "SL ";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // удаление всех графических объектов по префиксу
   ObjectsDeleteAll(0, g_sObjectsPrefix);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // блок отображения стоп лосса позиции (вставить в самый конец функции OnTick())
   if(PositionSelect(Symbol()) == true)
   {
      double fPositionSL = PositionGetDouble(POSITION_SL);
      
      if(fPositionSL > 0)
      {
         // время текущего бара
         datetime dtTime[1];
        
         if(CopyTime(Symbol(), PERIOD_CURRENT, 0, 1, dtTime) > 0)
         {
            // отображаем уровень стоплосса точкой (символ 159 шрифта Wingdings)
            DrawText(0, g_sObjectsPrefix + TimeToString(dtTime[0]), 0, dtTime[0], fPositionSL,
                     CharToString(159), "Wingdings", 10, clrRed, 0, DoubleToString(fPositionSL, Digits()), ANCHOR_CENTER, ALIGN_CENTER);        
         }
      }
   }
}

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

bool DrawText( const long               nChartID        = 0,
               const string             sName           = "Text",
               const int                nSubWindow      = 0,
               const datetime           dtTime          = 0,
               const double             fPrice          = 0,
               const string             sText           = "Text",
               const string             sFontFace       = "Arial",
               const int                nFontSize       = 10,
               const color              cColor          = clrRed,
               const double             fAngle          = 0,
               const string             sTooltip        = "\n",
               const ENUM_ANCHOR_POINT  eAnchor         = ANCHOR_LEFT_UPPER,
               const ENUM_ALIGN_MODE    eAlign          = ALIGN_LEFT,
               const bool               bInBackground   = false,
               const bool               bSelectable     = false,
               const bool               bSelected       = false,
               const bool               bHidden         = true,
               const long               nZOrder         = 0)
{
   if(ObjectFind(nChartID, sName) != nSubWindow)
   {
      if(!ObjectCreate(nChartID, sName, OBJ_TEXT, nSubWindow, dtTime, fPrice))
         return(false);
   }
   else
   {
      ObjectMove(nChartID, sName, 0, dtTime, fPrice);
   }

   ObjectSetString (nChartID, sName, OBJPROP_TEXT,       sText);
   ObjectSetString (nChartID, sName, OBJPROP_FONT,       sFontFace);
   ObjectSetInteger(nChartID, sName, OBJPROP_FONTSIZE,   nFontSize);
   ObjectSetInteger(nChartID, sName, OBJPROP_COLOR,      cColor);
   ObjectSetDouble (nChartID, sName, OBJPROP_ANGLE,      fAngle);
   ObjectSetString (nChartID, sName, OBJPROP_TOOLTIP,    sTooltip);
   ObjectSetInteger(nChartID, sName, OBJPROP_ANCHOR,     eAnchor);
   ObjectSetInteger(nChartID, sName, OBJPROP_ALIGN,      eAlign);
   ObjectSetInteger(nChartID, sName, OBJPROP_BACK,       bInBackground);
   ObjectSetInteger(nChartID, sName, OBJPROP_SELECTABLE, bSelectable);
   ObjectSetInteger(nChartID, sName, OBJPROP_SELECTED,   bSelectable && bSelected);
   ObjectSetInteger(nChartID, sName, OBJPROP_HIDDEN,     bHidden);
   ObjectSetInteger(nChartID, sName, OBJPROP_ZORDER,     nZOrder);

   return(true);
}

//+------------------------------------------------------------------+
Спасибо, примерно то, что я хотел, получилось, буду разбираться во всем этом!)
 
Fresto:
Спасибо, примерно то, что я хотел, получилось, буду разбираться во всем этом!)

Имейте в виду, что приведенный код двигает метку внутри бара, т.е. если стоп менялся несколько раз за бар - будет видно лишь последнее значение.
 
Stanislav Korotky:

Имейте в виду, что приведенный код двигает метку внутри бара, т.е. если стоп менялся несколько раз за бар - будет видно лишь последнее значение.

Хорошо, я вас понял, у меня меняется 1 раз за бар.
Причина обращения: