请教,如何根据上单刚刚平仓单子的盈亏情况来下单?

 

加入我之前一直是买单,编写程序要求,如果这买单平仓后是亏损的,我下面这单就下卖单,如果没有亏损,而是盈利的,就接这下买单,总单子要求一直是一单。这样的语句如何写,我写了个,但是测试后结果不是我预期的样子。我写的如下,请高手指教,谢谢!外部变量没有给出,高手很容易可以看出来哪些是外部变量。

//aa函数对吗?我的意思是,先下多单,等平仓后返回这单的盈亏。

int aa(double bb)
{int d=0;
if(d==0)
{
d=OrderSend(Symbol(),OP_BUY,Lots1,Ask,3,Ask-StopLoss1*Point,Ask+TakeProfit1*Point,"duodan",16888,0,Green);
OrderSelect(d,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol() && OrderComment()=="duodan" && OrderType()==OP_BUY ) bb=OrderProfit();
}
return;
}

int start()
{
double t;
int ticket2,ticket3, total;
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
total=OrdersTotal();
if(total<1)
{
aa(t);
if(t>0)
{
ticket2=OrderSend(Symbol(),OP_BUY,Lots1,Ask,3,Ask-StopLoss1*Point,Ask+TakeProfit1*Point,"duodan",16888,0,Green);
if(ticket2>0)
{
if(OrderSelect(ticket2,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());

}else
{ticket3=OrderSend(Symbol(),OP_SELL,Lots2,Bid,3,Bid+StopLoss2*Point,Bid-TakeProfit2*Point,"kongdan",16888,0,Red);
}
}

//----
return(0);
}

请高手指正,谢谢。

 
switch(lastOrder())
{
  case 11:  //最后一单是亏损空单
  {
    //.............
  }
  break;
  
  case 12:  //最后一单是赢利空单
  {
    //............
  }
  break;
  
  case 21:  //最后一单是亏损多单
  {
    //............
  }
  break;
  
  case 22:  //最后一单是赢利多单
  {
    //...........
  }
  break;
}

//-----------------------------------------------------+
int lastOrder()
{
  double takeProfit = 0;
  int    orderType  = 0;
  int    _result    = 0;
  
  int lastNum = OrdersHistoryTotal() - 1;
  
  OrderSelect(lastNum, SELECT_BY_POS, MODE_HISTORY);
  orderType = OrderType();
  takeProfit = OrderTakeProfit();
  
  if(orderType == OP_SELL)
  {
    if(takeProfit > 0)
      _result = 12;
    if(takeProfit < 0)
      _result = 11;
  }
  
  if(orderType == OP_BUY)
  {
    if(takeProfit > 0)
      _result = 22;
    if(takeProfit < 0)
      _result = 21;
  }
  
  return(_result);
}
 
dmgy:


首先谢谢你的回复,你的思路比我的更清晰,先定义一个lastorder函数,是个不错的想法,可以是我测试了下你的程序,

好像lastorder函数并没有发挥他是最后历史平仓单子的作用吧,你用int lastNum = OrdersHistoryTotal() - 1;语句,只是

一个整型数而已,并不能说明这就是历史交易记录里面最近平仓的单子,我想要通过for语句,找离现在时间最接近的单

子才是最近平仓的单子,这样才可以找出来,我现在的想法是这样的。目前问题的关键是如何找到历史交易记录lastorder

??????????

最后谢谢dmgy,给我的建议,不知道是我没有用好你的程序,还是如我上面所说的那样,希望你可以得到你进一步的

回复。谢谢!

 

问题可能是当时你的MT4帐户里没有平仓单,MT4帐户里的已平仓单可以有很多设置,如果设置成“今天”,那么当今天还没有做单的时候,就查不到前面最后一个平仓单。所以代码switch里面应该多加一个case:

switch(lastOrder())
{
  case 0:   //前面没有平仓单
  {
    //.............
  }
  break;
  
  case 11:  //最后一单是亏损空单
  {
    //.............
  }
  break;
  
  case 12:  //最后一单是赢利空单
  {
    //............
  }
  break;
  
  case 21:  //最后一单是亏损多单
  {
    //............
  }
  break;
  
  case 22:  //最后一单是赢利多单
  {
    //...........
  }
  break;
}

如果这个还不行,把自定义函数加一个循环,加循环后更加把握,但运行效率应该差一点:

int lastOrder()
{
  double takeProfit = 0;
  int    orderType  = 0;
  int    _result    = 0;
  
  datetime time1 = 0;
  datetime time2 = 0;
  
  int lastNum = OrdersHistoryTotal() - 1;
  
  for(int i = lastNum; i >= 0; i--)
  {
    OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
    time2 = OrderCloseTime();
    if(time2 > time1)
    {
      time1 = time2;
      orderType = OrderType();
      takeProfit = OrderTakeProfit();
    }
  }
  
  if(orderType == OP_SELL)
  {
    if(takeProfit > 0)
      _result = 12;
    if(takeProfit < 0)
      _result = 11;
  }
  
  if(orderType == OP_BUY)
  {
    if(takeProfit > 0)
      _result = 22;
    if(takeProfit < 0)
      _result = 21;
  }
  
  return(_result);
}
如果没记错的话, OrderSelect(lastNum, SELECT_BY_POS, MODE_HISTORY) 就是最后那个平仓单。如果记错了,那么OrderSelect(0, SELECT_BY_POS, MODE_HISTORY)应该是最后那个平仓单。
 
dmgy:

问题可能是当时你的MT4帐户里没有平仓单,MT4帐户里的已平仓单可以有很多设置,如果设置成“今天”,那么当今天还没有做单的时候,就查不到前面最后一个平仓单。所以代码switch里面应该多加一个case:

如果这个还不行,把自定义函数加一个循环,加循环后更加把握,但运行效率应该差一点:

如果没记错的话, OrderSelect(lastNum, SELECT_BY_POS, MODE_HISTORY) 就是最后那个平仓单。如果记错了,那么OrderSelect(0, SELECT_BY_POS, MODE_HISTORY)应该是最后那个平仓单。


呵呵,dmgy,你没有记错,OrderSelect(lastNum, SELECT_BY_POS, MODE_HISTORY) 就是最后那个平仓单,那么OrderSelect(0, SELECT_BY_POS, MODE_HISTORY)应该是历史记录里面最后早那个平仓单了。其实之前的答案不是我说的那样,没有必要比较历史记录里面的时间了。错就在lastorder函数里面的takeProfit = OrderTakeProfit();应该为takeProfit = OrderProfit();这两个提取利润很相似,但是区别很大的,OrderProfit()是只用在已经平仓单子的净利润的提取;而OrderTakeProfit()是用在没有平仓的单子中盈利的提取,其中不包括佣金和利息。显然这里应该用后者。

另外,你在lastorder函数里面加了个case 0是个很好的方法,历史记录里面没有单子我也考虑了,要是之前没有单子的话,测试这里就通不过了,不过我想的办法不好,你建议加个case 0是个好的建议,在这先谢谢了哦。dmgy,你应该写了不少ea了吧,你真的用过可以长期盈利的ea吗?我写了好几个关于指标的下单的ea,测试的结果都不怎么如意的,我现在用的ea要智能与人工相结合,没有办法完全达到全电脑自动化,ea与人在这方面的优点就是下单和平仓快捷,其他没有什么了。不知道你是怎么看的?

再次谢谢你给我的回复,谢谢

1

原因: