求助,多品种EA交易

 

自己设计的一个ea,打开了两个货币对,EURUSD和GBPUSD,都挂了同一个EA。下单都按技术指标准确下单,并用了全局输入变量magic参数来区分品种。

但平仓的时候发生了错误。即:当一个品种达到平仓条件时,却将本EA下的所有单全部平掉了。

全局输入变量:其中EURUSD的magic=3333;GBPUSD的magic=4444;

input int magic=3333;            //magic

下单代码

int ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,3,0,0,"ban ren gong cuozuo [buy]",magic,0,clrRed);        //买单,magic为全局输入变量

平仓代码:

void CloseOrder()
{
   int OrderMagic=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS))
      {
         OrderMagic=OrderMagicNumber();
         if(OrderMagicNumber() == magic && StringCompare(OrderSymbol(),Symbol()) == 0)  //此句本意是想通过此判断,当EURUSD满足平仓条件时,仅平EURUSD,而不影响该EA下的其它品种订单
         {
            if(OrderType() == OP_BUY)
            {
               if(Bid < BuySP)           //买单止损,BuySP是手工输入的一个价格变量
               {
                  Profit();      //计算本EA持仓利润
                  if(OrderClose(OrderTicket(),OrderLots(),Bid,3,clrWhite))
                     Print(OrderSymbol(),"订单号",OrderTicket(),",magic=",OrderMagic,",止赢平仓成功:",Bid);
                  else
                     Print(OrderSymbol(),"订单号",OrderTicket(),",magic=",OrderMagic,",止赢平仓失败1:",GetLastError());
               }
            }
            if(OrderType() == OP_SELL)
            {
               if(Ask > SellSP)		//SellSP是手工输入的一个价格变量
               {
                  Profit();      //计算本EA持仓利润
                  if(OrderClose(OrderTicket(),OrderLots(),Ask,3,clrWhite))
                     Print(OrderSymbol(),"订单号",OrderTicket(),",magic=",OrderMagic,",止赢平仓成功:",Ask);
                  else
                     Print(OrderSymbol(),"订单号",OrderTicket(),",magic=",OrderMagic,",止赢平仓失败3:",GetLastError());
               }
            }
         }     
      }
   }
}

最终欧美达到平仓条件,镑美未达到平仓条件。但ea自动将本ea下的所有订单都平仓了,平仓输出结果magic都是3333,但查询历史订单中,magic却是按输入时的数字而不同,即欧美magic=3333,镑美magic=4444.

附加的文件:
1.png  30 kb
2.png  25 kb
 
j2me1982:

自己设计的一个ea,打开了两个货币对,EURUSD和GBPUSD,都挂了同一个EA。下单都按技术指标准确下单,并用了全局输入变量magic参数来区分品种。

但平仓的时候发生了错误。即:当一个品种达到平仓条件时,却将本EA下的所有单全部平掉了。

全局输入变量:其中EURUSD的magic=3333;GBPUSD的magic=4444;

下单代码

平仓代码:

最终欧美达到平仓条件,镑美未达到平仓条件。但ea自动将本ea下的所有订单都平仓了,平仓输出结果magic都是3333,但查询历史订单中,magic却是按输入时的数字而不同,即欧美magic=3333,镑美magic=4444.

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

        {

         if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

           {

               OrderClose..........................

           }

Stringcompare 个人感觉多此一举,去掉,跟换成对货币对进行一次确认就可以了OrderSymbol()==Symbol() 

 
Tiecheng Fu:

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

        {

         if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

           {

               OrderClose..........................

           }

Stringcompare 个人感觉多此一举,去掉,跟换成对货币对进行一次确认就可以了OrderSymbol()==Symbol() 

感谢你的回复。

确实多此一举,当初加这个是因为用magic来判断品种,平仓的时候平了所有订单。所以才加了判断品种,没想到还是平了所有订单。

 

根據你的編法 有兩個問題你可以自行檢查看看

1/. GBPUSD下單後的Magic是不是跟設定的一樣 

2/. 根據設定條件 不同品種應該要在不同的報價框才能執行 這個也要確認一下

很可能是下單後的Magic是同一個編碼造成的

 
Hung Wen Lin:

根據你的編法 有兩個問題你可以自行檢查看看

1/. GBPUSD下單後的Magic是不是跟設定的一樣 

2/. 根據設定條件 不同品種應該要在不同的報價框才能執行 這個也要確認一下

很可能是下單後的Magic是同一個編碼造成的

感谢你的回复。

1.GBPUSD下单的Magic和设定是一致,请看附件,附件1.png是平仓时Print的结果,OrderMagicNumber()输出是3333,但用OrderPrint()打印历史订单,magic是4444,见附件2.png,这两张图的订单号一致。

2.由于我在EURUSD和GBPUSD都挂了此EA,并且在平仓的函数里通过Magic和Symbol都加以判断,所以平仓条件就没再考虑品种和报价的问题。

 

终于找到原因了。问题出在Profit()函数里。该函数OrderSelect选择了最新的一个持仓订单,改变了原来选择的订单,所以全都平仓了。

感谢各位的回复!

void Profit()     //计算本EA持仓利润
{
   double zlirun=0;
   for(int i =0;i < OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS))
         if(OrderMagicNumber() == magic)
            zlirun=zlirun+OrderProfit()+OrderSwap()+OrderCommission();
   }
   Print("本EA持仓利润计:",DoubleToStr(zlirun,2),",开始平仓.");
}
原因: