Forex Forum - EarnForex
Serving Traders Since 2005
 

Go Back   Forex Forum - EarnForex > MetaTrader > MetaTrader Expert Advisors

MetaTrader Expert Advisors Post and discuss the MetaTrader expert advisors here.

Reply
 
LinkBack Thread Tools Display Modes
  #1 (permalink)  
Old 22nd March 2011, 10:18
Default Avatar
Junior Member
 
Join Date: Mar 2011
Location: china
Posts: 27
Thanks: 0
Thanked 0 Times in 0 Posts
Talking profitable ea couldn't increase position pls gurus point out method.

as inscribe shows,my ea is an trend strategy,I wanna it could increase position when profiting,but now it doesn't work like that.pls gurus check my code,and point out how to deal with the problem. I know the line" if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();" may stop the second position's open but I donn't know how to modify it.i am appreciation for guys help.
//+------------------------------------------------------------------+
//| Moving Average.mq4 |
//| Copyright ?2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#define MAGICMA 20110309

extern double Lots = 1;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 3;

//+------------------------------------------------------------------+
//| 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()*MaximumRis k/500.0,1);
Print(MarketInfo(Symbol(), MODE_LOTSIZE));
Print(MarketInfo(Symbol(), MODE_MINLOT));
Print(MarketInfo(Symbol(), MODE_LOTSTEP));
Print(MarketInfo(Symbol(), MODE_MAXLOT));

//---- calculate 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)==fals e) { 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);
//this is an smart technical design,but losses stands lossing profit,not money may cause problems.
//modify them follow as:accountfreemargin()-orderprofit()
}
//---- return lot size
if(lot<1) lot=1;
return(lot);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen()
{
double m1,m3,m4,ticket1,ticket2;
int res;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
m1=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,0);

m3=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,3);
m4=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,5);
//---- sell conditions
if (m1<m3-0.0003)
{ticket1=OrderSend(Symbol(),OP_SELL,LotsOptimized( ),Bid,5,Ask+105*Point,0,"SELL#1",MAGICMA,0,Red); return; }
if (m1<m4-0.0004)
{ticket2=OrderSend(Symbol(),OP_SELL,LotsOptimized( ),Bid,5,Ask+105*Point,0,"SELL#2",MAGICMA,0,Green); return; }

//---- buy conditions
if ( m1>m3+0.0003)
{ ticket1=OrderSend(Symbol(),OP_BUY,LotsOptimized(), Ask,5,Bid-105*Point,0,"BUY#1",MAGICMA,0,Blue); return; }
if (m1>m4+0.0004)
{ ticket2=OrderSend(Symbol(),OP_BUY,LotsOptimized(), Ask,5,Bid-105*Point,0,"BUY#2",MAGICMA,0,Yellow); return;}


//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double m1,m3,m4;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
m1=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,0);

m3=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,3);
m4=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,5);
//----
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(m1<m3-0.0002)
{OrderClose(OrderTicket(),OrderLots(),Bid,3,Orange ); break; }
if(m1<m4-0.0003)
{ OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet) ; break; }
}
if(OrderType()==OP_SELL)
{
if(m1>m3+0.0002)
{OrderClose(OrderTicket(),OrderLots(),Ask,3,Tan); break; }
if(m1>m4+0.0003)
{OrderClose(OrderTicket(),OrderLots(),Ask,3,White) ; break; }
}
}
//----
}
//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
if(Bars<55 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----
}
//+------------------------------------------------------------------+
Reply With Quote
  #2 (permalink)  
Old 22nd March 2011, 14:58
Enivid's Avatar
Administrator
 
Join Date: Nov 2008
Posts: 1,542
Thanks: 18
Thanked 20 Times in 16 Posts
Default

Once again, if you want some help, attach the .mq4 file to the post instead of posting the code as text - it becomes completely unreadable.
__________________
Please, read the Forum Rules and the Signature Rules to avoid termination of your account.
Reply With Quote
  #3 (permalink)  
Old 23rd March 2011, 04:42
Default Avatar
Junior Member
 
Join Date: Mar 2011
Location: china
Posts: 27
Thanks: 0
Thanked 0 Times in 0 Posts
Default

Quote:
Originally Posted by Enivid View Post
Once again, if you want some help, attach the .mq4 file to the post instead of posting the code as text - it becomes completely unreadable.
PLS help,TKS!attached the code
Attached Files
File Type: mq4 modifycc.mq4 (5.6 KB, 23 views)
Reply With Quote
  #4 (permalink)  
Old 23rd March 2011, 09:58
Enivid's Avatar
Administrator
 
Join Date: Nov 2008
Posts: 1,542
Thanks: 18
Thanked 20 Times in 16 Posts
Default

Yes, the following line prevents opening additional positions if you already have one position open:
if (CalculateCurrentOrders(Symbol())==0) CheckForOpen();

Two possible solutions:
1. Remove condition "if (CalculateCurrentOrders(Symbol())==0)".
2. Modify it like this:
if (CalculateCurrentOrders(Symbol())<2) CheckForOpen();
This way it will open only 2 positions max.
__________________
Please, read the Forum Rules and the Signature Rules to avoid termination of your account.
Reply With Quote
  #5 (permalink)  
Old 23rd March 2011, 10:18
Default Avatar
Junior Member
 
Join Date: Mar 2011
Location: china
Posts: 27
Thanks: 0
Thanked 0 Times in 0 Posts
Default

if remove the sentense,how should I confirm openning condition?
but the "2" method seems solve the prolem,TKS Enivid.
some my parterns also gives me another thinking:should I recount the unrealized losses and profits? I am appreciating for your more advice.
Reply With Quote
  #6 (permalink)  
Old 24th March 2011, 02:40
Enivid's Avatar
Administrator
 
Join Date: Nov 2008
Posts: 1,542
Thanks: 18
Thanked 20 Times in 16 Posts
Default

Quote:
Originally Posted by univetsity View Post
if remove the sentense,how should I confirm openning condition?
If you remove only "if (CalculateCurrentOrders(Symbol())==0)" condition, you still will be checking opening conditions. You'll just skip the position counting.

Quote:
Originally Posted by univetsity View Post
some my parterns also gives me another thinking:should I recount the unrealized losses and profits? I am appreciating for your more advice.
It's up to you.
__________________
Please, read the Forum Rules and the Signature Rules to avoid termination of your account.
Reply With Quote
  #7 (permalink)  
Old 26th March 2011, 12:36
Default Avatar
Junior Member
 
Join Date: Mar 2011
Location: china
Posts: 27
Thanks: 0
Thanked 0 Times in 0 Posts
Default

2. Modify it like this:
if (CalculateCurrentOrders(Symbol())<2) CheckForOpen();
This way it will open only 2 positions max.[/QUOTE]

I modify it as the 2 method,but I found it would open several orders during Jan/3/ 2011 and other time on EUR/USD,I don't know why.
Attached Files
File Type: mq4 add.mq4 (5.6 KB, 13 views)
Reply With Quote
  #8 (permalink)  
Old 26th March 2011, 20:40
Enivid's Avatar
Administrator
 
Join Date: Nov 2008
Posts: 1,542
Thanks: 18
Thanked 20 Times in 16 Posts
Default

If by "several orders" you mean more than 2, then it's really strange. On what period, timeframe and model (every tick or open prices) do you backtest it?
__________________
Please, read the Forum Rules and the Signature Rules to avoid termination of your account.
Reply With Quote
  #9 (permalink)  
Old 27th March 2011, 08:27
Default Avatar
Junior Member
 
Join Date: Mar 2011
Location: china
Posts: 27
Thanks: 0
Thanked 0 Times in 0 Posts
Default

Quote:
Originally Posted by Enivid View Post
If by "several orders" you mean more than 2, then it's really strange. On what period, timeframe and model (every tick or open prices) do you backtest it?
on eurusd (01.1.2011-03.26.2011 M5) openprice model, you can try it,would open 6 orders on Jan 4 15:30-16:05 and 20 orders on Jan 14 12:20-14:20 ^^^
Reply With Quote
  #10 (permalink)  
Old 27th March 2011, 17:15
Enivid's Avatar
Administrator
 
Join Date: Nov 2008
Posts: 1,542
Thanks: 18
Thanked 20 Times in 16 Posts
Default

Yes, now I see the problem. Since EA can have both buys and sells open simultaneously, the CalculateCurrentOrders() function should return a sum of the buys and sells. Replace:
if(buys>0) return(buys);
else return(sells);

With:
return(buys+sells);
__________________
Please, read the Forum Rules and the Signature Rules to avoid termination of your account.
Reply With Quote
Reply

Bookmarks

Tags
increase position, mt4


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
A great method so far flexie Trading Systems and Strategies 18 17th July 2011 10:45
increase rebate rate for IAMFX and FXCBS ForexTradingChoice Advertisements 0 20th May 2010 11:38
Never ever add to a losing position Pinalli Forex Education 10 11th September 2009 07:19
RedBlue Method, S&R 8pip Trading Systems and Strategies 14 11th July 2009 20:49
Japanese Housewives Increase Wagers Yen Will Weaken Enivid Forex News 0 13th May 2009 11:31


All times are GMT. The time now is 03:23.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Inactive Reminders By Icora Web Design

SEO by vBSEO 3.3.2