Is it possible to create a custom line study in mt4? I wish to create "dynamic gann levels" line study.
- newbie's question: what's wrong with my code?
- levels
- create shortcut for insert a rectangle
In general words, it's possible. See for example, "Новый клиентский терминал MetaTrader 4 build 199"
Here is endless looped custom script which drawing Andrew's Pitchfork.
Here is endless looped custom script which drawing Andrew's Pitchfork.
Is there a guide in English?
Is there a guide in english?
Put script into MetaEditor and learn how it works.
//+------------------------------------------------------------------+ //| AndrewsPitchfork.mq4 | //| Rosh | //| http://www.alpari-idc.ru/ru/experts/articles/ | //+------------------------------------------------------------------+ #property copyright "Rosh" #property link "http://www.alpari-idc.ru/ru/experts/articles/" extern color mainLineColor=Blue; extern color bandsLineColor=Blue; int range=20;// initial index bar of first reper; // coordinates of repers double price1,price2,price3; datetime time1,time2,time3; double A; // coeff for Y=A*X+B string medianLine="mainAP"; string upLine="upAP"; string downLine="downAP"; double PriceMediana; datetime TimeMediana; double t2,t3,bar1,bar2,bar3; int intBar1,intBar2,intBar3,barMediana; //+------------------------------------------------------------------+ //| checking shift of Number reper | //+------------------------------------------------------------------+ int Delta(int Number) { //---- int res=0; if (Number<0||Number>3) return(0); switch (Number) { case 1:if (MathAbs(price1-ReperPrice(1))>Point || MathAbs(time1-ReperTime(1))>0) { res=1; break; } case 2:if (MathAbs(price2-ReperPrice(2))>Point || MathAbs(time2-ReperTime(2))>0) { res=2; break; } case 3:if (MathAbs(price3-ReperPrice(3))>Point || MathAbs(time3-ReperTime(3))>0) { res=3; break; } default: res=0;break; } return(res); } //+------------------------------------------------------------------+ //| checking repers | //+------------------------------------------------------------------+ bool isChanged() { //---- bool res=false; if (Delta(1)!=0) return(true); if (Delta(2)!=0) return(true); if (Delta(3)!=0) return(true); return(res); } //+------------------------------------------------------------------+ //| redraw pitchforks | //+------------------------------------------------------------------+ void Redraw() { //---- if (ObjectFind(medianLine)==-1) ObjectCreate(medianLine,OBJ_TREND,0,time1,price1,TimeMediana,PriceMediana); else { ObjectSet(medianLine,OBJPROP_PRICE1,price1); ObjectSet(medianLine,OBJPROP_PRICE2,PriceMediana); ObjectSet(medianLine,OBJPROP_TIME1,time1); ObjectSet(medianLine,OBJPROP_TIME2,TimeMediana); } ObjectSet(medianLine,OBJPROP_COLOR,mainLineColor); if (ObjectFind(upLine)==-1) ObjectCreate(upLine,OBJ_TREND,0,time2,price2,Time[0],price2+A*iBarShift(Symbol(),0,time2)); else { ObjectSet(upLine,OBJPROP_PRICE1,price2); ObjectSet(upLine,OBJPROP_PRICE2,price2+A*iBarShift(Symbol(),0,time2)); ObjectSet(upLine,OBJPROP_TIME1,time2); ObjectSet(upLine,OBJPROP_TIME2,Time[0]); } ObjectSet(upLine,OBJPROP_COLOR,bandsLineColor); if (ObjectFind(downLine)==-1) ObjectCreate(downLine,OBJ_TREND,0,time3,price3,Time[0],price3+A*iBarShift(Symbol(),0,time3)); else { ObjectSet(downLine,OBJPROP_PRICE1,price3); ObjectSet(downLine,OBJPROP_PRICE2,price3+A*iBarShift(Symbol(),0,time3)); ObjectSet(downLine,OBJPROP_TIME1,time3); ObjectSet(downLine,OBJPROP_TIME2,Time[0]); } ObjectSet(downLine,OBJPROP_COLOR,bandsLineColor); //Print("Перерисовываем"); WindowRedraw(); return; } //+------------------------------------------------------------------+ //| return time of reper | //+------------------------------------------------------------------+ datetime ReperTime(int Number) { //---- datetime res=0; //Print("Возвращаем время репера №",Number); if (Number==1) { if (ObjectFind(medianLine)==-1) return(res); else res=ObjectGet(medianLine,OBJPROP_TIME1); } if (Number==2) { if (ObjectFind(upLine)==-1) return(res); else res=ObjectGet(upLine,OBJPROP_TIME1); } if (Number==3) { if (ObjectFind(downLine)==-1) return(res); else res=ObjectGet(downLine,OBJPROP_TIME1); } return(res); } //+------------------------------------------------------------------+ //| return price of reper | //+------------------------------------------------------------------+ double ReperPrice(int Number) { //---- double res=0; //Print("Возвращаем цену репера #",Number); if (Number==1) { if (ObjectFind(medianLine)==-1) return(res); else res=ObjectGet(medianLine,OBJPROP_PRICE1); } if (Number==2) { if (ObjectFind(upLine)==-1) return(res); else res=ObjectGet(upLine,OBJPROP_PRICE1); } if (Number==3) { if (ObjectFind(downLine)==-1) return(res); else res=ObjectGet(downLine,OBJPROP_PRICE1); } return(res); } //+------------------------------------------------------------------+ //| scrypt initialization function | //+------------------------------------------------------------------+ int init() { //---- double drop_price=WindowPriceOnDropped(); datetime drop_time=WindowTimeOnDropped(); if (drop_time>0) { price1=drop_price; time1=drop_time; Redraw(); } else { time1=ReperTime(1); //Print("Время первого репера ",TimeToStr(time1)); if (time1==0) { time1=Time[range]; price1=(High[iHighest(Symbol(),0,MODE_HIGH,range,0)]+Low[iLowest(Symbol(),0,MODE_LOW,range,0)])/2; bar1=range; } else { price1=ReperPrice(1); bar1=iBarShift(Symbol(),0,time1); } //Print("Выполняем блок без броска скрипта"); time2=ReperTime(2); if (time2==0) { intBar2=iHighest(Symbol(),0,MODE_HIGH,range/2.0,0); bar2=intBar2; time2=Time[intBar2]; price2=High[intBar2]; } else price2=ReperPrice(2); time3=ReperTime(3); if (time3==0) { intBar3=iLowest(Symbol(),0,MODE_LOW,range/2.0,0); bar3=intBar3; time3=Time[intBar3]; price3=Low[intBar3]; } else price3=ReperPrice(3); bar2=iBarShift(Symbol(),0,time2); bar3=iBarShift(Symbol(),0,time3); if (MathMod(MathAbs(bar3-bar2),2)==0) // четное число промежутков между барами { PriceMediana=(price2+price3)/2.0; t2=time2; t3=time3; TimeMediana=(t2+t3)/2.0; A=(PriceMediana-price1)/(bar1-(bar3+bar2)/2.0); //Print("Первый вариант, barMediana=",(bar3+bar2)/2," bar2=",bar2," bar3=",bar3," bar1=",bar1); } else // нечетное число промежутков между барами { barMediana=(bar3+bar2+1.0)/2.0; TimeMediana=Time[barMediana]; PriceMediana=(price2+price3)/2.0; A=(PriceMediana-price1)/(bar1-(bar3+bar2)/2.0); PriceMediana=price1+A*(bar1-barMediana); //Print("Второй вариант, barMediana=",barMediana," bar2=",bar2," bar3=",bar3," bar1=",bar1); } Redraw(); } return(0); } //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- while (!IsStopped()) { if (isChanged()) { time1=ReperTime(1); time2=ReperTime(2); time3=ReperTime(3); price1=ReperPrice(1); price2=ReperPrice(2); price3=ReperPrice(3); bar1=iBarShift(Symbol(),0,time1); bar2=iBarShift(Symbol(),0,time2); bar3=iBarShift(Symbol(),0,time3); if (MathMod(MathAbs(bar3-bar2),2)==0) // четное число промежутков между барами { PriceMediana=(price2+price3)/2.0; t2=time2; t3=time3; TimeMediana=(t2+t3)/2.0; A=(PriceMediana-price1)/(bar1-(bar3+bar2)/2.0); //Print("Первый вариант, barMediana=",(bar3+bar2)/2," bar2=",bar2," bar3=",bar3," bar1=",bar1); } else // нечетное число промежутков между барами { barMediana=(bar3+bar2+1.0)/2.0; TimeMediana=Time[barMediana]; PriceMediana=(price2+price3)/2.0; A=(PriceMediana-price1)/(bar1-(bar3+bar2)/2.0); PriceMediana=price1+A*(bar1-barMediana); //Print("Второй вариант, barMediana=",barMediana," bar2=",bar2," bar3=",bar3," bar1=",bar1); } Redraw(); } Sleep(100); } //---- return(0); } //+------------------------------------------------------------------+
There is not complex.
You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register