Serving Traders Since 2005
|
|
|
|||||||
| MetaTrader Expert Advisors Post and discuss the MetaTrader expert advisors here. |
![]() |
|
|
LinkBack | Thread Tools | Display Modes |
|
||||
|
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(); //---- } //+------------------------------------------------------------------+ |
|
||||
|
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. |
|
||||
|
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. |
|
||||
|
Quote:
It's up to you.
__________________
Please, read the Forum Rules and the Signature Rules to avoid termination of your account. |
|
||||
|
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. |
|
||||
|
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. |
|
||||
|
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. |
![]() |
| Bookmarks |
| Tags |
| increase position, mt4 |
| Currently Active Users Viewing This Thread: 1 (0 members and 1 guests) | |
| Thread Tools | |
| Display Modes | |
|
|
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 |