[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 563

 

delf:

上一个订单必须在任何方向关闭,下一个订单必须在另一个方向打开(分别满足条件时)。

更严格的选择

#define OrderBuy  0
#define OrderSell 1
int NewOrder;
int RezultatSend; 

int start()
{
... 
... 

if(OrdersTotal()==0)
{
if(NewOrder==OrderBuy)
   {
   if(/*Условие для Buy*/)
      { RezultatSend=OrderSend(/*...buy*/);     //Ставим Buy
        if(RezultatSend!=-1)NewOrder=OrderSell; //Если ставка прошла
      }
   }
 else
   {
   if(/*Условие для Sell*/)
      { RezultatSend=OrderSend(/*...*/);       //Ставим Sell
        if(RezultatSend!=-1)NewOrder=OrderBuy; //Если ставка прошла
      }
   }
}

...
...

}  
 

abeiks:

一段时间以来, ,我一直试图 ,重新设计 买入 平仓 区块 ,只关闭最后两个 买入头寸,但是失败了 你能告诉 ,如何重做 区块

做一个函数(块)来关闭最后一个位置是比较容易和方便的。并运行两次。在一个循环中,或只是在一个行中。
 
abeiks:

一段时间以来, ,我一直试图 ,重新设计 买入 平仓 区块 ,只关闭最后两个 买入头寸,但是失败了 你能告诉 ,如何重做 区块

前段时间,我给了 你一个找到最后位置的解决算法。然后如何处理它们是很重要的:计算、删除、修改STOPs。如果你不能至少以 "形象和相似性 "来写代码,它就不是你的(编程)...
 
rigonich:



谢谢你!

 
peshihod:
做一个函数(块)来关闭最后一个位置,这更容易,也更方便。并运行两次。在一个循环中,或只是在一个行中。

谢谢你,这是个好办法,我也要试试。

 
delf:

我一定是措辞不当 :(

有一个开单的算法。

我需要,在关闭最后一个订单的任何变体中,下面的订单在其他方向打开(当条件相应出现时)。

所有的工作,但如果我已经通过止损关闭,例如卖出,并有条件在这个方向上打开一个卖出,开口继续。我们需要的是等待条件购买。

也就是说,我们需要检查最后一个关闭的订单,所以它不会与开盘的订单重合(买-卖-买-卖的交替)。只有一个订单或等待信号在运行。

我知道我们也许应该使用OrdersHistoryTotal(),但在一个工作的EA中,它看起来如何?

谢谢你。


这可能是某个地方的情况。但如果历史上有大量的订单,最好是使用自己的订单簿。https://www.mql5.com/ru/articles/1404https://www.mql5.com/ru/articles/1390
//+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
void CloseOrder(string signal)
   {
   int      i,Ticket=-1,error; 
   double   Price;
   datetime time=0;
   for (i=0;i<OrdersHistoryTotal();i++)  
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY));
         {
         error=GetLastError();Print("Ошибка OrderSelect() = ", error);
      }
      if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic
      ||OrderClosePrice()==OrderStopLoss())
         {
         if(OrderCloseTime()>time)
            {
            time=OrderCloseTime();Ticket=OrderTicket();
         }
      }
   }
   if(!OrderSelect(Ticket,SELECT_BY_TICKET,MODE_HISTORY))
      {
      error=GetLastError();Print("Ошибка OrderSelect() = ",error);
   }
   if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL&&signal=="CloseSELL")return;
   if(signal=="CloseBUY")Price=NormalizeDouble(Bid,Digits);
   if(signal=="CloseSELL")Price=NormalizeDouble(Ask,Digits);
   for (i=0;i<OrdersTotal();i++)  
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES));
         {
         error=GetLastError();Print("Ошибка OrderSelect() = ",error);
      }
      if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic)
         {
         if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL||signal=="CloseSELL")
            {
            Ticket=OrderClose(OrderTicket(),OrderLots(),Price,0,CLR_NONE);
         }
      }
      if(Ticket<0)
         {
         error=GetLastError();Print("Ошибка = ",error);
      }
   }
   return;
}
       
 
peshihod:

一个更严格的选择

非常感谢每个人的回应,结果已经实现,正是我所需要的。
 
delf:

我一定是措辞不当 :(

有一个开单的算法。

我需要,在关闭最后一个订单的任何变体中,下面的订单在其他方向打开(当条件相应出现时)。

所有的工作,但如果我已经通过止损关闭,例如卖出,并有条件在这个方向上打开一个卖出,开口继续。我们需要的是等待条件购买。

也就是说,我们需要检查最后一个关闭的订单,所以它不会与开盘的订单重合(买-卖-买-卖的交替)。只有一个订单或等待信号在运行。

我知道我们也许应该使用OrdersHistoryTotal(),但在一个工作的EA中,它看起来如何?

谢谢你。

如果你想学习编程,你可以翻阅别人的代码(这就是CodaBase的作用),或者从解决问题的算法着手。要求别人为你写代码是最无望的学习方式。更多的时候,你会得到一个糟糕的编码解决方案,就像(比喻)你的邻居每时每刻都在门口叫你,问 "你叫什么名字"--这是关于不必要的(多余的)计算。

解决你的问题的算法可能如下。首先,你需要确保你没有 "你的 "订单。这个问题,如果不是对测试者来说(我们可以将解决方案限制在条件if (OrdersTotal() == 0),通过使用匹配OrderMagicNumber()和Symbol()的过滤器对订单进行搜索就可以解决。然后你检查条件(根据你的策略)来打开订单。如果有信号,那么使用OrdersHistoryTotal()的搜索(通常是列表中的最后一个),计算出最后一个关闭订单的OrderType()。如果打开订单的信号和最后关闭订单的类型不一致,则根据信号打开订单。

这种方法涉及的计算量最小,大大减少了测试器中专家顾问优化 的时间。

 
TarasBY:
前段时间,我给了 你解决最后位置搜索的算法。然后如何处理它们并不重要:计数、删除、修改STOP。如果你不能至少以 "形象和相似性 "来写代码,它就不是你的(编程)...


是的,我同意,编程不是我的专长,所以我在这里学习和提问。 我试图在你的 算法中加入平仓,但是失败了(所有的买入头寸都在平仓),所以我决定从另一个角度 来解决这个问题,看看在一个现成的平仓块上平仓最后两个买入头寸的方案,这个方案是 提供给我的,也是提供给我的。

如果你能告诉我如何关闭最后两个买入头寸,我将非常感激。我 将明白我在哪里犯了错误。

double profits_buy_2pos()
{
    int ordercount = 0, OpenOrders = OrdersTotal();
    double pr_buy = 0;
    for (int cnt = OpenOrders - 1; cnt >= 0; cnt--)   // scan all orders and positions. ..
    {
        if (!OrderSelect (cnt, SELECT_BY_POS)) return (0.0);
        if (OrderSymbol() != Symbol()) continue;
        if (OrderMagicNumber() != magic) continue;
        if (OrderType() != OP_BUY) continue;
        pr_buy += OrderProfit();
        ordercount++;
        if (ordercount == 2) break;
    } 
    Print ("::::::::::::::::::::::::: pr_buy2 = ", pr_buy);   
    Print ("::::::::::::::::::::::::: ordercount = ", ordercount);    
    return (pr_buy);   
}

 
TarasBY:

如果你想学习如何编程,要么解析其他人的代码(这就是CodaBase的作用),要么遵循手头任务的算法。要求别人为你写代码是最无望的学习方式。大多数情况下,你会得到不是你的任务的最佳代码,就像(比喻)当你的邻居每分钟按响你的门铃并问 "你叫什么名字"--这是关于不必要的(多余的)计算。

我完全同意你的观点。你是100%正确的。这是正确的方法,我一直在努力遵循它。然而,在没有课本的情况下学习MQL4,无缘无故地读书,结果一无所获。反正我不得不分析别人的代码,因为在大多数情况下,我无法将自己的疯狂想法放入程序中。我已经开始在....excel中建立策略(它离我更近,更容易理解)。至于战略的基本要素,它已经非常成功和明确(当然是在历史上)。但我应该进一步考虑到交易的特殊性:浮动点差、互换、经纪公司的特殊性,很难将所有这些纳入exel公式。因此,我决定分析excel和MQL中的利润差异。坦率地说,差异太大,对我不利。我还不知道,我将分析每个位置,也许专家顾问犯了一个错误,但这取决于我。

总之,这个论坛上的好心人帮助我解决了一个具体的问题,真是一个伟大的人,谢谢你们。