//+------------------------------------------------------------------+ //| lukas1 arrows & curves.mq4 | //| Идея from Silver, Ramdass еще и Lukas1 руку приложил | //| ..... v3e | //| Глобальые переменные есть. по ним торгует советник Rosa | //+------------------------------------------------------------------+ #property copyright "Lukas1+Silver+CrazyChart" #property link "http://viac.ru/" //---- #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 RoyalBlue #property indicator_color2 OrangeRed #property indicator_color3 Green #property indicator_color4 Green //---- input parameters extern int SSP = 19; //период линейного разворота индикатора extern int RISK = 3; extern int CountBars = 18250; //расчетный период - для 30 мин больше года extern double SkyCh = 23.6; //---- int Shift = 0; int TSP = 9; int PrevAlertTime; double smin, smax; //---- buffers double val1[]; // буфер для бай double val2[]; // буфер для селл double Sky_BufferH[]; double Sky_BufferL[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- indicator line SetIndexStyle(0, DRAW_ARROW); SetIndexArrow(0, 233); // arrowbuy SetIndexStyle(1, DRAW_ARROW); SetIndexArrow(1, 234); // arrowsell SetIndexBuffer(0, val1); // индекс буфера для buy SetIndexBuffer(1, val2); // индекс буфера для sell //---- SetIndexStyle(2, DRAW_LINE); SetIndexBuffer(2, Sky_BufferH); SetIndexShift(2, Shift); SetIndexLabel(2, "Sky-channel High"); //---- SetIndexStyle(3, DRAW_LINE); SetIndexBuffer(3, Sky_BufferL); SetIndexShift(3, Shift); SetIndexLabel(3, "Sky-channel Low"); //---- if(CountBars >= Bars) CountBars=Bars; // CountBars равно количеству баров на графике // для кривой "0"- само рисование; не расчитывать первые SSP баров (сначала SSP=9) SetIndexDrawBegin(0, Bars - CountBars + SSP); // для кривой "1"- само рисование; не расчитывать первые SSP баров (сначала SSP=9) SetIndexDrawBegin(1, Bars - CountBars + SSP); SetIndexDrawBegin(2, SSP + Shift - 1); SetIndexDrawBegin(3, SSP + Shift - 1); //---- return(0); } //+------------------------------------------------------------------+ //| SilverTrend_Signal | //+------------------------------------------------------------------+ int start() { int i; int shift; // расчетное смещение int counted_bars = IndicatorCounted(); // текущий бар для расчета индикатора int i1; int i2; int K, k; double Range, AvgRange, SsMax, SsMin, price; bool uptrend, old; double high, low; //---- if(Bars <= SSP + 1) return(0); //---- initial zero if(counted_bars < SSP + 1) { for(i = 1; i <= SSP; i++) val1[CountBars-i] = 0.0; // обнулили массив val1 //---- for(i = 1; i <= SSP; i++) val2[CountBars-i]=0.0; // обнулили массив val2 //---- for(i = 1; i <= SSP; i++) { Sky_BufferH[Bars-i] = 0; Sky_BufferL[Bars-i] = 0; } } GlobalVariableSet("xSELL", 0); // задали существование и обнулили xSELL=0 GlobalVariableSet("xBUY", 0); // задали существование и обнулили xBUY =0 // стандартные вычисления до 0-го бара i = Bars - SSP; //---- if(counted_bars > SSP) i = Bars - counted_bars - 1; //---- while(i >= 0) { high = High[i]; low = Low[i]; k = i - 1 + SSP; //---- while(k >= i) { price = High[k]; //---- if(high < price) high = price; price = Low[k]; //---- if(low > price) low = price; k--; } // все посчитали - записываем значения точки в массив индикатора Sky_BufferL[i+Shift] = low + (high - low)*SkyCh / 100; Sky_BufferH[i+Shift] = high - (high - low)*SkyCh / 100; i--; // двигаем счетчик } i = Shift - 1; // Считаем точки сдвига - справа от нулевого i=Shift-1; //---- while(i >= 0) { high = High[0]; low = Low[0]; k = SSP - Shift - 1 + i; // каждый следующий уменьшает период k=SSP-Shift+i; //---- while(k >= 0) { price = High[k]; //---- if(high < price) high = price; price = Low[k]; //---- if(low > price) low = price; k--; } // записываем значения в массив Sky_BufferL[i] = low + (high - low)*SkyCh / 100; Sky_BufferH[i] = high - (high - low)*SkyCh / 100; i--; } K = 33 - RISK; //---- for(shift = CountBars - SSP; shift >= 0; shift--) // уменьш значение shift на 1 за проход; { Range = 0; AvgRange = 0; //---- for(i1 = shift; i1 <= shift + SSP; i1++) // увелич "i1" от shift до (shift+SSP) // средние колебания текущих цен AvgRange = AvgRange + MathAbs(High[i1] - Low[i1]); Range = AvgRange / (SSP + 1); // диапазон колебания текущих цен SsMax = High[shift]; // задать SsMax SsMin = Low[shift]; // задать SsMin //---- for(i2 = shift; i2 <= shift + SSP - 1; i2++) // увелич "i2" от shift до (shift+SSP) { price = High[i2]; // задать price //---- if(SsMax < price) SsMax = price; // подтянули SsMax до уровня High[i2] price = Low[i2]; //---- if(SsMin >= price) SsMin = price; // понизили SsMin до уровня Low[i2] } smin = SsMin + (SsMax - SsMin)*K / 100; // smin выше SsMin с учетом коэфф.риска smax = SsMax - (SsMax - SsMin)*K / 100; // smax ниже SsMax с учетом коэфф.риска val1[shift] = 0; // буфер для бай val2[shift] = 0; // буфер для селл //---- if(Close[shift] < smin) uptrend = false; //---- if(Close[shift] > smax) uptrend = true; //---- if(uptrend != old && uptrend == true) { val1[shift] = Low[shift] - Range*0.5; // если условия выполнены то вычисляем val1 //---- if(shift == 0) GlobalVariableSet("xBUY",1); } //---- if(uptrend != old && uptrend == false) { val2[shift] = High[shift] + Range*0.5; // если условия выполнены то вычисляем val2 //---- if(shift == 0) GlobalVariableSet("xSELL",1); } old=uptrend; } return(0); } //+------------------------------------------------------------------+