
Chciałbym przerobić Ea aby dało się je uruchomić na stworzonym wykresie offline,
tworzone wykresy posiadają niestandardowe nazwy typu: EURUSD-1H,M3 lub EURUSD+5H,H4 ewentualnie EURUSD,M16
w zależności od preferencji i co się stworzy.
Jako przykładem moich kombinacji posłużę się standardowym kodem EA MACD Sample,
jakby ktoś mógł zerknąć co tam jest źle że to nie działa.
Założenie moje było takie aby zastąpić wszelkie:
Kod: Zaznacz cały
Symbol()
Kod: Zaznacz cały
StringSubstr(Symbol(), 0, 6)
Kod: Zaznacz cały
//+------------------------------------------------------------------+
//| MACD Sample.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;
/*-->*/ extern bool InnaNazwaSymbolu = True; // True aby dzialal na dziwnych nazwach Offline
/*-->*/ string NazwaSymbolu;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double MacdCurrent, MacdPrevious, SignalCurrent;
double SignalPrevious, MaCurrent, MaPrevious;
int cnt, ticket, total;
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external
// variables (Lots, StopLoss, TakeProfit,
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
/*-->*/ if(InnaNazwaSymbolu) NazwaSymbolu = StringSubstr(Symbol(), 0, 6);
/*-->*/ else NazwaSymbolu = Symbol();
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return(0); // check TakeProfit
}
// to simplify the coding and speed up access
// data are put into internal variables
/*-->*/ MacdCurrent=iMACD(NazwaSymbolu,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); //NULL
/*-->*/ MacdPrevious=iMACD(NazwaSymbolu,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
/*-->*/ SignalCurrent=iMACD(NazwaSymbolu,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
/*-->*/ SignalPrevious=iMACD(NazwaSymbolu,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
/*-->*/ MaCurrent=iMA(NazwaSymbolu,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
/*-->*/ MaPrevious=iMA(NazwaSymbolu,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
total=OrdersTotal();
if(total<1)
{
// no opened orders identified
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// check for long position (BUY) possibility
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
{
/*-->*/ ticket=OrderSend(NazwaSymbolu,OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); //Symbol()
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
// check for short position (SELL) possibility
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
{
/*-->*/ ticket=OrderSend(NazwaSymbolu,OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red); //Symbol()
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
// it is important to enter the market correctly,
// but it is more important to exit it correctly...
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // check for opened position
/*-->*/ OrderSymbol()==NazwaSymbolu) // check for symbol //Symbol()
{
if(OrderType()==OP_BUY) // long position is opened
{
// should it be closed?
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else // go to short position
{
// should it be closed?
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
// the end.