为什么我的EA在回测时一直给出负利润? - 页 5 12345 新评论 [删除] 2013.02.03 15:37 #41 deVries:看看你的metatrader站上的 移动平均线EA 的代码,看看它是如何完成的....。 好的 [删除] 2013.02.05 03:22 #42 deVries:此刻,你必须检查是否已经有一笔交易在进行。在你进行交易之前,你必须知道是否有一笔交易正在进行。我还是看不出你已经完成了对交易的计算.看看你的metatrader站上的 移动平均线EA 的代码,看看它是如何完成的 .... 我读了很多样本并模仿他们的编码风格。这是我最新的代码。不幸的是,它仍然在制造负利润,这是不应该的。//+------------------------------------------------------------------+ //| RSI_strategy_cyxstudio.mq4 | //| Copyright 2013, Tjipke de Vries | //| https://forum.mql4.com/53695/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #include <stderror.mqh> #include <stdlib.mqh> extern int RSIPeriod = 2; //number of periods for RSI extern double UpperBound = 95; //set upper bound value for RSI extern double LowerBound = 5; //set lower bound value for RSI extern double Lots = 0.1; extern double StopLoss = 60; //Set the stop loss level extern double TakeProfit = 120; //Set the take profit level extern double TrailingStop = 40; //extra settings for OrderSend extern int MagicNumber = 54333; extern string CommentEA = "RSI strategy"; extern int Slippage.Pips = 10; //--- //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- Alert(OrdersTotal()); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- RefreshRates(); int Ticket1; int Ticket2; bool Ticket3; bool Ticket4; double SL,TP; int Total; double MagicNo; double Slippage; int cnt; double pAsk = MarketInfo(Symbol(), MODE_ASK); double pBid = MarketInfo(Symbol(), MODE_BID); double pAskPrev = iClose(Symbol(),0,1); double pBidPrev = iClose(Symbol(),0,1); double pAskLast = iClose(Symbol(),0,2); double pBidLast = iClose(Symbol(),0,2); double MA200 = iMA(NULL, 1440, 200, 0,MODE_SMA,PRICE_CLOSE, 0); //200 day Moving Average double MA5 = iMA(NULL, 1440, 5, 0,MODE_SMA,PRICE_CLOSE, 0); // 5 day Moving Average double CurrentRSI = iRSI (NULL, 0, RSIPeriod,PRICE_CLOSE ,0); double PrevRSI = iRSI (NULL, 0, RSIPeriod,PRICE_CLOSE ,1); double LastRSI = iRSI (NULL, 0, RSIPeriod,PRICE_CLOSE ,2); if(Bars<100) { Print("bars less than 100"); return(0); } if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } //Check for open orders if there are none then check for conditions to open one if ((OrdersTotal() ==0) && (LastRSI > PrevRSI) && (PrevRSI > CurrentRSI) && (CurrentRSI < LowerBound) && (pAsk > MA200) && (pAsk < pAskPrev) && (pAskPrev < pAskLast)) { //Condition to execute buy entry Ticket1 = OrderSend(Symbol(), OP_BUY, Lots, pAsk, Slippage.Pips, pBid - ( StopLoss * Point ), pBid + ( TakeProfit * Point ), "Buy.", MagicNumber,0,Yellow); //execute buy order if(Ticket1>0) { if(OrderSelect(Ticket1,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } if (Ticket1 < 0) { Print("Error opening BUY order : ",GetLastError()); return(0); } } if ((OrdersTotal() ==0) && (LastRSI < PrevRSI) && (PrevRSI < CurrentRSI) && (CurrentRSI > UpperBound) && (pBid < MA200)) { //Condition to execute sell entry Ticket2 = OrderSend(Symbol(), OP_SELL, Lots, pBid, Slippage.Pips, pAsk + ( StopLoss * Point ), pAsk - ( TakeProfit * Point ), "Sell.",MagicNumber, 0, Yellow) ; //execute sell order if(Ticket2>0) { if(OrderSelect(Ticket2,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } if (Ticket2<0) { Print("Error opening SELL order : ",GetLastError()); return(0); } } int ticket=OrderTicket(); double lots=OrderLots(); for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS)) { if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber) ) { if (OrderType() == OP_BUY && pBid > MA5 && (pBid > pBidPrev) && (pBidPrev > pBidLast)) { Ticket3 = OrderClose(ticket, lots, pBid, Slippage.Pips); if (Ticket3 == true ) { Print("BUY position closed", OrderClosePrice()); } if (Ticket3 == false) { Print("Error closing BUY position", ErrorDescription(GetLastError())); } } } } } for (int m = OrdersTotal() - 1; m >= 0; m--) { if (OrderSelect(m, SELECT_BY_POS)) { if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber)) { if (OrderType() == OP_SELL && pAsk < MA5) { Ticket4 = OrderClose(ticket, lots, pAsk, Slippage.Pips); if (Ticket4 == true ) { Print("SELL position closed", OrderClosePrice()); } if (Ticket4 == false) { Print("Error closing SELL position", ErrorDescription(GetLastError())); } } } } } return(0); }你能直接告诉我哪部分是错的吗? [删除] 2013.02.05 03:27 #43 我还尝试了这个//+------------------------------------------------------------------+ //| RSI_strategy_cyxstudio.mq4 | //| Copyright 2013, Tjipke de Vries | //| https://forum.mql4.com/53695/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #include <stderror.mqh> #include <stdlib.mqh> extern int maxTrades = 1; extern int RSIPeriod = 2; //number of periods for RSI extern double UpperBound = 95; //set upper bound value for RSI extern double LowerBound = 5; //set lower bound value for RSI extern double Lots = 0.1; extern double StopLoss = 60; //Set the stop loss level extern double TakeProfit = 120; //Set the take profit level extern double TrailingStop = 40; //extra settings for OrderSend extern int MagicNumber = 54333; extern string CommentEA = "RSI strategy"; extern int Slippage.Pips = 10; //--- //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- RefreshRates(); int Ticket1; int Ticket2; bool Ticket3; bool Ticket4; double SL,TP; double MagicNo; double Slippage; double pAsk = MarketInfo(Symbol(), MODE_ASK); double pBid = MarketInfo(Symbol(), MODE_BID); double pAskPrev = iClose(Symbol(),0,1); double pBidPrev = iClose(Symbol(),0,1); double pAskLast = iClose(Symbol(),0,2); double pBidLast = iClose(Symbol(),0,2); double MA200 = iMA(NULL, 1440, 200, 0,MODE_SMA,PRICE_CLOSE, 0); //200 day Moving Average double MA5 = iMA(NULL, 1440, 5, 0,MODE_SMA,PRICE_CLOSE, 0); // 5 day Moving Average double CurrentRSI = iRSI (NULL, 0, RSIPeriod,PRICE_CLOSE ,0); double PrevRSI = iRSI (NULL, 0, RSIPeriod,PRICE_CLOSE ,1); double LastRSI = iRSI (NULL, 0, RSIPeriod,PRICE_CLOSE ,2); if(Bars<100) { Print("bars less than 100"); return(0); } if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } //Check for open orders if there are none then check for conditions to open one int ticket; int total=CheckOpenTrade(MagicNumber, Symbol()); if(total<maxTrades) { if ((LastRSI > PrevRSI) && (PrevRSI > CurrentRSI) && (CurrentRSI < LowerBound) && (pAsk > MA200) && (pAsk < pAskPrev) && (pAskPrev < pAskLast)) { //Condition to execute buy entry Ticket1 = OrderSend(Symbol(), OP_BUY, Lots, pAsk, Slippage.Pips, pBid - ( StopLoss * Point ), pBid + ( TakeProfit * Point ), "Buy.", MagicNumber,0,Yellow); //execute buy order if(Ticket1>0) { if(OrderSelect(Ticket1,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } if (Ticket1 < 0) { Print("Error opening BUY order : ",GetLastError()); return(0); } } if ((OrdersTotal() ==0) && (LastRSI < PrevRSI) && (PrevRSI < CurrentRSI) && (CurrentRSI > UpperBound) && (pBid < MA200)) { //Condition to execute sell entry Ticket2 = OrderSend(Symbol(), OP_SELL, Lots, pBid, Slippage.Pips, pAsk + ( StopLoss * Point ), pAsk - ( TakeProfit * Point ), "Sell.",MagicNumber, 0, Yellow) ; //execute sell order if(Ticket2>0) { if(OrderSelect(Ticket2,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } if (Ticket2<0) { Print("Error opening SELL order : ",GetLastError()); return(0); } } } double lots=OrderLots(); total=CheckOpenTrade(MagicNumber, Symbol()); for(int cnt=total-1;cnt>=0;cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if( OrderType()<=OP_SELL // check for opened position && OrderSymbol()==Symbol() // check for symbol && OrderMagicNumber() == MagicNumber) // my magic number { if (OrderType() == OP_BUY && pBid > MA5 && (pBid > pBidPrev) && (pBidPrev > pBidLast)) { Ticket3 = OrderClose(ticket, lots, pBid, Slippage.Pips); if (Ticket3 == true ) { Print("BUY position closed", OrderClosePrice()); } if (Ticket3 == false) { Print("Error closing BUY position", ErrorDescription(GetLastError())); } } if (OrderType() == OP_SELL && pAsk < MA5) { Ticket4 = OrderClose(ticket, lots, pAsk, Slippage.Pips); if (Ticket4 == true ) { Print("SELL position closed", OrderClosePrice()); } if (Ticket4 == false) { Print("Error closing SELL position", ErrorDescription(GetLastError())); } } } } return(0); } int CheckOpenTrade(int iMN, string sOrderSymbol) { int icnt, itotal, retval; retval=0; itotal=OrdersTotal(); for(icnt=itotal-1;icnt>=0;icnt--) // for loop { OrderSelect(icnt, SELECT_BY_POS, MODE_TRADES); // check for opened position, symbol & MagicNumber if (OrderSymbol()== sOrderSymbol) { if (OrderMagicNumber()==iMN) retval++; } // sOrderSymbol } // for loop return(retval); } Tjipke de Vries 2013.02.05 08:56 #44 cyxstudio: 我读了很多样本并模仿他们的编码风格。这是我最新的代码。不幸的是,它仍然在赚取负利润,这是不应该的。你能直接告诉我哪部分是错的吗? 我已经告诉了你什么是错的,难道我还不够清楚吗?你对我给你的代码进行了修改你对那部分的修改都是错误的,我之前写过哪里是错误的......//+------------------------------------------------------------------+ //| RSI_strategy_cyxstudio.mq4 | //| Copyright 2013, Tjipke de Vries | //| https://forum.mql4.com/53695/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" extern int RSIPeriod = 3; //number of periods for RSI extern double UpperBound = 90; //set upper bound value for RSI extern double LowerBound = 5; //set lower bound value for RSI extern int MASlowPeriod = 200; extern int MAFastPeriod = 5; extern double Lots = 0.1; extern double StopLoss = 60; //Set the stop loss level extern double TakeProfit = 120; //Set the take profit level extern double TrailingStop = 40; //extra settings for OrderSend extern int MagicNumber = 54333; extern string CommentEA = "RSI strategy"; extern int Slippage.Pips = 3; int BUYS=1,SELLS=1; //++++ These are adjusted for 5 digit brokers. int pips2points; // slippage 3 pips 3=points 30=points double pips2dbl; // Stoploss 15 pips 0.015 0.0150 int Digits.pips; // DoubleToStr(dbl/pips2dbl, Digits.pips) //--- //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- if(Digits % 2 == 1) // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262 {pips2dbl = Point*10; pips2points = 10; Digits.pips = 1;} else {pips2dbl = Point; pips2points = 1; Digits.pips = 0;} // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- int Ticket; double SL,TP; int Total; double pAsk = MarketInfo(Symbol(), MODE_ASK); double pBid = MarketInfo(Symbol(), MODE_BID); double MA200 = iMA(NULL, 1440, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0); //200 day Moving Average double MA5 = iMA(NULL, 1440, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0); // 5 day Moving Average double CurrentRSI = iRSI (NULL, 1440, RSIPeriod,PRICE_CLOSE ,0); if(Bars<100) { Print("bars less than 100"); return(0); } if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if(OrdersTotal()<1) { BUYS=0; SELLS=0; } if(BUYS>0||SELLS>0) //condition start LOOP FOR CHECKING TRADES THIS EA { BUYS=0; SELLS=0; //RESET VALUES TO ZERO BEFORE START COUNTING for(int i = OrdersTotal()-1; i >= 0 ; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue; //. //. //---- check order type if(OrderType()==OP_BUY) // <== IMPORTANT FUNCTION TO KNOW WHAT KIND OF TRADE IS SELECTED { BUYS++; //COUNT BUY TRADES //. if(pAsk > MA5) {OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage.Pips*pips2points,White);} } if(OrderType()==OP_SELL) { SELLS++; //COUNT SELL TRADES //. if(pBid < MA5) {OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage.Pips*pips2points,White);} } } } // MAKE PART FOR OPENING BUY TRADE .......... //---- return(0); } //+------------------------------------------------------------------+在我后面给出的循环中还有更多的内容循环之后是打开买入交易的部分...// MAKE PART FOR OPENING BUY TRADE 必须适用于4/5位数的经纪商,必须适用于ECN账户....我希望看到的是你改变你的这个原始代码 if (CurrentRSI < LowerBound && MarketInfo(Symbol(), MODE_ASK) > MA200 ) { //Condition to execute buy entry Ticket = OrderSend(Symbol(), OP_BUY, BuyVolume, Ask, 3, Bid - ( StopLoss * Point ), Ask + ( TakeProfit * Point ), "Buy.", 111,0,Yellow) ; //execute buy order if(Ticket>0) { if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } if (Ticket < 0) { Print("Error opening BUY order : ",GetLastError()); return(0); } return(0); }它必须适用于4/5位数的经纪商,而且必须适用于ECN账户。 12345 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
看看你的metatrader站上的 移动平均线EA 的代码,看看它是如何完成的....。
好的
此刻,你必须检查是否已经有一笔交易在进行。
在你进行交易之前,你必须知道是否有一笔交易正在进行。
我还是看不出你已经完成了对交易的计算
.
看看你的metatrader站上的 移动平均线EA 的代码,看看它是如何完成的 ....
我读了很多样本并模仿他们的编码风格。
这是我最新的代码。不幸的是,它仍然在制造负利润,这是不应该的。
你能直接告诉我哪部分是错的吗?
我还尝试了这个
我读了很多样本并模仿他们的编码风格。
这是我最新的代码。不幸的是,它仍然在赚取负利润,这是不应该的。
你能直接告诉我哪部分是错的吗?
我已经告诉了你什么是错的,难道我还不够清楚吗?
你对我给你的代码进行了修改
你对那部分的修改都是错误的,我之前写过哪里是错误的......
在我后面给出的循环中还有更多的内容
循环之后是打开买入交易的部分...
// MAKE PART FOR OPENING BUY TRADE
必须适用于4/5位数的经纪商,必须适用于ECN账户
.
.
.
.
我希望看到的是
你改变你的这个原始代码
它必须适用于4/5位数的经纪商,而且必须适用于ECN账户。