PipMaker v1 - Price action based EA - page 5

 

Ok, Don...here's how to sort the trend filtering:

extern int MAPeriod = 1200;

double Trend = iMA(NULL, 0, MAPeriod, 0, MODE_LWMA, MODE_CLOSE, 0);

should be...

double Trend = iMA(NULL, PERIOD_M1, MAPeriod, 0, MODE_LWMA, MODE_CLOSE, 0);

as your existing code uses 1200 periods of the current chart timeframe

And for the Buy and Sell routines, you're missing some brackets so the logic is currently wrong so these:

if (Ask HighestBuy + (TrendSpacing * Point) && Ask > Trend)

if (Bid > HighestSell + (Spacing * Point) || Bid < LowestSell - (TrendSpacing * Point) && Bid < Trend)

should be replaced with:

if ((Ask HighestBuy + (TrendSpacing * Point)) && Ask > Trend)

if ((Bid > HighestSell + (Spacing * Point) || Bid < LowestSell - (TrendSpacing * Point)) && Bid < Trend)

Good luck, Neo

 
Neo:
Ok, Don...here's how to sort the trend filtering:

extern int MAPeriod = 1200;

double Trend = iMA(NULL, 0, MAPeriod, 0, MODE_LWMA, MODE_CLOSE, 0);

should be...

double Trend = iMA(NULL, PERIOD_M1, MAPeriod, 0, MODE_LWMA, MODE_CLOSE, 0);

as your existing code uses 1200 periods of the current chart timeframe

And for the Buy and Sell routines, you're missing some brackets so the logic is currently wrong so these:

if (Ask HighestBuy + (TrendSpacing * Point) && Ask > Trend)

if (Bid > HighestSell + (Spacing * Point) || Bid < LowestSell - (TrendSpacing * Point) && Bid < Trend)

should be replaced with:

if ((Ask HighestBuy + (TrendSpacing * Point)) && Ask > Trend)

if ((Bid > HighestSell + (Spacing * Point) || Bid < LowestSell - (TrendSpacing * Point)) && Bid < Trend)

Good luck, Neo

According to the help file:

timeframe - Timeframe. It can be any of Timeframe enumeration values. 0 means the current chart timeframe.

By putting in PERIOD_M1, you are locking in the 1M timeframe no matter what. I was even thinking of having a couple of externs so people could customize the MA, like one for TF and one for type of MA.

Nice catch on the brackets. I didn't think that would matter.

The closes are still not 100% doing what they are supposed to doing. Same situation above buys and below sells not closing out the losing opposite order all the time.

Don

 

Ticket numbers

I think I have an idea about the improper closings. I added a HighestBuyTicket and LowestSellTicket to the comment block and noticed when I ran the backtester the tickets weren't reseting like they should. Maybe this might give us some new area of thought. Maybe a whole subroutine to refresh all the variables once profit is taken.

Don

 

There seem to be two more areas of issue....both in the start() function:

First, simplify the "count-up" code - I'm also pretty sure you had missed some variables that were being used later in the code...

for (Order = OrdersTotal() - 1; Order >= 0; Order--)

{

if (OrderSelect(Order, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Reference)

{

Profit = OrderProfit() + OrderSwap() + OrderCommission();

if (OrderType() == OP_BUY)

{

if (OrderOpenPrice() >= HighestBuy)

{

HighestBuy = OrderOpenPrice();

HighestBuyTicket = OrderTicket();

HighestBuyProfit = Profit;

}

if (OrderOpenPrice() <= LowestBuy)

{

LowestBuy = OrderOpenPrice();

LowestBuyTicket = OrderTicket();

LowestBuyProfit = Profit;

}

BuyOrders++;

if (BuyOrders > MaxBuys) MaxBuys = BuyOrders;

BuyLots += OrderLots();

BuyProfit += Profit;

if (Profit > 0) PosBuyProfit += Profit;

}

if (OrderType() == OP_SELL)

{

if (OrderOpenPrice() <= LowestSell)

{

LowestSell = OrderOpenPrice();

LowestSellTicket = OrderTicket();

LowestSellProfit = Profit;

}

if (OrderOpenPrice() >= HighestSell)

{

HighestSell = OrderOpenPrice();

HighestSellTicket = OrderTicket();

HighestSellProfit = Profit;

}

SellOrders++;

if (SellOrders > MaxSells) MaxSells = SellOrders;

SellLots += OrderLots();

SellProfit += Profit;

if (Profit > 0) PosSellProfit += Profit;

}

}

}

}

Next, try connecting the "if"s in the close analysis section with "else"s - I'm convinced that is where the main issue lies (might also be worth calculating MidPoint unconditionally)....

MidPoint = (HighPoint + LowPoint) / 2;

RefreshRates();

if (MidPoint > 0 && Ask - Bid > MidPoint)

{

if (PosBuyProfit + LowestSellProfit >= ProfitTarget && LowestSell < LowestBuy)

{

OrderSelect(LowestSellTicket, SELECT_BY_TICKET);

OrderClose(OrderTicket(), OrderLots(), Ask, 5, Green);

CloseBuysInProfit();

LowestBuy = 1000;

HighestBuy = 0;

LowestSell = 1000;

LowestSellTicket = 0;

}

else if (PosSellProfit + LowestSellProfit >= ProfitTarget && LowestSell < LowestBuy)

{

OrderSelect(LowestSellTicket, SELECT_BY_TICKET);

OrderClose(OrderTicket(), OrderLots(), Ask, 5, Red);

CloseSellsInProfit();

LowestSell = 1000;

HighestSell = 0;

LowestSellTicket = 0;

}

else if (PosBuyProfit + LowestBuyProfit >= ProfitTarget && LowestBuy < LowestSell)

{

OrderSelect(LowestBuyTicket, SELECT_BY_TICKET);

OrderClose(OrderTicket(), OrderLots(), Bid, 5, Green);

CloseBuysInProfit();

LowestBuy = 1000;

HighestBuy = 0;

LowestBuyTicket = 0;

}

else if (PosSellProfit + LowestBuyProfit >= ProfitTarget && LowestBuy < LowestSell)

{

OrderSelect(LowestBuyTicket, SELECT_BY_TICKET);

OrderClose(OrderTicket(), OrderLots(), Bid, 5, Red);

CloseSellsInProfit();

LowestSell = 1000;

HighestSell = 0;

LowestBuy = 1000;

LowestBuyTicket = 0;

}

}

else if (Ask - Bid < MidPoint)

{

if (PosBuyProfit + HighestBuyProfit >= ProfitTarget && HighestBuy > HighestSell)

{

OrderSelect(HighestBuyTicket, SELECT_BY_TICKET);

OrderClose(OrderTicket(), OrderLots(), Bid, 5, Green);

CloseBuysInProfit();

LowestBuy = 1000;

HighestBuy = 0;

HighestBuyTicket = 0;

}

else if (PosSellProfit + HighestBuyProfit >= ProfitTarget && HighestBuy > HighestSell)

{

OrderSelect(HighestBuyTicket, SELECT_BY_TICKET);

OrderClose(OrderTicket(), OrderLots(), Bid, 5, Red);

CloseSellsInProfit();

LowestSell = 1000;

HighestSell = 0;

HighestBuy = 0;

HighestBuyTicket = 0;

}

else if (PosBuyProfit + HighestSellProfit >= ProfitTarget && HighestSell > HighestBuy)

{

OrderSelect(HighestSellTicket, SELECT_BY_TICKET);

OrderClose(OrderTicket(), OrderLots(), Ask, 5, Green);

CloseBuysInProfit();

LowestBuy = 1000;

HighestBuy = 0;

HighestSell = 0;

HighestSellTicket = 0;

}

else if (PosSellProfit + HighestSellProfit >= ProfitTarget && HighestSell > HighestBuy)

{

OrderSelect(HighestSellTicket, SELECT_BY_TICKET);

OrderClose(OrderTicket(), OrderLots(), Ask, 5, Red);

CloseSellsInProfit();

LowestSell = 1000;

HighestSell = 0;

HighestSellTicket = 0;

}

}

Finally, I changed the initialisation code in the function header like this:

double LowestBuy = 999, HighestBuy = 0.0001, LowestSell = 999, HighestSell = 0.0001, HighPoint, MidPoint, LowPoint;

...to run the Buy & Sell criteria routines on the first pass through:

// BUY Trade Criteria

if (HighestBuy > 0 && LowestBuy < 1000)

// SELL Trade Criteria

if (HighestSell > 0 && LowestSell < 1000)

I added in some auditing code the to version I'm playing with and it was throwing out all sorts of errors before I made these changes. Now there are none being generated and opposite orders appear to be closing correctly.

Neo

 

neo, will you please post the ea with changes? there have been several changes proposed by various members and it's getting difficult to keep track now of what all of the changes are.

 

Good JOB!!!

We're not worthy, We're not worthy... (Wayne's World)

I have always said there are better programmers than I. Thanks.

Don

 

Neo Ea

NEO,

if you post your latest version I will add it on the first post. Just name it PipMakerv5NEO. Thanks for taking an interest in this system.

Don

 

Ok... you guys asked for it

The reason I didn't post the entire EA previously is that I generally "rewrite" EAs in my own formatting style which helps me work out what's going on. I also generally rename variables and functions, though that may just be OCD

Anyway, the major deviation from Don's version is that I grafted the magic number routine from Fifth's Blessing code and added error reporting to a text file. There are a few minor revisions too but the most important is that I added the trend filtering into the Start() function.

I've got a sneaking suspicion that the Martingale side of things isn't working correctly but that's no big shakes at the moment.

Opps... almost forgot! I converted all neccesary "extern bool" parameters into "extern int" so that you can use them in optimisation mode in the strategy tester (0 = false, 1 = true) - the boolean code is just commented out throughout so you can switch it back if you want.

If you find any other issues then I guess you'll let me know

Files:
 
don_forex:
I use 1M time frame as there isn't any indicators involved.

I am trying to incorporate a LWMA and still will use a 1M tf.

Don

Why Ea is warning "cannot load external expert stdlib" ?

 

You Rock!!!

Neo:
Ok... you guys asked for it

The reason I didn't post the entire EA previously is that I generally "rewrite" EAs in my own formatting style which helps me work out what's going on. I also generally rename variables and functions, though that may just be OCD

Anyway, the major deviation from Don's version is that I grafted the magic number routine from Fifth's Blessing code and added error reporting to a text file. There are a few minor revisions too but the most important is that I added the trend filtering into the Start() function.

I've got a sneaking suspicion that the Martingale side of things isn't working correctly but that's no big shakes at the moment.

Opps... almost forgot! I converted all neccesary "extern bool" parameters into "extern int" so that you can use them in optimisation mode in the strategy tester (0 = false, 1 = true) - the boolean code is just commented out throughout so you can switch it back if you want.

If you find any other issues then I guess you'll let me know

VERY SWEET!! Your code kicks some butt!

I fixed the errors in the logic. Where you had (Ask - Bid > Trend), should have only been (Ask > Trend) and (Bid < Trend). I also took out the AverageDown and ProfitReducer as they weren't used or needed. I took out int Orders as this was used in a different setting and took it out of the Lot calculations. The part where Lots == 0, I took out the * CounterTrendMultiplier, that is only used in the actual calculations. I made the BuyPipTarget = ProfitTarget, same for the SellPipTarget. I added a bool RightSideLabel, that way you can turn on/off the right side label. I also added the ticket numbers to the comment block. Other than that, the code is very, very nice!! You did a GREAT JOB!!

I am attaching this to post #1...

Don