Codice: Seleziona tutto
int start()
{
Alert("Numero Ordini"+CountTrades(MagicID));
RsiPrec = iRSI(NULL, 0, RsiPeriod, PRICE_CLOSE, 2);//Rsi
Rsi = iRSI(NULL, 0, RsiPeriod, PRICE_CLOSE, 1);//Rsi
if(NuovaCandela()==true)
{
if(CountTrades(MagicID)==0)
if((RsiPrec>RsiLevelUp)&&(Rsi<RsiLevelUp))
{
OpenBuy(lots, MagicID,3); // Criterion for opening Buy
}
if((RsiPrec>RsiLevelDown)&&(Rsi<RsiLevelDown))
{
OpenSell(lots, MagicID,3); // Criterion for opening Buy
}
}
if(CountTrades(MagicID)>0)
TrailingStop(e_TrailingStep,e_TrailingStep);
return(0) ;
}
bool NuovaCandela()
{
datetime TempoCandelaAttuale = Time[0];
if (TempoCandelaAttuale != TempoUltimaCandela)
{
TempoUltimaCandela = TempoCandelaAttuale;
return (true);
}
else
{
return (false);
}
}
int CountTrades(int MagicNumber) {
int count = 0;
for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
continue;
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber)
continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
if (OrderType() == OP_SELL || OrderType() == OP_BUY)
count++;
}
return (count);
}
void OpenBuy(double lotti, int MagicNumber,int slipage)
{
double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
Print("Minimum Stop Level=",minstoplevel," points");
double price=Ask;
//--- calculated SL and TP prices must be normalized
double stoploss=NormalizeDouble(Bid-minstoplevel*Point,Digits);
double takeprofit=NormalizeDouble(Bid+minstoplevel*Point,Digits);
//--- place market order to buy 1 lot
int ticket=OrderSend(Symbol(),OP_BUY,lotti,price,slipage,stoploss,takeprofit,"My order",MagicNumber,0,clrGreen);
if(ticket<0)
{
Print("OrderSend failed with error #",GetLastError());
}
else
Print("OrderSend placed successfully");
}
void OpenSell(double lotti, int MagicNumber, int slipage)
{
double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
Print("Minimum Stop Level=",minstoplevel," points");
double price=Bid;
//--- calculated SL and TP prices must be normalized
double stoploss=NormalizeDouble(Ask+minstoplevel*Point,Digits);
double takeprofit=NormalizeDouble(Ask-minstoplevel*Point,Digits);
//--- place market order to buy 1 lot
int ticket=OrderSend(Symbol(),OP_SELL,lotti,price,slipage,stoploss,takeprofit,"My order",MagicNumber,0,clrGreen);
if(ticket<0)
{
Print("OrderSend failed with error #",GetLastError());
}
else
Print("OrderSend placed successfully");
}
void TrailingStop(double e_trailingstop,double e_trailingstep)
{
Alert("Ts");
if (OrderType() == OP_BUY)
if ((Bid - OrderOpenPrice()) > (e_trailingstop * Point))
if (OrderStopLoss() < Bid - (e_trailingstop + e_trailingstep - 1) * Point) {
if (OrderModify(OrderTicket(), OrderOpenPrice(), Ask - e_trailingstop * Point, OrderTakeProfit(), 0, clrGreen))
return;
}
if (OrderType()==OP_SELL)
if ((OrderOpenPrice() - Ask) > (e_trailingstop * Point))
if (OrderStopLoss() > Ask + (e_trailingstop + e_trailingstep - 1) * Point || OrderStopLoss()==0) {
if (OrderModify(OrderTicket(), OrderOpenPrice(), Ask + e_trailingstop * Point, OrderTakeProfit(), 0, clrGreen))
return;
}
}
"if(NuovaCandela()==true)" e non ci sono ordini "in macchina" (if(CountTrades(MagicID)==0) se il valore(a) è maggiore di RsiLevelUp e valore(b) è minore di RsiLevelUp
(vuol dire che il valore dell'rsi ha "incrociato verso il basso" RsiLevelUP) apre una posizione in Buy(OpenBuy(lots, MagicID,3)), al contrario se il valore(a) è minore di RsiLevelDown e valore(b) è maggiore di RsiLevelDown
(vuol dire che il valore dell'rsi ha "incrociato verso l'alto" RsiLevelDown) apre una posizione in Sell(OpenSell(lots, MagicID,3)); se invece "if(NuovaCandela()==true)" e ci sono ordini "in macchina" (if(CountTrades(MagicID)>0)
ci s il programma chiama la funzione TrailingStop(e_TrailingStep,e_TrailingStep) che dovrebbe gestire il trailingStop all'ordine che c'è in "macchina";
Problemi:
1)Quando faccio Girare il backtest del programma apre e chiude posizioni sulla stessa candela nonostante ci sia la funzione (NuovaCandela() che dovrebbe fare partire i controlli solo se c'è una nuova candela);
2)La funzione CountTrades(MagicID) restituisce sempre 0, cosicchè La funzione TrailingStop "(e_TrailingStep,e_TrailingStep)" non modifica la posizione aperta e l'alert"Alert("Numero Ordini"+CountTrades(MagicID));"
restituisce sempre 0 posizioni aperte ;