[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 347

 

你好,这里有一个问题。我怎样才能在代码中写到只对固定的分形进行操作?

如果分形是固定的,它是....

我的分形

int start()
  {
//----
    double CenBuy = High[isFractalUp()];
     double CenSell = Low[isFractalDn()];

   return(0);
}

int isFractalUp()
{
 for(int i=0; i != 10; i++)
 {
 if(iFractals(NULL, 0, MODE_UPPER, i)!= NULL) return(i);
 }
 return(-1);
}
 
int isFractalDn()
{
 for(int i=0; i != 10; i++)
 {
 if(iFractals(NULL, 0, MODE_LOWER, i)!= NULL) return(i);
 }
 return(-1);
}
 
hoz:

嗯,是的,如果每个方向的挂单数量相同,这样找到合适的挂单没有问题。如果不一样,那么按照我的理解,这将是行不通的。

然后确定触发挂单的事实,并删除最远的相反订单。

所有这些都是在某一 时刻只为一个 事实和一个 挂单做的。没有必要像你试图做的那样,创建一个被触发和被删除的数量。你会在一个刻度上捕捉到挂单转化的事实。所有其他触发器(如果有的话)将由下一个tick决定。

 
你能告诉我谁知道吗?为什么工作日的测试结果与周末不同?阿尔帕里
 

berezhnuy,因为周末的差价要大几倍。

 

尊敬的程序员,这里是计算买入和卖出订单的代码,只开一个买入 或卖出订单

int CountBuy()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >= 0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_BUY)
count++;
}

}
return(count)
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >= 0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_SELL)
count++;
}

}
return(count);
}

一切似乎都在工作,但在我的EA中,有条件使用TP和SL在一些烛台形态上买入和卖出。但是,当这个条件被满足,TP被触发,那么在0蜡烛的形成中,订单打开的条件仍然是真实的,新的订单被打开,这在当时是不应该的。你能告诉我们用哪段代码来禁止进一步开单吗?该EA本身附在后面。

附加的文件:
expert.mq4  4 kb
 
artmedia70:

然后确定被触发的挂单的事实,并删除最远的一个相反的挂单。

所有这些只为一个 事实和一个 时间而做。没有必要像你试图做的那样,创建一个被触发和被删除的数量。你会在一个刻度上捕捉到挂单转化的事实。所有其他触发器(如果有的话)将由下一个tick决定。



如果每次打钩的数量超过了这个数字呢?比方说,如果订单之间的步幅非常小,那么就可以触发多个订单。当然,我们将无法及时执行必要的行动。
 
hoz:

如果有更多的人在打勾,怎么办?如果,比方说,订单之间的步幅非常小,那么就可以触发多个订单。当然,我们将无法及时执行所需的行动。
未结头寸 上进行循环,寻找当前栏位上的触发订单,并在同一循环中删除待定订单。
 
artmedia70:
在同一循环中,对未结头寸进行循环,寻找当前条形上的触发订单,并删除头寸。


那么,这个循环将被重复,所有的东西都将被再次删除。我目前拥有的变体中也有一个条件。

 while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
   {
      OrderDelete(s_ticket,Black);
      ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления на 1, т.к. строкой выше..
                                               // .. один отложенник уже удалили
   }

也就是说,它应该删除,直到ordersToDelete 为零。但它破坏了一切。这似乎是最基本的,但有些愤怒的事情发生了。在毫无价值的教程中,根本没有关于这种时刻的内容。我试了两种方法,并以不同的方式重写了它,它没有发挥应有的作用。

 

重写的方式不同。

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket = -1,                                 // Тикет искомого ордера
       np = -1;                                       // Номер позиции искомого ордера
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу

   double OOP = 20.0;                                 // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);               // Если ничего удалять не нужно, выйдем из функции

   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          np = i;
      }
   }
   if (OrderSelect(np,SELECT_BY_POS))
   {
      s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
      OrderDelete(s_ticket,Black);
   }
   
   return (0);
}

金,也在寻找同样的方式。找到一个有最低开盘价 的订单,定义了它的位置,并选择了这个订单,定义了它的票据并删除了它。但它没有被删除。

 
为什么你不记得订单的票据,而不记得它的位置。如果没有这样的订单,在直接转账中会发生什么?你会删除零订单吗?