为什么我的EA在回测时一直给出负利润? - 页 3

 
deVries:

当你启动你的Metatrader时,EA必须找出是否有一笔交易。

如果有交易,我只做了检查交易的循环倒计时。

如果我在一开始就把它设置为1,并且OrdersTotal()>0,那么我就让它检查交易,如果(.......> ||.......> ){做循环....

你确定你给我的代码给了你上面显示的结果吗?我在1440(1天)期间测试了它,没有执行任何交易。但是当我把它改为1M时,许多交易被执行了。
 
cyxstudio:
你确定你给了我上面显示的结果的代码吗? 我在1440(1天)期间进行了测试,没有执行任何交易,但当我把它改为1M时,许多交易被执行。
如果你再次检查 我的测试,你会发现测试的周期和测试的时间框架,你的数据已经过去多少天了?
 

好了,在这里.....,如果我可以的话,我将尝试在这里提供帮助。

这个Ma_Shift问题是我有过的一个问题,但一直无法得到明确的答案。

如果你注意到在你的代码中,你在你的移动平均数上使用了一个8的移位....,这是什么意思?

MA200 = iMA(NULL, 0, 200,8,MODE_SMA,PRICE_CLOSE, 0); MA5 = iMA(NULL, 0, 5,8,MODE_SMA,PRICE_CLOSE, 0); CurrentRSI = iRSI(NULL, 0, VarPeriod,PRICE_CLOSE ,0)。
正如你所看到的,这个移位设置并不存在于RSI上......它显示在它自己的窗口中,这是一个线索。
如果你把移动平均线放在你的图表上,你会看到相当于Ma_Shift的移位框中的设置。
还注意到当你调用指标时,参数200,8,sma,close的顺序 是一样的。
顺序 是一样的......NULL和时间框架是你把Ma放在什么地方,就在什么地方。
所以这里不需要它们。也不需要最后的转变设置......因为这个ma会在当前的蜡烛上不断变化。 
当前的蜡烛....,你一会儿就会明白这一点。
如果你去看一下iAlligator指标的设置,你会看到颚部移动、牙齿移动和嘴唇移动的设置......这是每个移动平均线的马氏移动。
它们都可以在图表上向左或向右移动,无论你想移动多少条。

其显示方式如下:............

这使得08:00的蜡烛值有3个点的差异,在数据窗口中显示。

这就给我们带来了一个问题:最后的 "移位 "设置是用来干什么的?

当你打开数据窗口,把鼠标移到你的图表上,从一个蜡烛移到另一个蜡烛时

你会看到5SMA的数字随着你从一个蜡烛到另一个蜡烛而变化......。

这就是最后一个SHIFT值的作用......请记住,目前正在绘制的蜡烛是零号蜡烛。

牢记当前正在绘制的蜡烛是零号蜡烛......最后完成的 蜡烛是一号蜡烛,所以如果你的图表上共有1000根蜡烛

所以,如果你的图表上有1000根蜡烛,它们的编号是从你的图表左边缘的999到你目前所在的0。

因此,如果您想知道5根蜡烛之前的5SMA的值是多少?

你就在最后一个位置放一个5......当然随着时间的推移......蜡烛5会变成下一个蜡烛。

如前所述,如果你总是得到蜡烛0的值,那么这个值就会不断地

随着价格的变化而变化。所以你可能会得到一个信号,然后指标就会重新显示出来。

总是要求得到蜡烛1的信息,那么它就已经完成了,不会改变....。

我希望这有帮助...

 
cyxstudio:

我已经重新做了所有的事情,修复了循环,滑移,修复了移动平均线和RSI值,确保在开始新的头寸之前关闭所有已开的头寸。但当我回测时,什么都没有发生,没有执行买入/卖出...它的问题是什么?



init()函数只在启动时运行,而不是像start()函数那样在每个tick 上运行。你需要把移动平均数放回start函数中,而不是放在init()函数中,这样它才能工作,以便不断获得新的数字...
 

重做了

增加一个功能,在决定开新仓之前,EA会检查是否有任何挂单。如果有一个挂单或已开的订单,那么它就不会再尝试开仓。

我看到每个人在买入前都会使用一个循环来检查是否有未结头寸,我看不出其中的逻辑。只要OrdersTotal>0,就有未结订单,我的EA就不会寻求开更多的头寸。

修正了递减循环。

这次它给了我OrderClose错误138,这不能通过添加refreshrates()来解决。

而且我还是以亏损告终,我不应该这样做。

我想不出还有什么可以解决的......

//+------------------------------------------------------------------+
//|                                       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 MagicNo;
   double Slippage;
   
   double pAsk = MarketInfo(Symbol(), MODE_ASK);
   double pBid = MarketInfo(Symbol(), MODE_BID);
   double MA200 = iMA(NULL, 0, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);  //200 day Moving Average   
   double MA5 = iMA(NULL, 0, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);      //  5 day Moving Average
   double CurrentRSI = iRSI (NULL, 1440, RSIPeriod,PRICE_CLOSE ,0);
  
   int Ticket2;
   int cnt;
   
   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() == 0 ) {
        
        if (CurrentRSI < LowerBound && pAsk > MA200) {    //Condition to execute buy entry
  
        Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( 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); 
   }
  
  }
  
  
 
  if (CurrentRSI > UpperBound && pBid < MA200) {     //Condition to execute sell entry
  
       Ticket2 = OrderSend(Symbol(), OP_SELL, Lots, pBid, 3, pAsk + ( StopLoss * Point ), pBid - ( TakeProfit * Point ), "Sell.",000, 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); 
        }
      
   
   } 
   }
   
   if (OrdersTotal() > 0 ) {
   
   int PositionIndex;    //  <-- this variable is the index used for the loop

int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool

TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable

for(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --)  //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
   {
   RefreshRates();
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if( OrderMagicNumber() == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol() == Symbol()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType() == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType() == OP_SELL ) )      // <-- or is it a Sell Order ?
   
   if (pAsk > MA5){      //condition to close long position
   RefreshRates();
    OrderClose(OrderTicket(),OrderLots(),pBid,3,Violet); // close long position
 
   return(0); // exit
   
   if(TrailingStop>0)  
              {                 
               if(pBid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<pBid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),pBid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
   
  }
   
   if(pBid < MA5){       //condition to close short position
   RefreshRates();
   OrderClose(OrderTicket(),OrderLots(),pAsk,3,Violet); // close short position
  
   return(0); // exit
   
   
  if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-pAsk)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(pAsk+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),pAsk+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
   }
   
      if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), Slippage ) )               // <-- try to close the order
         Print("Order Close failed, order number: ", OrderTicket(), " Error: ", GetLastError() );  // <-- if the Order Close failed print some helpful information 
      
   } //  end of For loop
   
   
   }
  
   
   
   
   
   
        
        
           return(0);
}
 
cyxstudio:

重做了

增加一个功能,在决定开新仓之前,EA会检查是否有任何挂单。如果有一个挂单或已开的订单,那么它就不会再尝试开仓。

我看到每个人在买入前都会使用一个循环来检查是否有未结头寸,我看不出其中的逻辑。只要OrdersTotal>0,就有未结订单,我的EA就不会寻求开更多的头寸。

修正了递减循环。

这次它给了我OrderClose错误138,这不能通过添加refreshrates()来解决。

而且我还是以亏损告终,我不应该这样做。

我想不出还有什么可以解决的......

为什么你在检查 你的EA在你的账户上所开的交易之前,要把开仓买入的逻辑放在?????

现在会发生什么????,你到目前为止的编程?

假设你有一个使用你的EA的账户。你手动开了一笔英镑兑美元的交易。

该交易的OrdersTotal()有多少笔?

您的代码....,用于购买

if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }


  
        
        
        if (OrdersTotal() == 0 ) {
        
        if (CurrentRSI < LowerBound && pAsk > MA200) {    //Condition to execute buy entry
  
        Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( 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); 
   }
  

它现在在做什么?它这样做的原因是什么

 
deVries:

为什么你在检查你的EA在你的账户上所开的交易之前,就把开仓买入的逻辑放在????。

现在会发生什么????,你到目前为止的编程?

假设你有一个使用你的EA的账户。你手动开了一笔英镑兑美元的交易。

该交易的OrdersTotal()有多少笔?

您的代码....,用于购买

它现在在做什么?它这样做的原因是什么


只有在满足买入条件和没有开仓的情况下才买入。
 
cyxstudio:

只有在满足买入条件和没有开仓的情况下才会买入。

假设你有一个使用你的EA的账户。你手动开了一笔英镑兑美元的交易。

该条件是否为真

 if (OrdersTotal() == 0 )
 
cyxstudio2013.01.31 18:04

你能让我看看你的代码吗?

我想知道为什么我失败了,以及如何得到它。

.

你给我的信息,我可以直接给你完整的代码.....。

这不是免费的,你必须使用"工作"部分并付费才能得到它...

你会在那里得到它

.

另一个方法是好好阅读你的主题

我们在这里帮助你学习如何自己编程,这是免费帮助。

我们向你展示你的错误并帮助你解决。

当你学会了如何写代码的时候,我就会展示我的代码....。

那就不需要付钱了,你可以在那一刻把它和你在这个论坛的帮助下编写的代码进行比较。

....

我的最后一个问题仍未得到回答

假设你有一个使用你的EA运行的账户。你手动开了一笔英镑兑美元的交易。

该条件是否为真?

 if (OrdersTotal() == 0 )

.

.在另一个话题OrderClose错误138

你在那里得到了很好的帮助(RaptorUK和WHRoeder 感谢你的解释,我认为做得很好

.

我想问的另一个问题是

为什么你在计算移动平均线时改变了时间框架?

   double MA200 = iMA(NULL, 0, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);  //200 day Moving Average   
   double MA5 = iMA(NULL, 0, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);      //  5 day Moving Average

这和我给的不一样。

它没有在其他图表上计算出正确的值 每日

.

所以要花时间学习和练习,并仔细阅读本论坛上的帮助。

或者你花钱请人在像Jobs 这样的网站上为你编程。

 
deVries:
cyxstudio2013.01.31 18:04

你能让我看看你的代码吗?

我想知道为什么我失败了,以及如何得到它。

.

你给我的信息,我可以直接给你完整的代码.....。

这不是免费的,你必须使用"工作"部分并付费才能得到它...

你会在那里得到它

.

另一个方法是好好阅读你的主题

我们在这里帮助你学习如何自己编程,这是免费帮助。

我们向你展示你的错误并帮助你解决。

当你学会了如何写代码的时候,我就会展示我的代码....。

那就不需要付钱了,你可以在那一刻把它和你在这个论坛的帮助下编写的代码进行比较。

....

我的最后一个问题仍然没有得到回答

假设你有一个使用你的EA运行的账户。你手动开了一笔英镑兑美元的交易。

该条件是否为真?

.

.在另一个话题OrderClose错误138

你在那里得到了很好的帮助(RaptorUK和WHRoeder 感谢你的解释,我认为做得很好

.

我想问的另一个问题是

为什么你在计算移动平均线时改变了时间框架?

这和我给的不一样。

它没有在其他图表上计算出正确的值 每日

.

所以要花时间学习和练习,并仔细阅读本论坛上的帮助。

或者你花钱请人在像Jobs 这样的网站上为你编程。

OrdersTotal() 是否应该显示挂单和市价订单的总量,无论它们是通过EA还是手动打开的?

我是这样想的。我的EA会一直检查是否有未结订单,如果有,它就不会再打开订单,只有在没有未结订单时才会打开新订单。

if (OrdersTotal() == 0 )

我认为它工作得很好,因为我的结果部分显示了订单序列1,1,2,2,3,3,4,4,这意味着在新的订单被打开之前,一个订单被关闭。

由于测试原因,移动平均线和RSI的变量发生了变化。我在不同的时间框架/周期上进行了实验,但在这里发布时没有改回来。

最奇怪的是,我的代码只执行买入订单,它从未执行过哪怕一个......卖出订单。

简而言之,我现在仍然面临的问题。

1.它只执行买入,但从不执行卖出,尽管我已经编了卖出的代码

2.仍然在赚取负利润,我相信这个策略不应该是这样的。