Particular features:
General features (basically everything that others have):
Other things to consider: I do not care much about time. I also need time to test its functionality, so I'm not in a hurry. I believe that we can wait for each other a little longer, until we are both happy with the result. If the EA will have a small info on the chart, writing about trend, trades, profit etc and other useful info such as max lotsize, broker time, name and so on, it will be even better for my visual.
The nonlagma code used for the trend and signal must have different settings that I can choose from the EA settings. For example Trend nonlagma = 100, signal nonlagma = 10.
For a better understanding of what I need, here's how I imagine the EA's settings:
Trading Sundays = false/true
Trading Mondays = false/true
...
Trading Sessions = true/false (false means ignore the sessions)
Asian session start = 23:00
Asian session finish = 8:00
London session start ...
...
Trend = price / angle / both / disabled
Trend period = 100
Trend price = close/open/etc
Signal = 10
Signal period = 100
Signal price = close/open/etc
Signal shift = 1 (ie bar)
Lotsize management = true/false
Percentage = 0.01 (if above is true)
Fixed = 0.1 (if management = false)
Minimum profit = 1$
Maximum loss = 100$
Maximum trades opened = 4
Stoploss = 30 pips
Take profit = 50 pips
Breakeven = 30 pips
Trailing stop = psar/moving average/chandelier/fractals (ie candlestick)/atr/pips
Trailing Buffer = 5 pips
Trailing PSAR settings = ...
Trailing MA settings = ...etc
...
Slippage = 3 pips
Magic Number = 333
Trade comment = I am a winner lol
Opposite trade signal = close loser and open new trade accordingly / open hedging trade / do nothing
Hedging Multiplier = 2
Close basket of opposite trades if profit >= Minimum profit (above) = true/false
Close basket of opposite trades if profit <= Maximum loss (above) = true/false
Martingale if last trade closed in negative profit = true/false
Martingale multiplier = 2
Martingale tries = 3 (how many consecutive losses are allowed before we give up and the lotsize resumes to normal)
I hope that I have managed to paint the entire picture. If not, I will try to better explain later.
Below is the mq4 non lag moving average algorithm I want to be used for trend and signal:
#property copyright "" #property link "" #property description "" #property strict #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Gold #property indicator_width1 2 #property indicator_color2 Teal #property indicator_width2 2 #property indicator_color3 Crimson #property indicator_width3 2 input ENUM_APPLIED_PRICE Price=0; extern int Length = 15; //Period of NonLagMA extern int Displace = 0; //DispLace or Shift extern double PctFilter = 0; //Dynamic filter in decimal extern int Color = 1; //Switch of Color mode (1-color) extern int ColorBarBack = 1; //Bar back for color mode extern double Deviation = 0; //Up/down deviation extern int AlertMode = 0; //Sound Alert switch (0-off,1-on) extern int WarningMode = 0; //Sound Warning switch(0-off,1-on) double MABuffer[]; double UpBuffer[]; double DnBuffer[]; double trend[]; double Del[]; double AvgDel[]; double alfa[]; int i, Phase, Len,Cycle=4; double Coeff, beta, t, Sum, Weight, g; double pi = 3.1415926535; bool UpTrendAlert=false, DownTrendAlert=false; int OnInit() { IndicatorBuffers(6); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,MABuffer); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,UpBuffer); SetIndexStyle(2,DRAW_LINE); SetIndexBuffer(2,DnBuffer); SetIndexBuffer(3,trend); SetIndexBuffer(4,Del); SetIndexBuffer(5,AvgDel); string short_name; IndicatorDigits(int(MarketInfo(Symbol(),MODE_DIGITS))); short_name="NonLagMA ("+IntegerToString(Length)+")"; IndicatorShortName(short_name); SetIndexLabel(0,"Level"); SetIndexLabel(1,"Up"); SetIndexLabel(2,"Dn"); SetIndexShift(0,Displace); SetIndexShift(1,Displace); SetIndexShift(2,Displace); SetIndexEmptyValue(0,EMPTY_VALUE); SetIndexEmptyValue(1,EMPTY_VALUE); SetIndexEmptyValue(2,EMPTY_VALUE); SetIndexDrawBegin(0,Length*Cycle+Length+1); SetIndexDrawBegin(1,Length*Cycle+Length+1); SetIndexDrawBegin(2,Length*Cycle+Length+1); Coeff = 3*pi; Phase = Length-1; Len = Length*4 + Phase; ArrayResize(alfa,Len); Weight=0; for (i=0;i<Len-1;i++) { if (i<=Phase-1) t = 1.0*i/(Phase-1); else t = 1.0 + (i-Phase+1)*(2.0*Cycle-1.0)/(Cycle*Length-1.0); beta = MathCos(pi*t); g = 1.0/(Coeff*t+1); if (t <= 0.5 ) g = 1; alfa[i] = g * beta; Weight += alfa[i]; } return(INIT_SUCCEEDED); } int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { int shift=0, counted_bars=IndicatorCounted(),limit=0; double price=0, Filter=0; if ( counted_bars > 0 ) limit=Bars-counted_bars; if ( counted_bars < 0 ) return(0); if ( counted_bars ==0 ) limit=Bars-Len-1; if ( counted_bars < 1 ) for(i=1;i<Length*Cycle+Length;i++) { MABuffer[Bars-i]=0; UpBuffer[Bars-i]=0; DnBuffer[Bars-i]=0; } for(shift=limit;shift>=0;shift--) { Sum = 0; for (i=0;i<=Len-1;i++) { price = iMA(NULL,0,1,0,3,Price,i+shift); Sum += alfa[i]*price; } if (Weight > 0) MABuffer[shift] = (1.0+Deviation/100)*Sum/Weight; if (PctFilter>0) { Del[shift] = MathAbs(MABuffer[shift] - MABuffer[shift+1]); double sumdel=0; for (i=0;i<=Length-1;i++) sumdel = sumdel+Del[shift+i]; AvgDel[shift] = sumdel/Length; double sumpow = 0; for (i=0;i<=Length-1;i++) sumpow+=MathPow(Del[shift+i]-AvgDel[shift+i],2); double StdDev = MathSqrt(sumpow/Length); Filter = PctFilter * StdDev; if(MathAbs(MABuffer[shift]-MABuffer[shift+1]) < Filter) MABuffer[shift]=MABuffer[shift+1]; } else Filter=0; if (Color>0) { trend[shift]=trend[shift+1]; if (MABuffer[shift]-MABuffer[shift+1] > Filter) trend[shift]= 1; if (MABuffer[shift+1]-MABuffer[shift] > Filter) trend[shift]=-1; if (trend[shift]>0) { UpBuffer[shift] = MABuffer[shift]; if (trend[shift+ColorBarBack]<0) UpBuffer[shift+ColorBarBack]=MABuffer[shift+ColorBarBack]; DnBuffer[shift] = EMPTY_VALUE; if (WarningMode>0 && trend[shift+1]<0 && shift==0) PlaySound("alert2.wav"); } if (trend[shift]<0) { DnBuffer[shift] = MABuffer[shift]; if (trend[shift+ColorBarBack]>0) DnBuffer[shift+ColorBarBack]=MABuffer[shift+ColorBarBack]; UpBuffer[shift] = EMPTY_VALUE; if (WarningMode>0 && trend[shift+1]>0 && shift==0) PlaySound("alert2.wav"); } } } string Message; if (trend[2]<0 && trend[1]>0 && Volume[0]>1 && !UpTrendAlert) { Message = " NonLagMA "+Symbol()+" M"+IntegerToString(Period())+": changed to uptrend"; if ( AlertMode>0 ) Alert (Message); UpTrendAlert=true; DownTrendAlert=false; } if ( trend[2]>0 && trend[1]<0 && Volume[0]>1 && !DownTrendAlert) { Message = " NonLagMA "+Symbol()+" M"+IntegerToString(Period())+": changed to downtrend"; if ( AlertMode>0 ) Alert (Message); DownTrendAlert=true; UpTrendAlert=false; } return(rates_total); }