You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
Hi,
I am a newbie to MetaTrader. I simply checked out a few indicators for building an Expert Advisor in order to start my introduction to the MQL4 language.
I found the juice indicator, which produces a grren/red histogram. You can find the indicator here: http://www.extrafast.onpw.de/wp-content/2009/Experts/Juice.mq4
This is what it produces:
However, the idea is to buy, if the indicator's red bar changes to a green bar.
Therefore, I implemented this code:
//+------------------------------------------------------------------+
//| Moving Average.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#define MAGICMA 20090105
extern double Lots = 0.1;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 3;
extern double MovingPeriod = 12;
extern double MovingShift = 6;
//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);
}
//+------------------------------------------------------------------+
//| Calculate optimal lot size |
//+------------------------------------------------------------------+
double LotsOptimized()
{
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//---- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of losses orders without a break
if(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
//----
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//---- return lot size
if(lot<0.1) lot=0.1;
return(lot);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen()
{
double ma;
double juice_1_1;
double juice_0_1;
double juice_1_2;
double juice_0_2;
int res;
//---- go trading only for first tiks of new bar
// if(Volume[0]>1) return;
//---- get Moving Average
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
juice_1_1 = iCustom(Symbol(), 0, "Juice", 7, 0.0004, 1,1) ;
juice_0_1 = iCustom(Symbol(), 0, "Juice", 7, 0.0004, 1,0) ;
juice_1_2 = iCustom(Symbol(), 0, "Juice", 7, 0.0004, 2,1) ;
juice_0_2 = iCustom(Symbol(), 0, "Juice", 7, 0.0004, 2,0) ;
//---- sell conditions
if(/*Open[1]>ma && Close[1]<ma &&*/
/*juice>0 && juice_0<0 */
juice_1_1>0.0 && juice_0_2<0.0
)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
return;
}
//---- buy conditions
if(/*Open[1]<ma && Close[1]>ma && */
/*juice<0 && juice_0>0 */
juice_1_2<0.0 && juice_0_1>0.0
)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
return;
}
//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double ma;
double juice_1_1;
double juice_0_1;
double juice_1_2;
double juice_0_2;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
juice_1_1 = iCustom(Symbol(), 0, "Juice", 7, 0.0004, 1,1) ;
juice_0_1 = iCustom(Symbol(), 0, "Juice", 7, 0.0004, 1,0) ;
juice_1_2 = iCustom(Symbol(), 0, "Juice", 7, 0.0004, 2,1) ;
juice_0_2 = iCustom(Symbol(), 0, "Juice", 7, 0.0004, 2,0) ;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
if(juice_1_1>0.0 && juice_0_2<0.0) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
break;
}
if(OrderType()==OP_SELL)
{
if(juice_1_2<0.0 && juice_0_1>0.0) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
break;
}
}
//----
}
//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----
}
//+------------------------------------------------------------------+
I derived it from the MACD sample code.
The point seems to be that the indicator writes out two values, Value1 and Value2.
I am not sure, how to catch them.
However, tested on EURUSD M1 this EA does not produce any signal in spite of the fact that the bars changes from negative to postive and vice versa in backtest data.
Can anyone help, please?
Thank you in advance
~kosmos