Create EA from indicator

 

Hello every one! I ve tried to create an EA from indicator and i ve added this code into:



if (totalUp==4)
{
OrderSend(Symbol(),OP_BUY,1,Ask,3,NULL,NULL,NULL,NULL,0,CLR_NONE);

}else{}


But MT return me an error the XO_ROBOT is an indicator and it can not be executed. What's problem?

This is a whole code :

//+------------------------------------------------------------------+
//| ZZ MTF XO A.mq4 |
//| |
//+------------------------------------------------------------------+
#property copyright " ZZ MTF XO A "
#property link " ZZ MTF XO A "

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 DarkGoldenrod
#property indicator_color2 DarkGreen
#property indicator_color3 LimeGreen
#property indicator_color4 Gold

#property indicator_maximum 4
#property indicator_minimum -4

extern double KirPER=7; //10
extern double slipparage=7;
//---- input parameters
/*************************************************************************
PERIOD_M1 1
PERIOD_M5 5
PERIOD_M15 15
PERIOD_M30 30
PERIOD_H1 60
PERIOD_H4 240
PERIOD_D1 1440
PERIOD_W1 10080
PERIOD_MN1 43200
You must use the numeric value of the timeframe that you want to use
when you set the TimeFrame' value with the indicator inputs.
**************************************************************************/
//---- buffers

double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];


//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{

//---- indicators
SetIndexStyle(0,DRAW_HISTOGRAM,EMPTY,2);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_HISTOGRAM,EMPTY,2);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexStyle(2,DRAW_HISTOGRAM,EMPTY,2);
SetIndexBuffer(2,ExtMapBuffer3);
SetIndexStyle(3,DRAW_HISTOGRAM,EMPTY,2);
SetIndexBuffer(3,ExtMapBuffer4);



string short_name;
short_name=("4 TF XO("+KirPER+")");
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);

return(0);
}
//----


//+------------------------------------------------------------------+
//| MTF Parabolic Sar |
//+------------------------------------------------------------------+
int start()
{
int i,limit,y=0,counted_bars=IndicatorCounted();

limit=Bars-counted_bars;
limit=Bars-counted_bars;
int lastp15=0, lastp30=0, lastp60=0;
for(i=0,y=0;i<limit;i++)
{
int p5,p15,p30,p60;

p5 = i;
p15 = iBarShift( NULL, PERIOD_M15, Time[i], false );
p30 = iBarShift( NULL, PERIOD_M30, Time[i], false );
p60 = iBarShift( NULL, PERIOD_H1, Time[i], false );

/***********************************************************
Add your main indicator loop below. You can reference an existing
indicator with its iName or iCustom.
Rule 1: Add extern inputs above for all neccesary values
Rule 2: Use 'TimeFrame' for the indicator time frame
Rule 3: Use 'y' for your indicator's shift value
**********************************************************/
double totalUp = 0.0;
double totalDown = 0.0;

totalUp=iCustom(NULL,PERIOD_M5,"XO",KirPER,0,i);
totalDown=iCustom(NULL,PERIOD_M5,"XO",KirPER,1,i);
totalUp= totalUp + iCustom(NULL,PERIOD_M15,"XO",KirPER,0,p15);
totalDown= totalDown + iCustom(NULL,PERIOD_M15,"XO",KirPER,1,p15);
totalUp= totalUp + iCustom(NULL,PERIOD_M30,"XO",KirPER,0,p30);
totalDown= totalDown + iCustom(NULL,PERIOD_M30,"XO",KirPER,1,p30);
totalUp= totalUp + iCustom(NULL,PERIOD_H1,"XO",KirPER,0,p60);
totalDown= totalDown + iCustom(NULL,PERIOD_H1,"XO",KirPER,1,p60);

ExtMapBuffer1[i] = 0;
ExtMapBuffer2[i] = 0;
ExtMapBuffer3[i] = 0;
ExtMapBuffer4[i] = 0;

if ( totalUp == 4 || totalDown == -4 ) {

ExtMapBuffer3[i] = totalUp;
ExtMapBuffer4[i] = totalDown;

if (totalUp==4)
{
OrderSend(Symbol(),OP_BUY,1,Ask,3,NULL,NULL,NULL,NULL,0,CLR_NONE);
}else{}


} else {
ExtMapBuffer1[i] = totalUp;
ExtMapBuffer2[i] = totalDown;
}

}

return(0);
}
//+------------------------------------------------------------------+

 

sorry man but an indicator can't excute orders only an EA can do that

 
How i can transform this in indicator?
 

actually u don't need to transfer the indicator

just build an EA & call the indicator with iCustom()

Q

 
qjol:

actually u don't need to transfer the indicator

just build an EA & call the indicator with iCustom()

Q


Thank you! I will try it!
 

Please help me ! How i can close position that already opened. i wrote this:

if (IsTradeAllowed()==true){

if (totalDown==-4 && OrdersTotal()==0) {
Alert("SHORT");
lastOrder=OrderSend(Symbol(),OP_SELL,quantity,Bid,3,NULL,NULL,NULL,0, 0, CLR_NONE);
}
if (totalUp==4 && OrdersTotal()==0) {
Alert("LONG");
lastOrder=OrderSend(Symbol(),OP_BUY,quantity,Ask,3,NULL,NULL,NULL,0, 0, CLR_NONE);
}

if (OrdersTotal()!=0 && OrderType()==OP_BUY && totalDown==-4 ) {
OrderClose(lastOrder,quantity,Bid,1,CLR_NONE);
Alert("CLOSE LONG POSITION");
}

if (OrdersTotal()!=0 && OrderType()==OP_SELL && totalUp==4 ) {
OrderClose(lastOrder,quantity,Ask,1,CLR_NONE);
Alert("CLOSE SHORT POSITION");
}

}


But only message occured CLOSE LONG POSITION/ Where my mistake?

 
kbrobot.ru:

Please help me ! How i can close position that already opened. i wrote this:

if (IsTradeAllowed()==true){

if (totalDown==-4 && OrdersTotal()==0) {
Alert("SHORT");
lastOrder=OrderSend(Symbol(),OP_SELL,quantity,Bid,3,NULL,NULL,NULL,0, 0, CLR_NONE);
}
if (totalUp==4 && OrdersTotal()==0) {
Alert("LONG");
lastOrder=OrderSend(Symbol(),OP_BUY,quantity,Ask,3,NULL,NULL,NULL,0, 0, CLR_NONE);
}

if (OrdersTotal()!=0 && OrderType()==OP_BUY && totalDown==-4 ) {
OrderClose(lastOrder,quantity,Bid,1,CLR_NONE);
Alert("CLOSE LONG POSITION");
}

if (OrdersTotal()!=0 && OrderType()==OP_SELL && totalUp==4 ) {
OrderClose(lastOrder,quantity,Ask,1,CLR_NONE);
Alert("CLOSE SHORT POSITION");
}

}


But only message occured CLOSE LONG POSITION/ Where my mistake?


you must to use lastorderlong and lastodershort not the same name

 

  1. You can't use OrderType() with out doing an OrderSelect() first.
  2. Once you do any server call OrderSend/OrderClose you must call RefreshRates() before you do another. That includes expecting an updated OrderTotal()