#property description "Скрипт на основе данных индикатора RSI выводит в окне графика"
#property description "данные о том, как часто рынок находился в зонах перекупленности"
#property description "и перепроданности в указанном промежутке времени."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры
input int InpMAPeriod=14; // Период скользящей средней
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Тип цены
input double InpOversoldValue=30.0; // Уровень перепроданности
input double InpOverboughtValue=70.0; // Уровень перекупленности
input datetime InpDateStart=D'2012.01.01 00:00'; // Дата начала анализа
input datetime InpDateFinish=D'2013.01.01 00:00'; // Дата конца анализа
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
double rsi_buff[]; // массив значений индикатора
int size=0; // размер массива
//--- получим хэндл индикатора RSI
ResetLastError();
int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
if(rsi_handle==INVALID_HANDLE)
{
//--- не удалось получить хэндл индикатора
PrintFormat("Ошибка получения хэндла индикатора. Код ошибки = %d",GetLastError());
return;
}
//--- находимся в цикле, пока индикатор не рассчитает все свои значения
while(BarsCalculated(rsi_handle)==-1)
{
//--- выходим, если пользователь принудительно завершил работу скрипта
if(IsStopped())
return;
//--- задержка, чтобы индикатор успел вычислить свои значения
Sleep(10);
}
//--- скопируем значения индикатора за определенный период
ResetLastError();
if(CopyBuffer(rsi_handle,0,InpDateStart,InpDateFinish,rsi_buff)==-1)
{
PrintFormat("Не удалось скопировать значения индикатора. Код ошибки = %d",GetLastError());
return;
}
//--- получим размер массива
size=ArraySize(rsi_buff);
//--- отсортируем массив
ArraySort(rsi_buff);
//--- узнаем какой процент времени рынок находился в зоне перепроданности
double ovs=(double)ArrayBsearch(rsi_buff,InpOversoldValue)*100/(double)size;
//--- узнаем какой процент времени рынок находился в зоне перекупленности
double ovb=(double)(size-ArrayBsearch(rsi_buff,InpOverboughtValue))*100/(double)size;
//--- сформируем строки для вывода данных
string str="С "+TimeToString(InpDateStart,TIME_DATE)+" по "
+TimeToString(InpDateFinish,TIME_DATE)+" рынок находился:";
string str_ovb="в зоне перекупленности "+DoubleToString(ovb,2)+"% времени";
string str_ovs="в зоне перепроданности "+DoubleToString(ovs,2)+"% времени";
//--- отобразим данные на графике
CreateLabel("top",5,60,str,clrDodgerBlue);
CreateLabel("overbought",5,35,str_ovb,clrDodgerBlue);
CreateLabel("oversold",5,10,str_ovs,clrDodgerBlue);
//--- перерисуем график
ChartRedraw(0);
//--- задержка
Sleep(10000);
}
//+------------------------------------------------------------------+
//| Вывод комментария в левый нижний угол графика |
//+------------------------------------------------------------------+
void CreateLabel(const string name,const int x,const int y,
const string str,const color clr)
{
//--- создание метки
ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- привязка метки к левому нижнему углу
ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
//--- изменим положение точки привязки
ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
//--- расстояние по оси X от точки привязки
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
//--- расстояние по оси Y от точки привязки
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- текст метки
ObjectSetString(0,name,OBJPROP_TEXT,str);
//--- цвет текста
ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- размер текста
ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
}
|