Всем доброго времени суток. Возникла необходимость анализировать информацию со старшего таймфрейма.
В системе есть условие, для построения канала. Это нахождение максимальной и минимальной цены, за определенное количество баров. Реализовал следующим способом:
externENUM_TIMEFRAMES TimeFrameRZ = PERIOD_M15; //Период разворотной зоныexternENUM_TIMEFRAMES TimeFrameIn = PERIOD_M5; //Период точки входаexternint ATR_period = 14;
externint UpLineSell = 7;
externint DownLineSell = 7;
externint UpLineBuy = 7;
externint DownLineBuy = 7;
// Параметры разворотных свечейexternstring Comment2 = "---------------------------------Параметры разворотных свечей------------------------------------------";
externint Volotilnost = 20; // Диапазон цен для трех разворотных свечей (в пунктах)externint MaxLineSell = 3;
externint MaxLineBuy = 3;
bool SellPattern = false;
bool BuyPattern = false;
bool New_Bar = false;
double UpLine_Sell = 0;
double DownLine_Sell = 0;
double UpLine_Buy = 0;
double DownLine_Buy = 0;
int i = 0, j = 0;
int ULs = 0;
int DLs = 0;
int ULb = 0;
int DLb = 0;
double MassZone[2][10];
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
if(Digits == 3 || Digits ==5 )
{
Volotilnost *=10;
UpLineSell *= 10;
DownLineSell *= 10;
UpLineBuy*= 10;
DownLineBuy*= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
RazvorotZona();
if(SellPattern == true)
{
if(ObjectCreate(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJ_HLINE,0,TimeCurrent(),UpLine_Sell))
{
ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_COLOR,clrOrange);//--- установим цвет прямоугольника ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
}
if(ObjectCreate(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJ_HLINE,0,TimeCurrent(),DownLine_Sell))
{
ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_COLOR,clrMagenta);//--- установим цвет прямоугольника ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
}
ULs++;
DLs++;
if(DLs >= MaxLineSell && ULs >= MaxLineSell)
{
ObjectDelete(ChartID(),"UpLine_Sell"+IntegerToString(ULs - MaxLineSell));
ObjectDelete(ChartID(),"DownLine_Sell"+IntegerToString(DLs - MaxLineSell));
}
}
if(BuyPattern == true)
{
if(ObjectCreate(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJ_HLINE,0,TimeCurrent(),UpLine_Buy))
{
ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_COLOR,clrDeepSkyBlue);//--- установим цвет прямоугольника ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
}
if(ObjectCreate(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJ_HLINE,0,TimeCurrent(),DownLine_Buy))
{
ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_COLOR,clrBrown);//--- установим цвет прямоугольника ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
}
ULb++;
DLb++;
if(ULb >= MaxLineBuy && DLb >= MaxLineBuy)
{
ObjectDelete(ChartID(),"UpLine_Buy"+IntegerToString(ULb - MaxLineBuy));
ObjectDelete(ChartID(),"DownLine_Buy"+IntegerToString(DLb - MaxLineBuy));
}
}
}
//+------------------------------------------------------------------+// Функция определения нового бара |//+------------------------------------------------------------------+void Find_New_Bar()
{
datetime TimeBar0 = iTime(Symbol(),TimeFrameRZ,0);
staticdatetime New_Time=0; // Время текущего бара
New_Bar=false; // Нового бара нет if(New_Time != TimeBar0) // Сравниваем время
{
New_Time = TimeBar0; // Теперь время такое
New_Bar = true; // Поймался новый бар
}
}
//+------------------------------------------------------------------+// Функция определения разворотной зоны |//+------------------------------------------------------------------+void RazvorotZona()
{
Find_New_Bar();
double Open3= NormalizeDouble (iOpen(Symbol(), TimeFrameRZ,4),Digits);
double Close3 = NormalizeDouble (iClose(Symbol(), TimeFrameRZ,4),Digits);
double High3 = NormalizeDouble (iHigh(Symbol(), TimeFrameRZ,4),Digits);
double Low3 = NormalizeDouble (iLow(Symbol(), TimeFrameRZ,4),Digits);
//Параметры индикатора волотильности ATR для нахожденя относительно большой свечи перед перевернутым Молотомdouble ATR = iATR(Symbol(),TimeFrameRZ,ATR_period,1);
SellPattern = false;
BuyPattern = false;
int bar1 = 1;
int bar2 = 3;
double Max, Min;
Max = High[iHighest(NULL, TimeFrameRZ, MODE_HIGH, bar2, bar1)]; //1. Ищем High и Low на отрезке [bar1, bar2].
Min = Low[iLowest(NULL, TimeFrameRZ, MODE_LOW, bar2, bar1)];
if(NormalizeDouble((Max - Min) / Point, Digits) < Volotilnost &&
MathAbs(Close3-Open3) > 1.5*ATR)
{
if((Close3 > Open3) && New_Bar == true)
{
UpLine_Sell = Max;
DownLine_Sell = Min;
SellPattern = true;
Print ("Идентифицирован паттерн");
Print ("Максимальная цена "+DoubleToStr(Max));
Print ("Минимальная цена "+DoubleToStr(Min));
}
else {SellPattern = false;}
if((Close3 < Open3) && New_Bar == true)
{
UpLine_Buy = Max;
DownLine_Buy = Min;
BuyPattern = true;
Print ("Идентифицирован паттерн");
}
else {BuyPattern = false;}
}
}
Но, при таком подходе идет анализ баров с текущего рабочего таймфрейма М5. Нужно, что бы параметры bar1 и bar2 брались с М15
Max = High[iHighest(NULL, TimeFrameRZ, MODE_HIGH, bar2, bar1)]; //1. Ищем High и Low на отрезке [bar1, bar2].
Min = Low[iLowest(NULL, TimeFrameRZ, MODE_LOW, bar2, bar1)];
ZZuretc: Подскажите как вывести в советник значения индикатора ZigZag? Другие выводятся написав iMA, iStochastic, iWPR ... , а зигзаг вручную вычислять, как?
Решили использовать? Значения индикатора ЗигЗаг везде равны нулю. Только в вершинах значение зигзага равно цене в вершине.
у меня работает - следит за перемещением мыши
Я про суроллинг.)Всем доброго времени суток. Возникла необходимость анализировать информацию со старшего таймфрейма.
В системе есть условие, для построения канала. Это нахождение максимальной и минимальной цены, за определенное количество баров. Реализовал следующим способом:
Но, при таком подходе идет анализ баров с текущего рабочего таймфрейма М5. Нужно, что бы параметры bar1 и bar2 брались с М15
Как это реализовать?
У меня ощущения, что проблема где-то здесь
Кто, что скажет?
У меня ощущения, что проблема где-то здесь
Кто, что скажет?
Ну да, укажите нужный таймфрейм
Ну да, укажите нужный таймфрейм
Так указал, же...
TimeFrameRZ = PERIOD_M15Это внешняя переменнаяОбъявляю массив и заполняю элементы.
Почему на второй строке получаю ошибку declaration without type?
Объявляю массив и заполняю элементы.
Почему на второй строке получаю ошибку declaration without type?
Пропишите код в функции void OnTick() И все заработает.
Или array[0]=0.1; пропишите в void OnTick()
Объявляю массив и заполняю элементы.
Почему на второй строке получаю ошибку declaration without type?
Объявляете массив в области глобальных переменных?
Тогда объявляйте его сразу со значениями (раз вы их сами в коде заполняете - значит они у вас предопределены), например:
... либо заполняйте массив значениями в OnInit() или в той функции, где он будет заполняться.
Подскажите как вывести в советник значения индикатора ZigZag? Другие выводятся написав iMA, iStochastic, iWPR ... , а зигзаг вручную вычислять, как?
Решили использовать? Значения индикатора ЗигЗаг везде равны нулю. Только в вершинах значение зигзага равно цене в вершине.
Надо просматривать бары в цикле. Смотрите пример