关闭半数地段。 - 页 18

 


好的(更新!)所以基本上,我已经摆脱了当第二个OrderClose()被调用时,"一半的一半的一半等 "的连续平仓现象(所有蓝色的if语句在这里--显然这是好的!)。Close_Half_Order_Buy==True "也不起作用...。

我希望有人能帮助我完成这个任务 :)

( 我已经删除了很多 "打印 "的内容,以使代码的内容更加清晰。)

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder()
{   
   
   static datetime partclosedonce;
   static datetime partclosedtwice; 
   
   double minLot=MarketInfo(Symbol(),MODE_MINLOT);

   double lotStep=MarketInfo(Symbol(),MODE_LOTSTEP);

   double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
   
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);

   
for(int c=OrdersTotal()-1; c>=0; c--)
      {
      if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES)==true)

      double FirstTarget_Buy = OrderOpenPrice()+(( OrderTakeProfit()-OrderOpenPrice())/2);
      	Print("FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
      
      if(OrderMagicNumber()==MagicNumber)
         if(OrderSymbol()==Symbol())
            if(OrderLots()>minLot)
               if(OrderOpenTime() != partclosedonce)
            {
            
            if(OrderType()==OP_BUY && Bid >= FirstTarget_Buy+(Point/2)) 
               {
               bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,5,Blue);
               if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
               }
            }
         
      if(Close_Half_Order_Buy==True && OrderOpenPrice() > OrderStopLoss())
         {
         MoveToBreakEven(); 
         }
          if(Close_Half_Order_Buy==True)
               {
               partclosedonce = OrderOpenTime();
               } 
      
      if(partclosedonce != partclosedtwice && OrderOpenTime() != partclosedtwice) // I dont want this to run UNLESS the first OrderClose() is successful.
         {
          if(OrderType()==OP_BUY && EMA_Bar < EMA_MA)
               {
               bool EMA_Buy_Close=OrderClose(OrderTicket(),half,Bid,5,CLR_NONE);
               if(EMA_Buy_Close!=TRUE)Print("EMA_Buy_Close Last Error = ",GetLastError());
               if(EMA_Buy_Close==True)partclosedtwice = OrderOpenTime();
               }     
          }        
     }
}


	          
 
有没有人?
 
DomGilberto:


好的(更新!)所以基本上,我已经摆脱了当第二个OrderClose()被调用时(所有蓝色的if语句所在的地方--显然这是好的!)在手数上连续关闭 "一半一半等等 "的现象。Close_Half_Order_Buy==True "也不起作用...。

我希望有人能帮助我完成这个任务 :)

下面的代码可以编译(通过声明MagicNumber变量并注释掉MoveToBreakEven()函数),但 不是 测试了。

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder() {
   static bool FirstBuyTarget_hit = false, SecondBuyTarget_hit = false;
   int ct = 0;
   double minLot = MarketInfo(Symbol(),MODE_MINLOT);
   double lotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);
        
   for(int c = OrdersTotal() - 1; c >= 0; c--)
      if (OrderSelect(c,SELECT_BY_POS))
         if (OrderSymbol() == Symbol() && OrderType() <= OP_SELL)
            if (OrderMagicNumber() == MagicNumber) {
               double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
               double FirstTarget_Buy = OrderOpenPrice() + ((OrderTakeProfit() - OrderOpenPrice()) / 2);
               Print ("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy,Digits));
                                        
               ct++;
                                        
               if (!FirstBuyTarget_hit)
                  if (OrderType() == OP_BUY && Bid >= FirstTarget_Buy + (Point/2)) {
                     if (OrderClose(OrderTicket(),half,Bid,5,Blue)) {
                        MoveToBreakEven();
                        FirstBuyTarget_hit = true;
                        break;
                     }
                     else
                        Print("Close_Half_Order_Buy Last Error = ", GetLastError());
                  }
                                        
               if (FirstBuyTarget_hit && !SecondBuyTarget_hit) 
                  if (OrderType() == OP_BUY && EMA_Bar < EMA_MA) {
                     if (OrderClose(OrderTicket(),half,Bid,5,CLR_NONE))
                        SecondBuyTarget_hit = true;
                     else
                        Print("EMA_Buy_Close Last Error = ",GetLastError());                    
                  }

               break;
            }
   if (ct == 0) {
      FirstBuyTarget_hit = false;
      SecondBuyTarget_hit = false;
   }
}

上述代码假设每个货币对 只下一个订单。

 

非常感谢你的帮助!我真的很感激 :)

你能不能帮我做最后一件事;目前我有一个固定的1:2的获利 目标(硬TP)。实际上,我想把这个从订单中移除。然而,正如你在上面看到的,相关的OrderClose()函数正在使用OrderTakeProfit()来计算OrderClose()函数应该在哪里关闭。

我的问题是,是否有办法存储OrderTakeProfit()的价格,但不是让它固定在订单中,而是使用OrderClose()@OrderTakeProfit()的价格来平仓一组手数?原因是有时我的交易会有巨大的收益,但由于我把OrderTakeProfit()固定在开仓单中,所有的手都会在那里平仓,而我只想在那个出场价格上部分平仓。我对大的运行者使用追踪止损......希望这有意义?

就这样吧!然后我就完成了,尘埃落定!终于完成了!

更新:上面的代码是一个不错的写法。我玩了一会儿,但它没有按照正确的顺序关闭。它仍然是先关闭一半的东西。这和我之前使用静态数据时的情况差不多?有什么想法吗?

 
(感觉我已经用尽了这个主题)

我有上面的最后两个问题,这就完成了?我需要知道的是,我怎样才能存储OrderTakeProfit()的价格,这样当我修改它时,我仍然可以使用这个确切的价格来做OrderClose()?一个静态的双倍数可以吗?
 
DomGilberto:

更新:上面的代码是一个不错的写法。我玩了一会儿,但它没有按照正确的顺序关闭。它仍然是先关闭一半,后关闭另一半。这和我之前使用静态数据时的情况是一样的?有什么想法吗?

发表你对上述代码所做的任何修改,并发表日志/日记条目(或屏幕截图)。

 
DomGilberto:

非常感谢你的帮助!我真的很感激 :)

你能不能帮我做最后一件事;目前我有一个固定的1:2的获利目标(硬TP)。实际上,我想把这个从订单中移除。然而,正如你在上面看到的,相关的OrderClose()函数正在使用OrderTakeProfit()来计算OrderClose()函数应该关闭的位置。

我的问题是,是否有办法存储OrderTakeProfit()的价格,但不是让它固定在订单中,而是使用OrderClose()@OrderTakeProfit()的价格来关闭一个设定的手数?原因是有时我的交易会有巨大的收益,但因为我把OrderTakeProfit()固定在开仓单中,所有的手都会在那里平仓,而我只想在那个出场价格上部分平仓。我对大的运行者使用追踪止损......希望这有意义?

就这样吧!然后我就完成了,尘埃落定!终于完成了!

更新:上面的代码是一个不错的写法。我玩了一会儿,但它没有按照正确的顺序关闭。它仍然是先关闭一半的东西。这和我之前使用静态数据时的情况差不多?有什么想法吗?


将你的止盈设置为一个巨大的水平,你仍然可以使用你的 相关OrderClose()函数 ,这些函数使用OrderTakeProfit()来计算OrderClose()函数应该在哪里 关闭。
 
deVries - 从字面上看,我今天早上才发现...开始把另一个修改放进去......然后意识到我应该在第一个订单下达时就把它改掉......

13 - 我根本没有对它做任何修改。它的工作方式与我发布的代码相同,但你使用的是静态的bool,而不是静态的datetime?这是我在运行回测时看到的唯一真正的区别?除此之外,第二个OrderClose()函数 带有移动平均线和低于它的收盘价;如果它在另一个orderclose()之前先出现,它仍然会关闭?
 
DomGilberto:

十三--我根本没有对它做任何改动。它的工作方式与我发布的代码相同,但你使用的是静态的bool,而不是静态的datetime?这是我在运行回测时看到的唯一真正的区别?除此之外,第二个OrderClose()函数有移动平均线和低于它的收盘价;如果它在另一个orderclose()之前先出现,它仍然会关闭?
由于你使用了问号,我不确定你是在问我还是告诉我高亮部分。 如果测试器显示第二个部分收盘发生在第一个之前,请从策略测试器 生成的日志/日记中发布你的交易结果,显示第二个部分收盘(移动平均线)发生 第一个部分收盘之前
 
Thirteen:
由于你使用了问号,我不确定你是在问我还是告诉我高亮部分。 如果测试器显示第二次部分收盘发生在第一次之前,请将你的交易结果从策略测试器生成的日志/日记中贴出来,显示第二次部分收盘(移动平均数)发生 第一次部分收盘之前

谢谢你给我回信,我今天晚些时候会把日志贴出来 :)