Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
OnCalculate() - это только для индикаторов. Если хотите сделать в советнике - значит нужно все уровни бывших Stop Loss рисовать объектами (например горизонтальная линии в стиле "отрезок").
Я вас понял. Не сильно изучал просто стандартную библиотеку. Сейчас попробую.
Ну и сразу проблема номер раз:
отловить событие модификации позиции (и это при работе онлайн, про работу с историей торговли ещё рано)
Разобрался я в примере на сайте. Но там всё сделано в индикаторе, как можно сделать подобное в советнике?
Если я пишу буффер для значений линии, то мне пишет, что нету функции 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);
}
//+------------------------------------------------------------------+
Лучше (универсальнее) будет как раз отдельный индикатор. Только не понятно, нужны ли уровни только для открытых позиций или всех? И речь о какой версии платформы?
Нет в экспертах буферов. В эксперте можно рисовать только графические объекты. Вот вам пример - рисует точки на уровне стоп лосса.
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);
}
//+------------------------------------------------------------------+
Спасибо, примерно то, что я хотел, получилось, буду разбираться во всем этом!)
Имейте в виду, что приведенный код двигает метку внутри бара, т.е. если стоп менялся несколько раз за бар - будет видно лишь последнее значение.
Имейте в виду, что приведенный код двигает метку внутри бара, т.е. если стоп менялся несколько раз за бар - будет видно лишь последнее значение.
Хорошо, я вас понял, у меня меняется 1 раз за бар.