打开相反的订单 - 页 2

 

你不能这样做来调整4/5位数经纪商的滑点,这毫无意义。

滑点必须是一个int,所以是一个整数,对于4位数的经纪商,滑点是以Pips为单位的,所以滑点=3意味着3个Pips,对于5位数的经纪商,滑点是以点数为单位的,所以滑点=3意味着3点或0。所以为了补偿,对于5位数的经纪商,滑点数字必须乘以10,即30 ... 30点=3点。

所以这个代码是错误的 ... .

int init()
   {
   if (Digits ==3 || Digits ==5) pt = 10 * Point;
   else pt = Point;
   Slippage = Slippage * pt;    
   }
 

试试这个修改后的OpenOppositeOrder()函数. .

void OpenOppositeOrder() 
   {
   int Op;  
 
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  // only continue if the OrderSelect() worked
         {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY && Bid < OrderOpenPrice())
               {      
               Ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError() );
                  }
               }
               
            if(Op == OP_SELL && Ask > OrderOpenPrice())
               {      
               Ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError() );
                  }   
               }
            }
         }
      }
   }
 
RaptorUK:

试试这个修改后的OpenOppositeOrder()函数 . .


嗨,RaptorUk。

在这之前,感谢您到目前为止提供的帮助。现在EA开始工作了。我已经做了其他的修改,如果一个订单有利润,如何关闭所有的订单,这是确定的,但正如你已经看到的和预测的,这个策略的工作是必要的,达到利润的订单的手数增加,以弥补以前的订单。 所以我在这里处理一个混乱。我需要确认上一个订单是否有利润,我想用OrderProfit()的方式来调整下一个订单的手数,但是,难道我不需要关闭前一个订单来获得这个信息吗?

这里是打开一个相反订单的代码,工作正常(感谢您),在这里我引入了额外的代码,以发现之前的订单是否有利润。我的方法正确吗?

谢谢你

路易斯

 void OpenOppositeOrder() 
 {
// LastOrder Loss Compensation 
   int Orders;
   Orders= OrdersTotal();
   if (Orders>0)
   {  
    for(i=0;i<Orders;i++)
   {
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if(OrderSymbol()==Symbol()&& OrderMagicNumber()== MagicNumber)
   {
    lastprofit = OrderProfit();
    lastlot = OrderLots();
   }
  }
 }
  mlots=0;
  if (lastprofit<0)mlots=NormalizeDouble(lastlot*Multiplier,Digits);
  else mlots=LotSize;
 
//+------------------------------------------------------------------+ 
//Open Opposite Order 
   int Op;  
 
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY && Bid < OrderOpenPrice())
               {  
               if(Martingale)ilots=mlots;else ilots=LotSize; 
               Ticket = OrderSend(Symbol(), OP_SELL, ilots, Bid, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError() );
                  }
               }
               
            if(Op == OP_SELL && Ask > OrderOpenPrice())
               { 
               if(Martingale)ilots=mlots;else ilots=LotSize;
               Ticket = OrderSend(Symbol(), OP_BUY, ilots, Ask, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError() );
                  }   
               }
            }
         }
      }
   }
 
luisneves:


嗨,RaptorUk。

首先感谢你们到目前为止所提供的帮助。现在EA开始工作了。我已经做了其他的修改,如果一个订单有利润,如何关闭所有的订单,这是确定的,但正如你已经看到的和预测的,这个策略的工作是必要的,达到利润的订单的手数增加,以补偿以前的订单。 所以我在这里处理一个混乱的问题。我需要确认上一个订单是否有利润,我想用OrderProfit()的方式来调整下一个订单的手数,但是,难道我不需要关闭前一个订单来获得这个信息吗?

这里是打开一个相反订单的代码,工作正常(感谢您),在这里我引入了额外的代码,以发现之前的订单是否有利润。我的方法是否正确?

我怀疑这将会给你带来问题 . .

mlots = NormalizeDouble(lastlot * Multiplier, Digits);

例如,如果结果是1.12316734 手,你在5位数的平价上的NormalizeDouble()将把它改为1.12316,这将不符合手数步骤的要求。. ...你需要使用一些数学方法,使你修改的手数是手数的倍数 MarketInfo(Symbol(),MODE_LOTSTEP)

 
RaptorUK:

我怀疑这将会给你带来问题 . .

例如,如果结果是1.12316734 手,你在5位数的面值上的NormalizeDouble()将把它变成1.12316,这将不符合Lot Step的要求。......你需要使用一些数学方法来使你修改的手数是手数的倍数 MarketInfo(Symbol(),MODE_LOTSTEP)


嗨,RaptorUK。

关于你的建议,我正在寻找保持我的手数是手数的倍数的方法,我正在寻找关于这个问题的文件。

现在我有另一个问题(更多的问题...)

为了在当前价格之上和之下建立订单,我想使用一条线,一旦Ea开始运行,我就将价格与仍然存在的线进行比较。

第一个问题来了,我怎么能用价格的差异来比较这条线?

这是我到目前为止的代码。在这里,我怎样才能给出比较的名称,因为如果我把iHigh放在priceline后面,它就不起作用了。

谢谢你在这些问题上提供的任何线索。

路易斯

priceline=iHigh(Symbol(),0,0);
 ObjectCreate("highline",OBJ_HLINE,0,0,Bid); 
 ObjectSet("highline",OBJPROP_COLOR,LimeGreen);
 ObjectSet("highline",OBJPROP_WIDTH,1);
 WindowRedraw();

这似乎根本不起作用(...)

if(Bid > priceline+Distance*pt)                      
                {       
// Open buy order

                            while(IsTradeContextBusy()) Sleep(10);
                                 RefreshRates();        
                       
             Ticket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,0,0,"Buy Order",MagicNumber,0,Green);
             if(Ticket>0)AddLimitsBuy();
            }

我把删除对象放在这里,因为我需要在关闭所有订单时删除这一行,我这样做对吗?

void CloseAll()
      {
         int i,Op,Error;
         int Total=OrdersTotal();
     
         if(Total>0)
         {
         for(int pos=OrdersTotal()-1;pos>=0;pos--)
         if(OrderSelect(pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         {
         Op=OrderType();
         if(Op==OP_BUY)
         {
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if(Op==OP_SELL)
         {
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         else
         {
         ObjectDelete("highline");
         }
        }
       }
      }
 
luisneves:

这似乎根本不起作用 (...)

我把删除对象放在这里,因为我需要在关闭所有订单时删除这一行,我这样做对吗?

好的,我想我明白你想做什么,你想检查Bid与你的线相比的位置,要做到这一点,你需要得到线的位置 ... ...使用ObjectGet() 的对象名称和对象属性索引OBJPROP_TIME1,这将返回线所处的价格。

你的ObjectDelete()调用在我看来没有问题,我特别不喜欢使用ObjectsDeleteAll(),我认为它既懒惰又危险 ......或者至少给别人带来了不便。

 
RaptorUK:

好的,我想我明白你想做什么,你想检查Bid与你的线相比的位置,要做到这一点,你需要得到线的位置 ...... 使用ObjectGet(),对象名称和对象属性索引OBJPROP_TIME1,这将返回线所处的价格。

你的ObjectDelete()调用在我看来没有问题。


嗨,RaptorUK。

我试图关闭所有的订单,如果有一个订单获利平仓,但当这种情况发生时,一个挂单仍然开放,但关闭的指令包含在CloseAll()函数中。关于这个问题有什么线索吗?

谢谢你提供的任何帮助。

路易斯

int GoToClose()
 {
  int pos;  
 {
  for(int Profit=OrdersTotal()-1;pos>=0;pos--)
  if(OrderSelect(Profit,SELECT_BY_POS)
  && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()
  && OrderProfit()+OrderSwap()+OrderCommission()>0||OrdersTotal()> MaxOrders)CloseAll();  
 }
}
//+---------------------------------------------------------------------------+  
      void CloseAll()
      {
         int Op,Error;
                    
         for(int pos=OrdersTotal()-1;pos>=0;pos--)
         if(OrderSelect(pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         {
         Op=OrderType();
         if(Op==OP_BUY)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if(Op==OP_SELL)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         if(Op==OP_SELLSTOP||OP_BUYSTOP||OP_SELLLIMIT||OP_BUYLIMIT)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         else Print("Error opening BUY Stop Order : ",GetLastError());         
         }
        }             
 
luisneves:


嗨,RaptorUK。

我试图关闭所有的订单,如果有一个订单获利平仓,但当这种情况发生时,一个挂单仍然开放,但关闭的指令包含在CloseAll()函数中。关于这个问题有什么线索吗?

你需要了解表达式是如何工作的......你不能这样做......。

if(Op == OP_SELLSTOP || OP_BUYSTOP || OP_SELLLIMIT || OP_BUYLIMIT)

这是一个类似的情况,但不完全相同:https://www.mql5.com/en/forum/141790


......的结果是什么?

WhatValue = (5  || 4  ||  3  ||  2 );

|| 是一个布尔运算符,所以只对布尔起作用 . .


这个结果是一个bool的结果值 . .

( Op == OP_SELLSTOP )

. .. 如果你想在你的值上使用位操作符,那么你可以使用这个 . . .

int WhatValue = (5  | 4  |  3  |  2 );

. . . . 但这不是你想做的事。

 
RaptorUK:

你需要了解表达式是如何工作的......你不能这样做......。

这与这个情况类似,但不完全相同:https://www.mql5.com/en/forum/141790


什么是结果......。

|| 是一个布尔运算符,所以只对布尔运算有效 . .


这个结果是一个bool的结果值... ...

. .. 如果你想在你的值上使用位操作符,那么你可以使用这个 . . .

. . . 但这并不是你想做的事。


嗨,RaptorUK。

我明白了,但现在考虑到这一点,我已经修改了代码,挂单仍然存在......

void CloseAll()
      {
         int Op,Error;
                    
         for(int pos=OrdersTotal()-1;pos>=0;pos--)
         if(OrderSelect(pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         {
         Op=OrderType();
         if(Op==OP_BUY)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if(Op==OP_SELL)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         if(Op==OP_SELLSTOP)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         if(Op==OP_BUYSTOP)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         else Print("Error opening BUY Stop Order : ",GetLastError());         
         }
        }        
 
luisneves:


嗨,RaptorUK。

我明白了,但现在考虑到这一点,我已经修改了代码,挂单仍然存在。

如果它有一个与MagicNumber 不同的Magic Number,或者它是针对EA运行的符号以外的符号,或者如果它是一个OP_SELLLIMIT或OP_BUYLIMIT,都有可能。......另外,你需要检查你的OrderDelete()和OrderClose()调用的返回值。

你为什么需要调用RefreshRates()? 我并不是说要把它们去掉,但你能解释一下你为什么要在这里调用RefreshRates()吗?


什么是函数的返回值?我如何使用它们?