关闭半数地段。 - 页 3

 
DomGilberto:

MathFloor是否将小数位数四舍五入到最接近的整数?

MathFloor() 做了它在文档中所说的事情 . . . "MathFloor函数返回一个数值,代表小于或等于x的最大整数。"

DomGilberto:


FirstTarget作为 "OrderClose() "中的一个自定义参数是否有意义 - 假设 "sizeClose "是正确的?(见引用的代码)

不 ......你有这个。

FirstTarget = OrderTakeProfit()-OrderOpenPrice()/2+OrderOpenPrice();

// meaning this

FirstTarget = OrderTakeProfit() - ( OrderOpenPrice() / 2 ) + OrderOpenPrice();

当你可能是指这个 ... .

FirstTarget = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 ) ;

使用括号(和空格)使事情变得清晰和明确。

DomGilberto:


你的代码没有帮助 - 对不起。

为什么? 它错了吗?

DomGilberto:


你可以打印自定义变量吗?如果可以,我一定是做错了,因为它没有在日志中显示出来。

是的,你可以打印任何变量 ..你在做什么?

 
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }
   } 
     
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_SELLSTOP)
    {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES);
      
      double FirstTarget_Sell = OrderOpenPrice() - ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
       
       if (half < minLot) half = Lots;
       half=Lots/2;
       OrderClose(OrderTicket(),half,FirstTarget_Sell,3,DarkViolet); 
       }
    } 


关于打印自定义变量的问题,我如何为 "FirstTarget_Buy "做这件事?

我打算花时间浏览我所有的代码,并打印出很多东西--我知道如何用bools和ints来做(整数-1失败,bool是一个真或假的语句--很简单。),但我不明白当你把函数 分配给一个自定义变量时如何做?

谢谢你对上面的 "FirsTarget "公式的说明!对不起,我的意思是说,你的代码在某种意义上没有帮助,我不明白如何把公式放在一起......我发现这真的很反直觉--你会认为调用 "OrderSelect "会让你简单地看到该tickorder上的手数...然后简单地分割它...

对不起,我就像一个完全的白痴一样!"。

 
DomGilberto:

对不起,我觉得自己像个十足的白痴!

一点也不,你只需要找到你的盲点并加以启发,一旦你找到了,你就会想,为什么你会发现它这么难,当你知道如何做时,一切都很容易。

DomGilberto:

关于打印自定义变量的问题,我如何为 "FirstTarget_Buy "做这件事?

我打算花时间浏览我所有的代码,并打印出很多东西--我知道如何用bools和ints来做(整数-1失败,bool是一个真或假的语句--很简单。),但我不明白当你把函数分配给一个自定义变量时如何做?

像这样......也注意到关于大括号的评论
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );

      Print("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy, Digits) );   // prints FirstTarget_Buy with the same number of digits as the current symbol
         {                                                                                        // why this brace ?   
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }                                                               // why this brace ?  
   } 

DomGilberto:

我的意思是说,你的代码在某种意义上没有帮助,我不明白如何把公式放在一起......我发现这真的很反直觉--你会认为调用 "OrderSelect "会让你简单地看到该tickorder上的手数是多少......然后简单地分割它......

你可以简单地选择订单,使用OrderLots()并除以2 ......你可以这样做,在许多情况下它会工作。我写的代码是针对我可以预见的所有情况的,这样我就不必在它发生故障时不断地修复它......。

如果你的头寸大小是2.0手,除以2就是1.0手,这就可以了 ......

如果你的仓位大小是0.3手,除以2就是0.15手,如果MODE_LOTSTEP是0.1,这将是一个无效的仓位大小 . . . 你可以使用0.1或0.2而不是0.15,所以你需要编写这个检查和 调整。


你在这里所做的并不是在所有情况下都有效 ... .

double Lots = OrderLots(); 
      

         
         half = Lots / 2; 
 

啊啊啊!我刚刚花了15-20分钟的时间把打印的东西都打乱了--我开始明白我在哪里出了问题。我基本上是在选择待定的订单......但是,由于它是一个挂单,在我选择它的时候,很有可能OrderLots、止损和目标已经改变,因此我需要把它放在一个循环中,使它与我的挂单在触发前不断计算的方式同步。

那该死的doubletostr :P - 说得对,RaptorUK!我现在可以看到这个计算正确的,感谢你的调整 :)

我想我现在知道怎么做了--只是出于好奇,什么 "如果 "语句可以只调用已触发的订单。目前,我在市场订单打开时调用,但我想知道如何在挂单被触发时调用?

下面的代码和相应的 "if "语句似乎只是对未平仓的挂单进行调用。我只是想在订单被触发的基础上,"转到 "一个特定的自定义函数(例如无效)?(如果这有意义的话!)

谢谢你为我解决了这么多问题 :)

int OpenOrdersThisPair(string pair)
{
   int total=0;
      for(int i=OrdersTotal()-1; i >= 0; i--)
         {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==pair) total++;
         }
         return (total);
}         

if(OpenOrdersThisPair(Symbol())>0)
 
DomGilberto:

啊啊啊!我刚刚花了15-20分钟的时间把印刷品弄得到处都是--我开始明白我的错误所在了。

当你知道如何操作时,就很容易了

DomGilberto:


我想我现在知道怎么做了--只是出于好奇,什么 "if "语句可以只调用已经触发的订单。目前,当我有一个市场订单打开时,我就会调用它,但我想知道如何在挂单被触发时调用它?

当一个挂单 被触发后,它将成为一个OP_BUY或OP_SELL,所以 . . .

if(OrderType() == OP_BUY || OrderType() == OP_SELL)
   { 
   
   }

一个提示,使用更多的空格 ... ... 当你得到一个除以零的错误,你想找到它发生的地方,很容易搜索到空格/ 空间,只是找到你的除数,而不是所有的注释 ... ... 所以我在= + - / %等周围使用空格。

 
啊,当然了(打脸!)。

好建议--我会的!谢谢你的帮助:)如果我设法做到了,我会回帖的!
 
好了,我回来了!...但不是什么好消息--我已经尝试并测试了多种变化的代码,但都没有成功。这就是我现在所处的情况。

我没有得到任何关于印刷品的信息?日志中完全没有显示。我想这是因为在第一个 "if "语句中,没有选择任何订单类型?从我所看到的代码来看,我认为我至少离得不远...?
if(OrderType() == OP_BUY ){
   
      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
            Print("Order Select returned the error of ", GetLastError());
            }
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 
                    //if( Bid == FirstTarget_Buy)            
         
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
            Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
            }
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT);{
                Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
                Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil(OrderLots()/2/lotStep)*lotStep;{
                Print("The Lots to close is: ", DoubleToStr( half, Digits ));
                }

                bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
            if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
      } 
   }
 
DomGilberto:
好的,我回来了!...但不是很好的消息--我已经尝试并测试了多种变化的代码,但都没有成功。这就是我现在所处的情况。

我没有得到任何关于印刷品的信息?日志中完全没有显示。我想这是因为在第一个 "if "语句中,没有选择任何订单类型?从我所看到的代码来看,我认为我至少离得不远...?

你是如何在这样做之前选择订单的?

if(OrderType() == OP_BUY ){

你在这里仍然有问题

      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
            Print("Order Select returned the error of ", GetLastError());  //  OrderSelect has failed,  why do you continue . . . 
            }
            if(OrderMagicNumber()==MagicNumber)                            //  . . . to this line ?
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 
                    //if( Bid == FirstTarget_Buy) 
 

为什么不......。

for( int c = OrdersTotal()-1; c >= 0; c-- )
   {
   if( OrderSelect(c, SELECT_BY_TICKET, MODE_TRADES) )
      {
      Print("Order Ticker Number = ",OrderTicket());
      Print("Order Lots Open = ", OrderLots());
      } 
   else 
      {
      Print("Order Select returned the error of ", GetLastError()); 
      continue;                                                        // try next order position in the loop
      }
   if(OrderMagicNumber() == MagicNumber)    
      if(OrderSymbol() == Symbol())
         if(OrderType() == OP_BUY)
            if(OpenOrdersThisPair(Symbol()) == 1) 
 
我不能相信我在犯这些新秀的错误......。让我很恼火!是的,我现在打印出来了,并选择了订单。这是在打印方面起作用的代码--但手数仍然没有被关闭?我还在下面粘贴了日志信息。
  if(OrderSelect(OrdersTotal(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1){
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
           Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
         }
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT);{
                Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
                Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil(OrderLots()/2/lotStep)*lotStep;{
                Print("The Lots to close is: ", DoubleToStr( half, Digits ));
                }
      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else{
           Print("Order Select returned the error of ", GetLastError()); // Order Select does not seem to want to work?
            continue;
            }
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 

                bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
            if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
      } 
   }
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: Order Select returned the error of 0    // Not sure what is going on here?		
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000           // This is the right calculation based 
                                                                                                                      // upon the total lots opened on a pending order - to half.
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931                // This price is also correct.