extern double Lots = 0.1; extern double MaximumRisk = 0.05; extern double DecreaseFactor = 0; extern string i3="DeltaStop"; extern int Mode=0; //0 - auto, 1 - manual extern double DeltaPrice=50; extern int ATRperiod=14; extern double ATRratio=2.824; //+------------------------------------------------------------------+ //| Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders(string DeltaStop) { 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()==MAGIC) { 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 DeltaStop; int res; DeltaStop=iCustom(NULL,1,"DeltaStop",Mode,DeltaPrice,ATRperiod,ATRratio,PRICE_OPEN,0); //---- sell conditions if(Close[1]<DeltaStop && Open[0]<DeltaStop) { res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGIC,0,Red); return; } //---- buy conditions if(Close[1]>DeltaStop && Open[0]>DeltaStop) { res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGIC,0,Blue); return; } //---- } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { double DeltaStop; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get DeltaStop DeltaStop=iCustom(NULL,0,"DeltaStop",Mode,DeltaPrice,ATRperiod,ATRratio,PRICE_OPEN,0); //---- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue; //---- check order type if(OrderType()==OP_BUY) { if(Open[0]>DeltaStop && Close[1]>DeltaStop) OrderClose(OrderTicket(),OrderLots(),Bid,0,White); break; } if(OrderType()==OP_SELL) { if(Open[0]<DeltaStop && Close[1]<DeltaStop) OrderClose(OrderTicket(),OrderLots(),Ask,0,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();Thera are absent some braсkets in you code. Use button "MQL" for code inserting.
The opening condition uses "DeltaStop" with time frame 1 minute, while
the closing condition uses "DeltaStop" with the chart time frame, which
is 1 hour in your image. This might be your intended logic, or it might be the
cause of your problem, or it might be irrelevant :-)
void CheckForOpen()
{
double DeltaStop;
int res;
DeltaStop=iCustom(NULL,1,"DeltaStop",Mode,DeltaPrice,ATRperiod,ATRratio, PRICE_OPEN,0);
iCustom(NULL,1,"DeltaStop....
check the meaning of 1 !!!!!!!!!!!!!
richplank:
The opening condition uses "DeltaStop" with time frame 1 minute, while the closing condition uses "DeltaStop" with the chart time frame, which is 1 hour in your image. This might be your intended logic, or it might be the cause of your problem, or it might be irrelevant :-)
The opening condition uses "DeltaStop" with time frame 1 minute, while the closing condition uses "DeltaStop" with the chart time frame, which is 1 hour in your image. This might be your intended logic, or it might be the cause of your problem, or it might be irrelevant :-)
thanks for the responce I am only looking for what is happening in pic 1 ie 1 entry and 1 exit not multiple. I am sorry but I don't know what you mean by opening condition uses "DeltaStop" with time frame 1 minute, while the closing condition uses "DeltaStop" with the chart time frame, which is 1 hour in your image
I meant to point out that the second argument to iCustom(...) tells the time frame that the indicator operates on. This is expressed in
minutes (often by using one of the pre-defined PERIOD_* constants), or by a 0,
which then means "current chart time frame", i.e. the time frame of the
chart that the EA was attached to.
In your code, the two ICustom calls have different second argument: the entering condition code uses 1, and the exiting condition code uses 0. Therefore, the EA decides to enter trades on the basis of the DeltaStep value for the current bar of the 1 minute time frame, and it decides to exit trades on the basis of the DeltaStep value for the current bar of the 1 hour time frame.
Perhaps you meant to have 0 as second argument in both cases, to make the EA logic operate relative to the chart time frame. Or perhaps you meant to have 1 as second argument in both cases, to make the EA logic always operate relative to the 1 minute time frame, regardless of which time frame you would drop it on.
As it is, if the 1 minute DeltaStep says enter, and the 1 hour DeltaStep says exit, the EA will, on every tick during that minute, alternate between opening a trade and closing it.
In your code, the two ICustom calls have different second argument: the entering condition code uses 1, and the exiting condition code uses 0. Therefore, the EA decides to enter trades on the basis of the DeltaStep value for the current bar of the 1 minute time frame, and it decides to exit trades on the basis of the DeltaStep value for the current bar of the 1 hour time frame.
Perhaps you meant to have 0 as second argument in both cases, to make the EA logic operate relative to the chart time frame. Or perhaps you meant to have 1 as second argument in both cases, to make the EA logic always operate relative to the 1 minute time frame, regardless of which time frame you would drop it on.
As it is, if the 1 minute DeltaStep says enter, and the 1 hour DeltaStep says exit, the EA will, on every tick during that minute, alternate between opening a trade and closing it.
richplank:
I meant to point out that the second argument to iCustom(...) tells the time frame that the indicator operates on. This is expressed in minutes (often by using one of the pre-defined PERIOD_* constants), or by a 0, which then means "current chart time frame", i.e. the time frame of the chart that the EA was attached to.
In your code, the two ICustom calls have different second argument: the entering condition code uses 1, and the exiting condition code uses 0. Therefore, the EA decides to enter trades on the basis of the DeltaStep value for the current bar of the 1 minute time frame, and it decides to exit trades on the basis of the DeltaStep value for the current bar of the 1 hour time frame.
Perhaps you meant to have 0 as second argument in both cases, to make the EA logic operate relative to the chart time frame. Or perhaps you meant to have 1 as second argument in both cases, to make the EA logic always operate relative to the 1 minute time frame, regardless of which time frame you would drop it on.
As it is, if the 1 minute DeltaStep says enter, and the 1 hour DeltaStep says exit, the EA will, on every tick during that minute, alternate between opening a trade and closing it.
I meant to point out that the second argument to iCustom(...) tells the time frame that the indicator operates on. This is expressed in minutes (often by using one of the pre-defined PERIOD_* constants), or by a 0, which then means "current chart time frame", i.e. the time frame of the chart that the EA was attached to.
In your code, the two ICustom calls have different second argument: the entering condition code uses 1, and the exiting condition code uses 0. Therefore, the EA decides to enter trades on the basis of the DeltaStep value for the current bar of the 1 minute time frame, and it decides to exit trades on the basis of the DeltaStep value for the current bar of the 1 hour time frame.
Perhaps you meant to have 0 as second argument in both cases, to make the EA logic operate relative to the chart time frame. Or perhaps you meant to have 1 as second argument in both cases, to make the EA logic always operate relative to the 1 minute time frame, regardless of which time frame you would drop it on.
As it is, if the 1 minute DeltaStep says enter, and the 1 hour DeltaStep says exit, the EA will, on every tick during that minute, alternate between opening a trade and closing it.
Thanks for the explanation I have changed them both to 0 but still seem to be getting the same results, I have been demo trading this manually and its a good little money spinner it's not going to make you filthy rich, but it should be steady as an EA, if I can get the thing to work.
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
Gidday
I am not a coder by any stretch of the imagination but you have to start somewhere.
Could someone please look over the code and point out where I have gone wrong.
extern double Lots = 0.1;
extern double MaximumRisk = 0.05;
extern double DecreaseFactor = 0;
extern string i3="DeltaStop";
extern int Mode=0; //0 - auto, 1 - manual
extern double DeltaPrice=50;
extern int ATRperiod=14;
extern double ATRratio=2.824;
//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string DeltaStop)
{
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()==MAGIC)
{
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 DeltaStop;
int res;
DeltaStop=iCustom(NULL,1,"DeltaStop",Mode,DeltaPrice,ATRperiod, ATRratio, PRICE_OPEN,0);
//---- sell conditions
if(Close[1]<DeltaStop && Open[0]<DeltaStop)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid, 3, 0,0,"", MAGIC, 0,Red);
return;
}
//---- buy conditions
if(Close[1]>DeltaStop && Open[0]>DeltaStop)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask, 3,0, 0,"", MAGIC,0, Blue);
return;
}
//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double DeltaStop;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get DeltaStop
DeltaStop=iCustom(NULL,0,"DeltaStop",Mode,DeltaPrice,ATRperiod, ATRratio, PRICE_OPEN,0);
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
if(Open[0]>DeltaStop && Close[1]>DeltaStop) OrderClose(OrderTicket(), OrderLots(),Bid,0,White);
break;
}
if(OrderType()==OP_SELL)
{
if(Open[0]<DeltaStop && Close[1]<DeltaStop) OrderClose(OrderTicket(), OrderLots(),Ask,0,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();
Cheers