Beste medetraders,
Ik ben sinds kort een beetje aan het experimenteren met EA's, zoals jullie misschien al wisten. Nu heb ik een probleem wat ik niet opgelost krijg.
Ik zal het uitleggen aan de hand van een voorbeeld, zal de bot (zie onder, want krijg hem niet als bijlage toegevoegd) en een plaatje toevoegen voor de verduidelijking.
Stel ik heb 2 indicatoren, in dit voorbeeld de RSI en de MACD.
Wanneer de RSI van onder de 30 de 30 doorkruist, mogen er longposities ingenomen worden. En dan mogen de longposities alleen ingenomen worden als de MACD groter is dan de Signal.
Nu krijg ik het alleen zo dat het op het moment dat de kruising in de RSI plaats vind de positie ingenomen kan worden, maar ik wil dus een soort van geheugen inbouwen.
Voorbeeld is in het plaatje, rond 20 dec 2009 kruist de RSI de 30 lijn, maar de Signal is nog groter dan de MACD. Nu komt de MACD rond 28 dec 2009 boven de signal lijn, dus dan wil ik dat ze DAN PAS een positie innemen. Hoe programeer ik dat.
Ik had al bedacht om het met een soort van boolians te doen, maar dat is me niet gelukt. Wie kan me helpen?
BVD,
Kolio
__________________________________________________ ______________________
//+------------------------------------------------------------------+
//| Robotvraag |
//|
kolio21@hotmail.com |
//+------------------------------------------------------------------+
//parameters
extern double magicnumber = 5;
extern double TakeProfit = 1000;
extern double Lots = 0.5;
extern double fastper = 9;
extern double slowper = 26;
extern double sigper = 12;
extern double rsitime = 14;
extern double rsidelay = 1;
extern double RSIShort = 30;
double totalspe[], totalspecific;
//
int start()
{
double MacdCurrent, MacdPrevious, SignalCurrent,SignalPrevious,RSICurrent,RSIPreviou s;
int cnt, ticket, total;
MacdCurrent=iMACD(NULL,0,fastper,slowper,sigper,PR ICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,fastper,slowper,sigper,P RICE_CLOSE,MODE_MAIN,1);
SignalCurrent=iMACD(NULL,0,fastper,slowper,sigper, PRICE_CLOSE,MODE_SIGNAL,0);
SignalPrevious=iMACD(NULL,0,fastper,slowper,sigper ,PRICE_CLOSE,MODE_SIGNAL,1);
RSICurrent=iRSI(NULL,0,rsitime,PRICE_CLOSE,0);
RSIPrevious=iRSI(NULL,0,rsitime,PRICE_CLOSE,rsidel ay);
total=OrdersTotal();
bool trade = True;
for (int i = 0; i < total; i ++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() <= OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == magicnumber) trade = False; }
if(trade)
{ if(AccountFreeMargin()<(1*Lots))
{ Print("Margin to low = ", AccountFreeMargin()); return(0); }
// calculation MACD for buy
if(MacdCurrent>SignalCurrent && RSIPrevious<30 && RSICurrent>30 )
{ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"-",magicnumber,0,Green);
return(0); }
// MACD for sell
if(MacdCurrent<SignalCurrent && RSIPrevious>70 && RSICurrent<70)
{ ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"-",magicnumber,0,Red);
}
return(0); }
// closing positions
for(cnt=0;cnt<total;cnt++)
{ OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
{ if(OrderType()==OP_BUY)
{ if((MacdCurrent<SignalCurrent ))//MacdPrevious>SignalPrevious
{ OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet) ; return(0); } }
else
{ if( (MacdCurrent>SignalCurrent ))
{ OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet) ;
return(0); } } } }
return(0); }