Язык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5 - Страница 11
const double &close [],
const long &tick_volume [],
const long &volume [],
const int &spread [])
{
// – —
int values_to_copy;
int start;
int calculated=BarsCalculated (EMA34HHandle);
if (calculated <=0)
{
return (0);
}
if (prev_calculated==0 || calculated!=bars_calculated)
{
start=1;
if (calculated> rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
start=rates_total-1;
values_to_copy=1;
} if (!FillArrayFromMABuffer (EMA34HBuffer,0,EMA34HHandle, values_to_copy)) return (0); if (!FillArrayFromMABuffer (EMA34LBuffer,0,EMA34LHandle, values_to_copy)) return (0); if (!FillArrayFromMABuffer (EMA125Buffer,0,EMA125Handle, values_to_copy)) return (0);
if (!FillArrayFromPSARBuffer (PSARBuffer, PSARHandle, values_to_copy)) return (0);
for (int i=start; i { if (close [i-1]> open [i-1] &&close [i-1]> EMA34HBuffer [i-1] &&close [i-1]> EMA34LBuffer [i-1] &&low [i-1]> EMA125Buffer [i-1] &&low [i-1]> PSARBuffer [i-1] &&EMA125Buffer [i-1] if (!ObjectCreate (0,«Buy»+i, OBJ_ARROW,0,time [i-1],high [i-1])) { return (false); } ObjectSetInteger (0,«Buy»+i, OBJPROP_COLOR, clrGreen); ObjectSetInteger (0,«Buy»+i, OBJPROP_ARROWCODE,233); ObjectSetInteger (0,«Buy»+i, OBJPROP_WIDTH,2); ObjectSetInteger (0,«Buy»+i, OBJPROP_ANCHOR, ANCHOR_UPPER); ObjectSetInteger (0,«Buy»+i, OBJPROP_HIDDEN, true); ObjectSetString (0,«Buy»+i, OBJPROP_TOOLTIP,»»+close [i-1]); } if (close [i-1] if (!ObjectCreate (0,«Sell»+i, OBJ_ARROW,0,time [i-1],low [i-1])) { return (false); } ObjectSetInteger (0,«Sell»+i, OBJPROP_COLOR, clrRed); ObjectSetInteger (0,«Sell»+i, OBJPROP_ARROWCODE,234); ObjectSetInteger (0,«Sell»+i, OBJPROP_WIDTH,2); ObjectSetInteger (0,«Sell»+i, OBJPROP_ANCHOR, ANCHOR_LOWER); ObjectSetInteger (0,«Sell»+i, OBJPROP_HIDDEN, true); ObjectSetString (0,«Sell»+i, OBJPROP_TOOLTIP,»»+close [i-1]); } } bars_calculated=calculated; // – - return value of prev_calculated for next call return (rates_total); } Здесь функцией ObjectCreate создаются объекты стрелка, привязанные ко времени и максимальной или минимальной цене. Функцией ObjectSetInteger со свойством OBJPROP_COLOR определяется цвет стрелки. Функцией ObjectSetInteger со свойством OBJPROP_ARROWCODE определяется направление стрелки вверх или вниз. Функцией ObjectSetInteger со свойством OBJPROP_WIDTH определяется размер объекта. Функцией ObjectSetInteger со свойством OBJPROP_ANCHOR определяется привязка к цене сверху или снизу по центру. Функцией ObjectSetInteger со свойством OBJPROP_HIDDEN – true определяется отсутствие созданных объектов в списке объектов графика символа. Функцией ObjectSetString со свойством OBJPROP_TOOLTIP определяется содержание всплывающей подсказки при наведении указателя на объект. В функции OnDeinit () уберем все добавленные графические объекты: void OnDeinit (const int reason) { ObjectsDeleteAll (0, -1, -1); } Более подробно о создании объектов на графике символа мы поговорим далее. Графические объекты Как уже было показано ранее, мы можем рисовать на графике символа не только диаграммы индикатора, но и добавлять различные графические объекты с помощью функции ObjectCreate: bool ObjectCreate ( long chart_id, // идентификатор графика string name, // имя объекта ENUM_OBJECT type, // тип объекта int sub_window, // индекс окна datetime time1, // время первой точки привязки double price1, // цена первой точки привязки datetime timeN=0, // время N-ой точки привязки double priceN=0, // цена N-ой точки привязки datetime time30=0, // время 30-й точки привязки double price30=0 // цена 30-точки привязки ); Здесь параметр sub_window это индекс главного окна графика символа со значением 0 или индекс подокна другого индикатора, присоединенного к графику символа. Например, если в предыдущем примере мы изменим код, и присоединим к графику символа, скажем, индикатор ADX, мы увидим следующее: for (int i=start; i { if (close [i-1]> open [i-1] &&close [i-1]> EMA34HBuffer [i-1] &&close [i-1]> EMA34LBuffer [i-1] &&low [i-1]> EMA125Buffer [i-1] &&low [i-1]> PSARBuffer [i-1] &&EMA125Buffer [i-1] if (!ObjectCreate (0,«Buy»+i, OBJ_ARROW,0,time [i-1],high [i-1])) { return (false); } if (!ObjectCreate (0,«Buy1»+i, OBJ_ARROW,1,time [i-1],high [i-1])) { return (false); } ObjectSetInteger (0,«Buy»+i, OBJPROP_COLOR, clrGreen); ObjectSetInteger (0,«Buy»+i, OBJPROP_ARROWCODE,233); ObjectSetInteger (0,«Buy»+i, OBJPROP_WIDTH,2); ObjectSetInteger (0,«Buy»+i, OBJPROP_ANCHOR, ANCHOR_UPPER); ObjectSetInteger (0,«Buy»+i, OBJPROP_HIDDEN, true); ObjectSetString (0,«Buy»+i, OBJPROP_TOOLTIP, close [i-1]); ObjectSetInteger (0,«Buy1»+i, OBJPROP_COLOR, clrGreen); ObjectSetInteger (0,«Buy1»+i, OBJPROP_ARROWCODE,233); ObjectSetInteger (0,«Buy1»+i, OBJPROP_WIDTH,2); ObjectSetInteger (0,«Buy1»+i, OBJPROP_ANCHOR, ANCHOR_UPPER); ObjectSetInteger (0,«Buy1»+i, OBJPROP_HIDDEN, true); ObjectSetString (0,«Buy1»+i, OBJPROP_TOOLTIP, close [i-1]); } if (close [i-1] if (!ObjectCreate (0,«Sell»+i, OBJ_ARROW,0,time [i-1],low [i-1])) { return (false); } if (!ObjectCreate (0,«Sell1»+i, OBJ_ARROW,1,time [i-1],low [i-1])) { return (false); } ObjectSetInteger (0,«Sell»+i, OBJPROP_COLOR, clrRed); ObjectSetInteger (0,«Sell»+i, OBJPROP_ARROWCODE,234); ObjectSetInteger (0,«Sell»+i, OBJPROP_WIDTH,2); ObjectSetInteger (0,«Sell»+i, OBJPROP_ANCHOR, ANCHOR_LOWER); ObjectSetInteger (0,«Sell»+i, OBJPROP_HIDDEN, true); ObjectSetString (0,«Sell»+i, OBJPROP_TOOLTIP, close [i-1]); ObjectSetInteger (0,«Sell1»+i, OBJPROP_COLOR, clrRed); ObjectSetInteger (0,«Sell1»+i, OBJPROP_ARROWCODE,234); ObjectSetInteger (0,«Sell1»+i, OBJPROP_WIDTH,2); ObjectSetInteger (0,«Sell1»+i, OBJPROP_ANCHOR, ANCHOR_LOWER) ObjectSetInteger (0,«Sell1»+i, OBJPROP_HIDDEN, true); ObjectSetString (0,«Sell1»+i, OBJPROP_TOOLTIP, close [i-1]); } } Нумерация подокон идет сверху вниз в порядке отображения.