//+------------------------------------------------------------------+ //| lukas1 arrows & curves.mq4 v.28 //| Copyright © 2007, Лукашук Виктор Геннадьевич aka lukas1 //| 13.05.2009 добавил "Alert". //+------------------------------------------------------------------+ // Индикатор рисует сигналы открытия и закрытия в том случае, // когда цена закрытия бара пробила уровень, нарисованный линиями. //1. Для линий введена задержка, приводящая к смещению вправо ("relay") //2. Появились крестики, обозначающие закрытие сделки //3. Повторные ордера в том же направлении отмечены так же крестиками #property copyright "Copyright © 2007, MetaQuotes Software Corp.+lukas1" #property link "lukas1@ngs.ru" //---- #property indicator_chart_window #property indicator_buffers 8 #property indicator_color1 DeepSkyBlue #property indicator_color2 Red #property indicator_color3 Orange #property indicator_color4 Orange #property indicator_color5 MediumSeaGreen #property indicator_color6 MediumSeaGreen #property indicator_color7 DeepSkyBlue #property indicator_color8 Red #property indicator_width1 1 #property indicator_width2 1 #property indicator_width7 2 #property indicator_width8 2 //---- input parameters extern int SSP = 20; //период линейного разворота индикатора extern int Channel = 0; //уменьшение диапазона канала. Д.б. в диапазоне 0-50 extern int Ch_Stop = 30; //уменьшение стопового канала (суммируется с основным) extern int relay = 10; //смещение линий вглубь истории на 4 бара extern int CBars = 2000; //расчетный период extern bool alerts = true;//возможность выключить сигнал "Alert" int i; static int alert_buy,alert_sell; double high, low, smin, smax, smin2, smax2; double val1[]; // буфер для бай double val2[]; // буфер для селл double BufferH[]; double BufferL[]; double BufferHS[]; double BufferLS[]; double valX1[],valX2[]; // буфер для X bool uptrend, old, uptrend2, old2; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { SetIndexStyle(0, DRAW_ARROW,0,1); SetIndexArrow(0, 233); // стрелка для бай SetIndexBuffer(0, val1); // индекс буфера для бай SetIndexLabel(0, "BUY"); SetIndexDrawBegin(0, Bars-CBars-2*SSP); SetIndexStyle(1, DRAW_ARROW,0,1); SetIndexArrow(1, 234); // стрелка для селл SetIndexBuffer(1, val2); // индекс буфера для селл SetIndexLabel(1, "SELL"); SetIndexDrawBegin(1, Bars-CBars-2*SSP); SetIndexStyle(2, DRAW_LINE,0,1); SetIndexBuffer(2, BufferH); SetIndexLabel(2, "BUY from here"); SetIndexDrawBegin(2, Bars-CBars-2*SSP); SetIndexStyle(3, DRAW_LINE,0,1); SetIndexBuffer(3, BufferL); SetIndexLabel(3, "SELL from here"); SetIndexDrawBegin(3, Bars-CBars-2*SSP); SetIndexStyle(4, DRAW_LINE,0,1); SetIndexBuffer(4, BufferHS); SetIndexLabel(4, "BuyStop"); SetIndexDrawBegin(4, Bars-CBars-2*SSP); SetIndexStyle(5, DRAW_LINE,0,1); SetIndexBuffer(5, BufferLS); SetIndexLabel(5, "SellStop"); SetIndexDrawBegin(5, Bars-CBars-2*SSP); SetIndexStyle(6, DRAW_ARROW,0,2); SetIndexArrow(6, 251); // крестик синий SetIndexBuffer(6, valX1); // индекс буфера для крестика SetIndexDrawBegin(6, Bars-CBars-2*SSP); SetIndexStyle(7, DRAW_ARROW,0,2); SetIndexArrow(7, 251); // крестик красный SetIndexBuffer(7, valX2); // индекс буфера для крестика SetIndexDrawBegin(7, Bars-CBars-2*SSP); //---- return(0); } //+------------------------------------------------------------------+ //| Calculation of Channel lines //+------------------------------------------------------------------+ int start() { int counted_bars = IndicatorCounted(); //---- последний посчитанный бар будет пересчитан if(counted_bars > 0) counted_bars--; //---- if(Bars <= SSP + 1) return(0); //---- uptrend =false; old =false; uptrend2 =false; old2 =false; int limit=CBars-SSP-relay; if(limit>Bars) limit=Bars-SSP-relay-1; //---- for(i = limit; i >= 0; i--) // уменьш значение shift на 1 за проход; { high = High[Highest(Symbol(),0,MODE_HIGH,SSP,i+relay)]; low = Low[Lowest(Symbol(),0,MODE_LOW,SSP,i+relay)]; smax = high - (high - low)*Channel / 100; // smax ниже high с учетом коэфф.Channel smin = low + (high - low)*Channel / 100; // smin выше low с учетом коэфф.Channel smax2= high - (high - low)*(Channel+Ch_Stop) / 100; // smax ниже high с учетом коэфф.Chan+Ch_Stop smin2= low + (high - low)*(Channel+Ch_Stop) / 100; // smin выше low с учетом коэфф.Channel val1[i] = 0; val2[i] = 0; valX1[i] = 0; valX2[i] = 0; //----------------------- if(Close[i] < smin && Close[i] < smax && uptrend2 == true && i!=0 ) // выключено мерцание стрелок (i!=0) { uptrend = false; } if(Close[i] > smax && Close[i] > smin && uptrend2 == false && i!=0 ) // выключено мерцание стрелок (i!=0) { uptrend = true; } if((Close[i] > smax2 || Close[i] > smin2) && uptrend == false && i!=0 ) // выключено мерцание стрелок (i!=0) { uptrend2 = false; } if((Close[i] < smin2 || Close[i] < smax2) && uptrend == true && i!=0 ) // выключено мерцание стрелок (i!=0) { uptrend2 = true; } //---- повторный сигнал не переключает режимы "uptrend" //---- но используется сигнал по крестикам if(Close[i] < smin && Close[i] < smax && uptrend2 == false && i!=0 ) // выключено мерцание стрелок (i!=0) { val2[i] = low; // если условия выполнены то рисуем val2 uptrend2 = true; } //---- повторный сигнал не переключает режимы "uptrend" //---- но используется сигнал по крестикам if(Close[i] > smax && Close[i] > smin && uptrend2 == true && i!=0 ) // выключено мерцание стрелок (i!=0) { val1[i] = high; // если условия выполнены то рисуем val1 uptrend2 = false; } //---- if(uptrend != old && uptrend == false) { val2[i] = low; // если условия выполнены то рисуем val1 } if(uptrend != old && uptrend == true) { val1[i] = high; // если условия выполнены то рисуем val2 } //---- if(uptrend2 != old2 && uptrend2 == true) { valX1[i] = smax2; // если условия выполнены то рисуем valX1 } if(uptrend2 != old2 && uptrend2 == false) { valX2[i] = smin2; // если условия выполнены то рисуем valX2 } //----------------------- old=uptrend; old2=uptrend2; //----------------------- BufferH[i]=smax; BufferL[i]=smin; BufferHS[i]=smax2; BufferLS[i]=smin2; } if(alerts && val2[2]>0) alert_buy=0; if(alerts && val1[2]>0) alert_sell=0; //индикатор звонит на первых двух тиках (т.е. 2 раза) для каждой стрелки. if(alerts && val2[1]>0 && alert_buy==0) {Alert("Sell on "+Symbol());alert_buy=1;} if(alerts && val1[1]>0 && alert_sell==0){Alert("Buy on "+Symbol());alert_sell=1;} return(0); } //+------------------------------------------------------------------+