Hello, I've written an EA which trades Pivot Points, you'll find their calculation inside the EA. It may look more complicated than needed, but I wanted to use a certain hourly Close for indicator calculation. This works fine.
What troubles me is the implementation of trend filtering. I'd like to use a simple filter from daily timeframe, i.e. comparison between EMA 9,12,26: buy would be allowed if 9>12>26, sell if 9<12<26, no trades allowed if other combination.
The way the EA is written, it seems that the condition is checked only once and not for every bar as intended. I'm clueless, why this is so. Either I get only buys or only sells, which means that some data is provided by the if-conditions in line 164ff, but it doesn't actualize as it should.
Where is the mistake? Can anybody provide an example of a solution? Please help!
Regards,
PomeGranate
//+------------------------------------------------------------------+//| PivotPoints_for_EA.mq4 |//| 2015 (C) PomeGranate |//+------------------------------------------------------------------+#define MAGIC 20150518//---- INPUT INDICATOR PARAMETERSint closetime_UTC=20;
//---- DECLARING VARIABLES FOR CHOOSING A CHARTint timeframe=PERIOD_H1,
IndCounted=0;
string Symb=Symbol(); // Symbolexterndouble Lots=0.05;
//--- ARRAYS for PPdouble PPBuffer[],R1Buffer[],R2Buffer[],R3Buffer[],R4Buffer[],
S1Buffer[],S2Buffer[],S3Buffer[],S4Buffer[];
int TrendArray[];
// GETTING THE AMOUNT OF ALL BARS OF THE CHARTint IBARS=iBars(Symb,timeframe);
double orderlevel[];
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int init()
{
//Array ops:if(ArraySize(orderlevel)<9)
ArrayResize(orderlevel,9);
if(ArraySize(PPBuffer)<IBARS)
{
ArraySetAsSeries(PPBuffer,false);
ArraySetAsSeries(R1Buffer,false);
ArraySetAsSeries(R2Buffer,false);
ArraySetAsSeries(R3Buffer,false);
ArraySetAsSeries(R4Buffer,false);
ArraySetAsSeries(S1Buffer,false);
ArraySetAsSeries(S2Buffer,false);
ArraySetAsSeries(S3Buffer,false);
ArraySetAsSeries(S4Buffer,false);
ArraySetAsSeries(TrendArray,false);
// ArraySetAsSeries(Trend,false);//---- ArrayResize(PPBuffer,IBARS);
ArrayResize(R1Buffer,IBARS);
ArrayResize(R2Buffer,IBARS);
ArrayResize(R3Buffer,IBARS);
ArrayResize(R4Buffer,IBARS);
ArrayResize(S1Buffer,IBARS);
ArrayResize(S2Buffer,IBARS);
ArrayResize(S3Buffer,IBARS);
ArrayResize(S4Buffer,IBARS);
ArrayResize(TrendArray,IBARS);
// ArrayResize(Trend,IBARS);//---- ArraySetAsSeries(PPBuffer,true);
ArraySetAsSeries(R1Buffer,true);
ArraySetAsSeries(R2Buffer,true);
ArraySetAsSeries(R3Buffer,true);
ArraySetAsSeries(R4Buffer,true);
ArraySetAsSeries(S1Buffer,true);
ArraySetAsSeries(S2Buffer,true);
ArraySetAsSeries(S3Buffer,true);
ArraySetAsSeries(S4Buffer,true);
ArraySetAsSeries(TrendArray,true);
// ArraySetAsSeries(Trend,true);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int start()
{
double pivotpoint,R1,R2,R3,R4,S1,S2,S3,S4;
//----+ Insertion of integer variables and GETTING ALREADY CALCULATED BARSint limit,MaxBar,bar,counted_bars=IndCounted;
//----+ REMEMBERING THE AMOUNT OF ALL BARS OF THE CHART
IndCounted=IBARS-1;
//---- defining the number of the oldest bar, // starting from which new bars will be recalculated
limit=IBARS-counted_bars-1;
//---- defining the number of the oldest bar, // starting from which new bars will be recalculated
MaxBar=IBARS-1 -(10);
//----+ INDICATOR CALCULATION PivotPointsfor(bar=limit; bar>=0; bar--)
{
int h=0,
f=0,
g=0;
switch(TimeDayOfWeek(Time[bar]))
{
case0:
h=1;
f=0;
g=3+closetime_UTC;
break;
case1:
h=2;
f=26;
g=0;
break;
case2:
h=1;
f=24;
g=0;
break;
case3:
h=1;
f=24;
g=0;
break;
case4:
h=1;
f=24;
g=0;
break;
case5:
h=1;
f=24;
g=0;
break;
case6:
h=1;
f=24;
g=0;
break;
}
int dshift=iBarShift(NULL,PERIOD_D1,Time[bar],false);
datetime Today=iTime(NULL,PERIOD_D1,dshift); //determine time[i]'s 00:00 bar as anchorint hshift=iBarShift(NULL,PERIOD_H1,Today,false)+f; //go back f hourly bars// High, low, close and open double HIGH=iHigh(NULL,PERIOD_D1,dshift+h),
LOW=iLow(NULL,PERIOD_D1,dshift+h),
CLOSE=iClose(NULL,PERIOD_H1,hshift-closetime_UTC+g),//add the preset number of hours, thereby select 20:00 bar
OPEN=iOpen(NULL,PERIOD_D1,dshift+h);
// Pivot Point
pivotpoint=NormalizeDouble((HIGH+LOW+CLOSE)/3,Digits);
PPBuffer[bar]=pivotpoint;
// Calcuations
R1 = NormalizeDouble(2 * pivotpoint - LOW,Digits);
S1 = NormalizeDouble(2 * pivotpoint - HIGH,Digits);
R2 = NormalizeDouble(pivotpoint + HIGH - LOW,Digits);
S2 = NormalizeDouble(pivotpoint - HIGH + LOW,Digits);
R3 = NormalizeDouble(2 * pivotpoint - 2*LOW + HIGH,Digits);
S3 = NormalizeDouble(2 * pivotpoint - 2*HIGH + LOW,Digits);
R4 = NormalizeDouble(R3 + pivotpoint - LOW,Digits);
S4 = NormalizeDouble(S3 + pivotpoint - HIGH,Digits);
R1Buffer[bar]=R1;R2Buffer[bar]=R2;R3Buffer[bar]=R3;R4Buffer[bar]=R4;
S1Buffer[bar]=S1;S2Buffer[bar]=S2;S3Buffer[bar]=S3;S4Buffer[bar]=S4;
//+------------------------------------------------------------------+//Trend=iCustom(NULL,PERIOD_D1,"Supertrend",10,4.0,4,1);//TrendArray[bar]=iCustom(NULL,PERIOD_D1,"Supertrend",10,4.0,4,1); if(iMA(NULL,PERIOD_D1,9,0,1,0,dshift)>iMA(NULL,PERIOD_D1,12,0,1,0,dshift)>iMA(NULL,PERIOD_D1,26,0,1,0,dshift)) //(Trend>0)
TrendArray[bar]=1;
elseif(iMA(NULL,PERIOD_D1,9,0,1,0,dshift)<iMA(NULL,PERIOD_D1,12,0,1,0,dshift)<iMA(NULL,PERIOD_D1,26,0,1,0,dshift)) //(Trend<0)
TrendArray[bar]=-1;
else TrendArray[bar]=0;
//+------------------------------------------------------------------+//----------------------->TRADE CONDITIONS<--------------------------+//+------------------------------------------------------------------+// if (iMA(NULL,PERIOD_D1,9,0,1,0,0)>iMA(NULL,PERIOD_D1,12,0,1,0,0)>iMA(NULL,PERIOD_D1,26,0,1,0,0)) //(Trend>0)if(TrendArray[1]>0)
{
//WORKING BUY CONDITION
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+if(TrendArray[1]<0)
// if (iMA(NULL,PERIOD_D1,9,0,1,0,0)<iMA(NULL,PERIOD_D1,12,0,1,0,0)<iMA(NULL,PERIOD_D1,26,0,1,0,0)) //(Trend<0)
{
//WORKING SELL CONDITION
}
}
return(0);
}
//+------------------------------------------------------------------+
Hello, I've written an EA which trades Pivot Points, you'll find their calculation inside the EA. It may look more complicated than needed, but I wanted to use a certain hourly Close for indicator calculation. This works fine.
What troubles me is the implementation of trend filtering. I'd like to use a simple filter from daily timeframe, i.e. comparison between EMA 9,12,26: buy would be allowed if 9>12>26, sell if 9<12<26, no trades allowed if other combination.
The way the EA is written, it seems that the condition is checked only once and not for every bar as intended. I'm clueless, why this is so. Either I get only buys or only sells, which means that some data is provided by the if-conditions in line 164ff, but it doesn't actualize as it should.
Where is the mistake? Can anybody provide an example of a solution? Please help!
Regards,
PomeGranate