Need help integrating 2 different codes.. =)

 

Hi,


I want to attach this code in blue to the moving average EA in metatrader right under it.. Ive spent a whole day and a half trying to get it to work. Maybe you can help?

The idea is that right after a trade loses, i want the next trade to increase its lot by x amount..


Thanks in advanced for your help!!!

:)



int fnHistoryCheck()

{
iOrders = OrdersHistoryTotal()-1;
for (i = iOrders; i>=0; i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if (OrderSymbol() == Symbol())
{
if ((TimeDayOfYear(OrderOpenTime()) == DayOfYear()) && (TimeYear(OrderOpenTime()) == Year()))
{
if (OrderProfit() >= 0)
sResult = "PROFIT";
else
sResult = "LOSS";
---Do stuff here dependent upon sResult---

}
}
}
return(0);
}




//+------------------------------------------------------------------+
//| Moving Average.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#define MAGICMA 20050610

extern double Lots = 0.1;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 3;
extern double MovingPeriod = 50;
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;
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);
//---- sell conditions
if(Open[1]>ma && Close[1]<ma)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
return;
}
//---- buy conditions
if(Open[1]<ma && Close[1]>ma)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
return;
}
//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double ma;
//---- 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);
//----
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(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
break;
}
if(OrderType()==OP_SELL)
{
if(Open[1]<ma && Close[1]>ma) 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();
//----
}
//+------------------------------------------------------------------+

 
Function LotsOptimized() calculates the volume of the lot, and if you add the function fnHistoryCheck(), it will disagree it.
 
heyarn:


Hi,


I want to attach this code in blue to the moving average EA in metatrader right under it.. Ive spent a whole day and a half trying to get it to work. Maybe you can help?

The idea is that right after a trade loses, i want the next trade to increase its lot by x amount..


Thanks in advanced for your help!!!

:)



int fnHistoryCheck()

{
iOrders = OrdersHistoryTotal()-1;
for (i = iOrders; i>=0; i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if (OrderSymbol() == Symbol())
{
if ((TimeDayOfYear(OrderOpenTime()) == DayOfYear()) && (TimeYear(OrderOpenTime()) == Year()))
{
if (OrderProfit() >= 0)
sResult = "PROFIT";
else
sResult = "LOSS";
---Do stuff here dependent upon sResult---

}
}
}
return(0);
}




//+------------------------------------------------------------------+
//| Moving Average.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#define MAGICMA 20050610

extern double Lots = 0.1;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 3;
extern double MovingPeriod = 50;
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;
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);
//---- sell conditions
if(Open[1]>ma && Close[1]<ma)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
return;
}
//---- buy conditions
if(Open[1]<ma && Close[1]>ma)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
return;
}
//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double ma;
//---- 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);
//----
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(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
break;
}
if(OrderType()==OP_SELL)
{
if(Open[1]<ma && Close[1]>ma) 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();
//----
}
//+------------------------------------------------------------------+

Hey - I recognize my own code (fnHistoryCheck) !!

But glad you like it.

I wrote it to help someone learn how to interrogate the order history in order to accumulate the profit/loss position for that day for the current pair.

Its only partially complete as I wanted to help that person learn to code rather than learn how to copy/paste.

I use similar functionality in some of my EAs to generate eMail notifications when current day orders have been stopped at the broker end for SL or TP.

In this case, I will run it from the start() function with every tick, based on a couple of conditions, one of which would be if the EA has any currently open orders.

Hope this helps you decide how to integrate.


CB

 
cloudbreaker:

Hey - I recognize my own code (fnHistoryCheck) !!

But glad you like it.

I wrote it to help someone learn how to interrogate the order history in order to accumulate the profit/loss position for that day for the current pair.

Its only partially complete as I wanted to help that person learn to code rather than learn how to copy/paste.

I use similar functionality in some of my EAs to generate eMail notifications when current day orders have been stopped at the broker end for SL or TP.

In this case, I will run it from the start() function with every tick, based on a couple of conditions, one of which would be if the EA has any currently open orders.

Hope this helps you decide how to integrate.


CB

Hi CB,


I was able to integrate your code. Thanks!!! However, I think something is wrong since it's not placing the orders after a loss. I've attached the code from the start() sub but then it still doesn't place the orders. Can you give me a clue to figure this out? I've also placed "if (Volume[0]>1) return;"
to make sure it doesn't keep placing orders infinitely. I'd really appreciate your help. =)


Thanks!!!
Arn


//+------------------------------------------------------------------+
//| 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();
if (Volume[0]>1) return;
else fnHistoryCheck();

//----


}
int iOrders;
double sResult;
double i;
double stochfast2;
double stochslow2;
int res;

int fnHistoryCheck()

{


iOrders = OrdersHistoryTotal()-1;
for (i = iOrders; i>=0; i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if (OrderSymbol() == Symbol())
{
if ((TimeDayOfYear(OrderOpenTime()) == DayOfYear()) && (TimeYear(OrderOpenTime()) == Year()))
{
if (OrderProfit() >= 0)
sResult = 0;
else
sResult = 1;
//---Do stuff here dependent upon sResult---


stochfast2 = iStochastic(NULL,60,6,3,3,MODE_SMA,0,MODE_MAIN,0);
stochslow2 = iStochastic(NULL,60,6,3,3,MODE_SMA,0,MODE_SIGNAL,0);

//---- sell conditions
if((stochfast2>stochslow2)&&(sResult == 1))// && SAR > Close[0])
{
res=OrderSend(Symbol(),OP_SELL,LotSize*10,Bid,3,Bid + SLShort,Bid - TPShort,"",MAGICMA,0,Red);
res=OrderSend(Symbol(),OP_SELL,LotSize*10,Bid,3,Bid + SLShort,Bid - TPShort-0.0005,"",MAGICMA,0,Red);
res=OrderSend(Symbol(),OP_SELL,LotSize*10,Bid,3,Bid + SLShort,Bid - TPShort-0.0008,"",MAGICMA,0,Red);
res=OrderSend(Symbol(),OP_SELL,LotSize*10,Bid,3,Bid + SLShort,Bid - TPShort-0.001,"",MAGICMA,0,Red);

return;
}
//---- buy conditions
if ((stochfast2<stochslow2)&&(sResult == 1))// && SAR < Close[0])
{
res=OrderSend(Symbol(),OP_BUY,LotSize*10,Ask,3,Ask - SLLong,Ask + TPLong,"",MAGICMA,0,Blue);
res=OrderSend(Symbol(),OP_BUY,LotSize*10,Ask,3,Ask - SLLong,Ask + TPLong+0.0005,"",MAGICMA,0,Blue);
res=OrderSend(Symbol(),OP_BUY,LotSize*10,Ask,3,Ask - SLLong,Ask + TPLong+0.0008,"",MAGICMA,0,Blue);
res=OrderSend(Symbol(),OP_BUY,LotSize*10,Ask,3,Ask - SLLong,Ask + TPLong+0.001,"",MAGICMA,0,Blue);

return;
}




}
}
}
return(0);
}


 

You sure that the losing order was opened in the current trading day?

Other than that, just put in plenty of Print() statements - use them both to display variables, and also to flag which codeblocks are being executed.

Reason: