#property strict
//--- описание
#property description "Скрипт рисует значки \"Buy\" в окне графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input color InpColor=C'3,95,172'; // Цвет значков
//+------------------------------------------------------------------+
//| Создает знак "Buy" |
//+------------------------------------------------------------------+
bool ArrowBuyCreate(const long chart_ID=0, // ID графика
const string name="ArrowBuy", // имя знака
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const color clr=C'3,95,172', // цвет знака
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии (при выделении)
const int width=1, // размер линии (при выделении)
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точки привязки, если они не заданы
ChangeArrowEmptyPoint(time,price);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим знак
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_BUY,sub_window,time,price))
{
Print(__FUNCTION__,
": не удалось создать знак \"Buy\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет знака
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии (при выделении)
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер линии (при выделении)
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения знака мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установи приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool ArrowBuyMove(const long chart_ID=0, // ID графика
const string name="ArrowBuy", // имя объекта
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет знак "Buy" |
//+------------------------------------------------------------------+
bool ArrowBuyDelete(const long chart_ID=0, // ID графика
const string name="ArrowBuy") // имя знака
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим знак
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить знак \"Buy\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- если время точки не задано, то она будет на текущем баре
if(!time)
time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date[]; // массив для хранения дат видимых баров
double low[]; // массив для хранения цен Low видимых баров
double high[]; // массив для хранения цен High видимых баров
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(low,bars);
ArrayResize(high,bars);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен Low
if(CopyLow(Symbol(),Period(),0,bars,low)==-1)
{
Print("Не удалось скопировать значения цен Low! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен High
if(CopyHigh(Symbol(),Period(),0,bars,high)==-1)
{
Print("Не удалось скопировать значения цен High! Код ошибки = ",GetLastError());
return;
}
//--- создадим значки "Buy" в точке Low для каждого видимого бара
for(int i=0;i<bars;i++)
{
if(!ArrowBuyCreate(0,"ArrowBuy_"+(string)i,0,date[i],low[i],InpColor))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- переместим значки "Buy" в точку High для каждого видимого бара
for(int i=0;i<bars;i++)
{
if(!ArrowBuyMove(0,"ArrowBuy_"+(string)i,date[i],high[i]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- удалим значки "Buy"
for(int i=0;i<bars;i++)
{
if(!ArrowBuyDelete(0,"ArrowBuy_"+(string)i))
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//---
} |