求助 MT4 MACD 自动平仓EA

 

谁能帮小弟编写一个MACD 金叉死叉 自动平仓的EA

//+------------------------------------------------------------------+
//| MACD_OsMA_ColorLH.mq4 |
//| Copyright ?2004, MetaQuotes Software Corp. |
//| mod. Variable MA settings https://www.metaquotes.net// |
//+------------------------------------------------------------------+
// 2008forextsd mtf keris f-la ki
#property copyright "Copyright ?2004, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net//"

//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_color1 LimeGreen
#property indicator_color2 Red
#property indicator_color3 C'83,0,0' //Maroon
#property indicator_color4 C'0,66,0' //DarkGreen
#property indicator_color5 DodgerBlue
#property indicator_color6 Chocolate

#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 1
#property indicator_width6 1

//---- indicator buffers

extern int TimeFrame = 0;
extern int FastMA_Period=12;
extern int SlowMA_Period=26;
extern int SignalMA_Period=9;

extern int FastMA_Mode=1;
extern int SlowMA_Mode=1;
extern int SignalMA_Mode=1;

extern int FastMA_Price=0;
extern int SlowMA_Price=0;
//extern int SignalMA_Price=0; // ma on array - price Close only
extern double OsmaMultiplier = 1;
extern bool ShowOsMA_Histo = true;
extern bool ShowMACD_Histo = false;
extern int MaxBarsToCount = 1500;

extern string note_TimeFrames = "M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN|0-CurrentTF";
extern string note_AppliedPrice = "0C,1O 2H3L,4Md 5Tp 6WghC: Md(HL/2)4,Tp(HLC/3)5,Wgh(HLCC/4)6";
extern string note_MA_Mode = "SMA0 EMA1 SMMA2 LWMA3";
extern string note_defaults = "AO:34,5;SMA;PriceMedian(4);MACD 12 26 9 EMA Close;SignalLinePrice- Close only(MaOnArray) ";


double ind_buffer1[], ind_buffer1s[];
double ind_buffer2[], ind_buffer2s[];
double ind_buffer3[];
double ind_buffer4[];
double ind_buffer5[];
double ind_buffer6[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- additional buffer used for counting.
IndicatorBuffers(8);
//---- drawing settings
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexStyle(2,DRAW_HISTOGRAM);
SetIndexStyle(3,DRAW_HISTOGRAM);

SetIndexStyle(4,DRAW_LINE);
SetIndexStyle(5,DRAW_LINE);

IndicatorDigits(Digits+2);

SetIndexDrawBegin(0,SlowMA_Period);
SetIndexDrawBegin(1,SlowMA_Period);
SetIndexDrawBegin(2,SlowMA_Period);
SetIndexDrawBegin(3,SlowMA_Period);

SetIndexDrawBegin(4,SlowMA_Period);
SetIndexDrawBegin(5,SlowMA_Period);

//---- indicator buffers mapping
SetIndexBuffer(0,ind_buffer1) ;

//---- indicator buffers mapping
if(!SetIndexBuffer(0,ind_buffer1) &&
!SetIndexBuffer(1,ind_buffer1s) &&
!SetIndexBuffer(2,ind_buffer2) &&
!SetIndexBuffer(3,ind_buffer2s) &&
!SetIndexBuffer(4,ind_buffer3) &&
!SetIndexBuffer(5,ind_buffer4) &&
!SetIndexBuffer(6,ind_buffer5) &&
!SetIndexBuffer(7,ind_buffer6))
Print("cannot set indicator buffers!");


switch(TimeFrame)
{
case 1: string TimeFrameStr = "M1"; break;
case 5 : TimeFrameStr = "M5"; break;
case 15 : TimeFrameStr = "M15"; break;
case 30 : TimeFrameStr = "M30"; break;
case 60 : TimeFrameStr = "H1"; break;
case 240 : TimeFrameStr = "H4"; break;
case 1440 : TimeFrameStr = "D1"; break;
case 10080 : TimeFrameStr = "W1"; break;
case 43200 : TimeFrameStr = "MN1"; break;
default : TimeFrameStr = "TF0";
}

//---- name for DataWindow and indicator subwindow label

SetIndexLabel(0,"");
SetIndexLabel(1,"");
SetIndexLabel(2,"");
SetIndexLabel(3,"");
SetIndexLabel(4,"MACD");
SetIndexLabel(5,"SigL");

IndicatorShortName("MACD_OsMA ["+TimeFrameStr+"] ("+FastMA_Period+","+SlowMA_Period+","+SignalMA_Period+")");
if (TimeFrame < Period()) TimeFrame = Period();


//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Awesome Oscillator |
//+------------------------------------------------------------------+
int start()
{
double prev,current;
datetime TimeArray[],TimeArray1[];
int i,limit,y=0,counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
ArrayCopySeries(TimeArray, MODE_TIME,Symbol(),TimeFrame);
ArrayCopySeries(TimeArray1, MODE_TIME,Symbol(),TimeFrame);

if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;

limit= Bars-counted_bars;
limit= MathMax(limit,TimeFrame/Period());
limit= MathMin(limit,MaxBarsToCount);


for(i=0,y=0; i<limit; i++)
{

if (Time[i]<TimeArray[y]) y++;
ind_buffer3[i]=iMA(NULL,TimeFrame,FastMA_Period,0,FastMA_Mode,FastMA_Price,y)-
iMA(NULL,TimeFrame,SlowMA_Period,0,SlowMA_Mode,SlowMA_Price,y);

ind_buffer5[y]= ind_buffer3[i];
}

limit = MathMin(limit, MaxBarsToCount-SignalMA_Period);
for(y=0,i=0; i<limit; i++)
{
if (Time[i]<TimeArray1[y]) y++;

ind_buffer4[i]=iMAOnArray(ind_buffer5,0,SignalMA_Period,0,SignalMA_Mode,y);

ind_buffer6[i]= (ind_buffer3[i]- ind_buffer4[i])*OsmaMultiplier;
}

//---- dispatch values between 2 buffers
bool up=true;

for (i=limit;i>=0;i--)

{

ind_buffer1[i] =0.0;
ind_buffer1s[i]=0.0;
ind_buffer2[i] =0.0;
ind_buffer2s[i]=0.0;

if (ShowOsMA_Histo)
{
current=ind_buffer6[i];
prev=ind_buffer6[i+1];
}
if (ShowMACD_Histo)
{
current=ind_buffer3[i];
prev=ind_buffer3[i+1];
}


if(current>prev) up=true;
if(current<prev) up=false;

if(up)
{
if(current > 0)
{
ind_buffer1[i]=current;
ind_buffer1s[i]=0.0;
ind_buffer2[i] =0.0;
ind_buffer2s[i]=0.0;
}
else
{
ind_buffer1[i] =0.0;
ind_buffer1s[i]=current;
ind_buffer2[i] =0.0;
ind_buffer2s[i]=0.0;
}
}
else
{
if(current < 0)
{
ind_buffer1[i] =0.0;
ind_buffer1s[i]=0.0;
ind_buffer2[i] =current;
ind_buffer2s[i]=0.0;
}
else
{
ind_buffer1[i] =0.0;
ind_buffer1s[i]=0.0;
ind_buffer2[i] =0.0;
ind_buffer2s[i]=current;
}
}
}


for (i=0;i<indicator_buffers;i++) SetIndexDrawBegin(i,Bars-MaxBarsToCount+SignalMA_Period);


//---- done
return(0);
}

附加的文件:
原因: