Saya buat dengan cepat - sila test dan kasi mantap lagi jika ada idea
//+------------------------------------------------------------------+
//| Ultimate1.mq4
//|
//| First Update : 23 July 2010 - Description : Developing the Best EA
//| Second Update : 24 July 2010 - Defining more variables, more function for Money Management
//} 3rd Update : 26 July 2010 - First Rule : based on Onaji San Candle
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, UltimateForexEA"
#property link "http://www.ultimateforexea.com"
#define MAGICNO 123456
extern string Pair = "EURUSD";
extern int TimeFrame = 15;
extern int Slippage = 5;
double LotSize;
extern double StopLoss = 40;
extern double TakeProfit = 60;
extern double Risk_Percent = 2.0;
extern double TP_Percent = 3.0;
extern double LotFactor = 1.0; //1 = Directional, 0.1 = Grid, 0.01 = Martingale
//onaji San variables
extern double MinCandleLength = 10;
bool OpenSignal = 0; // 0 - no signal, 1 - buy signal, 2 - sell signal
int init()
{
CheckGlobalVariable();
AdjustSymbolForMiniMicro();
return(0);
}
int deinit()
{
return(0);
}
int start()
{
LotSizeCalculation();
//The Rule of Opening Trades
CheckRuleOpenPosition();
if (OpenSignal == 1)
{
OrderSend(Pair,OP_BUY,LotSize,MarketInfo(Pair,MODE_ASK),Slippage,MarketInfo(Pair,MODE_ASK) - StopLoss*MarketInfo(Pair, MODE_POINT),MarketInfo(Pair,MODE_ASK) + TakeProfit*MarketInfo(Pair,MODE_POINT),"Buy",MAGICNO,0,Blue);
}
if (OpenSignal == 2)
{
OrderSend(Pair,OP_SELL,LotSize,MarketInfo(Pair,MODE_BID),Slippage,MarketInfo(Pair,MODE_BID) + StopLoss*MarketInfo(Pair, MODE_POINT),MarketInfo(Pair,MODE_BID) - TakeProfit*MarketInfo(Pair,MODE_POINT),"Sell",MAGICNO,0,Red);
}
//The Rule of Closing Trades
// -- for now close using TP and SL
Comment ("EA Name : Ultimate1", "\nLotSize = ", LotSize );
return(0);
}
void CheckRuleOpenPosition()
{
//based on Onaji San
if (iClose(Pair,TimeFrame,4) > iOpen(Pair, TimeFrame,4) && (iClose(Pair,TimeFrame,4) - iOpen(Pair, TimeFrame,4)) > MinCandleLength*MarketInfo(Pair,MODE_POINT) &&
iClose(Pair,TimeFrame,3) > iOpen(Pair, TimeFrame,3) && (iClose(Pair,TimeFrame,3) - iOpen(Pair, TimeFrame,3)) > MinCandleLength*MarketInfo(Pair,MODE_POINT) &&
iClose(Pair,TimeFrame,2) > iOpen(Pair, TimeFrame,2) && (iClose(Pair,TimeFrame,2) - iOpen(Pair, TimeFrame,2)) > MinCandleLength*MarketInfo(Pair,MODE_POINT) &&
iClose(Pair,TimeFrame,3) > iClose(Pair, TimeFrame,4) &&
iClose(Pair,TimeFrame,2) > iClose(Pair, TimeFrame,3) &&
iClose(Pair,TimeFrame,0) > iHigh(Pair, TimeFrame,2) + 1*MarketInfo(Pair,MODE_POINT) &&
OrdersTotal() == 0)
{
OpenSignal = 1; //buy signal
}
else if (iClose(Pair,TimeFrame,4) > iOpen(Pair, TimeFrame,4) && (iClose(Pair,TimeFrame,4) - iOpen(Pair, TimeFrame,4)) > MinCandleLength*MarketInfo(Pair,MODE_POINT) &&
iClose(Pair,TimeFrame,3) > iOpen(Pair, TimeFrame,3) && (iClose(Pair,TimeFrame,3) - iOpen(Pair, TimeFrame,3)) > MinCandleLength*MarketInfo(Pair,MODE_POINT) &&
iClose(Pair,TimeFrame,2) > iOpen(Pair, TimeFrame,2) && (iClose(Pair,TimeFrame,2) - iOpen(Pair, TimeFrame,2)) > MinCandleLength*MarketInfo(Pair,MODE_POINT) &&
iClose(Pair,TimeFrame,3) > iClose(Pair, TimeFrame,4) &&
iClose(Pair,TimeFrame,2) > iClose(Pair, TimeFrame,3) &&
iClose(Pair,TimeFrame,0) < iLow(Pair, TimeFrame,2) - 1*MarketInfo(Pair,MODE_POINT) &&
OrdersTotal() == 0)
{
OpenSignal = 2; //sell signal
}
else if (iClose(Pair,TimeFrame,4) < iOpen(Pair, TimeFrame,4) && (iOpen(Pair,TimeFrame,4) - iClose(Pair, TimeFrame,4)) > MinCandleLength*MarketInfo(Pair,MODE_POINT) &&
iClose(Pair,TimeFrame,3) < iOpen(Pair, TimeFrame,3) && (iOpen(Pair,TimeFrame,3) - iClose(Pair, TimeFrame,3)) > MinCandleLength*MarketInfo(Pair,MODE_POINT) &&
iClose(Pair,TimeFrame,2) < iOpen(Pair, TimeFrame,2) && (iOpen(Pair,TimeFrame,2) - iClose(Pair, TimeFrame,2)) > MinCandleLength*MarketInfo(Pair,MODE_POINT) &&
iClose(Pair,TimeFrame,3) < iClose(Pair, TimeFrame,4) &&
iClose(Pair,TimeFrame,2) < iClose(Pair, TimeFrame,3) &&
iClose(Pair,TimeFrame,0) < iLow(Pair, TimeFrame,2) - 1*MarketInfo(Pair,MODE_POINT) &&
OrdersTotal() == 0)
{
OpenSignal = 2;
}
else if (iClose(Pair,TimeFrame,4) < iOpen(Pair, TimeFrame,4) && (iOpen(Pair,TimeFrame,4) - iClose(Pair, TimeFrame,4)) > MinCandleLength*MarketInfo(Pair,MODE_POINT) &&
iClose(Pair,TimeFrame,3) < iOpen(Pair, TimeFrame,3) && (iOpen(Pair,TimeFrame,3) - iClose(Pair, TimeFrame,3)) > MinCandleLength*MarketInfo(Pair,MODE_POINT) &&
iClose(Pair,TimeFrame,2) < iOpen(Pair, TimeFrame,2) && (iOpen(Pair,TimeFrame,2) - iClose(Pair, TimeFrame,2)) > MinCandleLength*MarketInfo(Pair,MODE_POINT) &&
iClose(Pair,TimeFrame,3) < iClose(Pair, TimeFrame,4) &&
iClose(Pair,TimeFrame,2) < iClose(Pair, TimeFrame,3) &&
iClose(Pair,TimeFrame,0) > iHigh(Pair, TimeFrame,2) + 1*MarketInfo(Pair,MODE_POINT) &&
OrdersTotal() == 0)
{
OpenSignal = 1;
}
else OpenSignal = 0;
}
void LotSizeCalculation()
{
if(MarketInfo(Pair,MODE_MINLOT) == 0.1) int LotSizeDigit = 1;
else if(MarketInfo(Pair,MODE_MINLOT) == 0.01) LotSizeDigit = 2;
double MinLots = NormalizeDouble(MarketInfo(Pair,MODE_MINLOT),LotSizeDigit);
double MaxLots = NormalizeDouble(MarketInfo(Pair,MODE_MAXLOT),LotSizeDigit);
double AccountFM = NormalizeDouble(AccountFreeMargin(),2);
if (MarketInfo(Pair, MODE_LOTSIZE) == 100000) LotSize = (AccountFM*(Risk_Percent/100) * LotFactor) / (StopLoss * MarketInfo(Pair, MODE_TICKVALUE));
else if (MarketInfo(Pair, MODE_LOTSIZE) == 10000) LotSize = (AccountFM*(Risk_Percent/100) * LotFactor)/ (StopLoss * MarketInfo(Pair, MODE_TICKVALUE));
else if (MarketInfo(Pair, MODE_LOTSIZE) == 1000) LotSize = (AccountFM*(Risk_Percent/100) * LotFactor)/ (StopLoss * MarketInfo(Pair, MODE_TICKVALUE));
LotSize = NormalizeDouble(LotSize,LotSizeDigit);
if(LotSize > MaxLots) LotSize = MaxLots;
if(LotSize < MinLots)
{
LotSize = MinLots;
//Alert("Your Equity is Below Tradeable Lots, EA changed to Min Lot possible."); //Message Box will pop up
//Print("Your Equity is Below Tradeable Lots, EA changed to Min Lot possible."); //This message will appear in Expert tab
}
}
void CheckGlobalVariable()
{
}
void AdjustSymbolForMiniMicro()
{
if (StringLen(Symbol()) == 7)
{
Pair = Pair + StringSubstr(Symbol(), 6, 1);
}
}
// nota : ada perubahan pada lotsize management bila saya compile - sila betulkan
// saya buat ni agak cepat - sila test samada ikut rule atau tidak
// for the time being, saya pakai flat rule 40 SL dan 60 TP - nanti boleh update atau ada orang lain nak kasi update -
// backtest - tak berapa sangat for this version -