//+------------------------------------------------------------------+ //| lukas1 arrows & curves.mq4 v.28 //| Copyright © 2007, Лукашук Виктор Геннадьевич aka lukas1 //+------------------------------------------------------------------+ //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; //расчетный период int i; 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; GlobalVariableSet("goSELL", 0); // задали существование и обнулили goSELL=0 GlobalVariableSet("goBUY", 0); // задали существование и обнулили goBUY =0 GlobalVariableSet("stSELL", 0); // задали существование и обнулили stSELL=0 GlobalVariableSet("stBUY", 0); // задали существование и обнулили stBUY =0 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]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]smax && Close[i]>smin && uptrend2==true && i!=0) // выключено мерцание стрелок (i!=0) { val1[i]=high; // если условия выполнены то рисуем val1 if(i==0) GlobalVariableSet("goBUY",1); uptrend2=false; } //---- if(uptrend!=old && uptrend==false) { val2[i]=low; // если условия выполнены то рисуем val1 if(i==0) GlobalVariableSet("goSELL",1); } if(uptrend!=old && uptrend==true) { val1[i]=high; // если условия выполнены то рисуем val2 if(i==0) GlobalVariableSet("goBUY",1); } //---- if(uptrend2!=old2 && uptrend2==true) { valX1[i]=smax2; // если условия выполнены то рисуем valX1 if(i==0) GlobalVariableSet("stBUY",1); } if(uptrend2!=old2 && uptrend2==false) { valX2[i]=smin2; // если условия выполнены то рисуем valX2 if(i==0) GlobalVariableSet("stSELL",1); } //----------------------- old=uptrend; old2=uptrend2; //----------------------- BufferH[i]=smax; BufferL[i]=smin; BufferHS[i]=smax2; BufferLS[i]=smin2; } return(0); } //+------------------------------------------------------------------+