任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 75

 
MisterD:
你好,请你告诉我以下代码中哪里有错误?
我在 "deinit "的时刻调用了这个循环。
它删除了除最后一个订单以外的所有订单。
我认为这一行很可能是一个错误 >>for (int i=1; i<=OrdersTotal(); i++) <<
然而,从逻辑上看,一切似乎都是正确的......我错过了什么?

提前感谢!


循环往复地做

//-------------------------------------------------------------------------------------------
for (int i=OrdersTotal()-1; i>=0; i--)
{
   if (OrderSelect(i,SELECT_BY_POS)==true)
   {
      int Type=OrderType();
      if (OrderSymbol()!= Symbol() || Type <2)continue;
      int Ticket=OrderTicket();
      bool Modify =OrderDelete(Ticket);
      if (Modify == true) Alert ("Ордер Удалён");continue;
      if (Modify != true) Alert ("Удаление ордера не удалась");
   }
} 
//-------------------------------------------------------------------------------------------
 
MisterD:
你好,请你告诉我以下代码中哪里有错误?
我在 "deinit "的时刻调用了这个循环。
它删除了除最后一个订单以外的所有订单。
我认为这一行很可能是一个错误 >>for (int i=1; i<=OrdersTotal(); i++) <<
然而,从逻辑上看,一切似乎都是正确的......我错过了什么?

提前感谢!

//-------------------------------------------------------------------------------------------
for (int i=1; i<=OrdersTotal(); i++)
{
如果(OrderSelect(i-1,SELECT_BY_POS)==true)。
{
int Type=OrderType()。
如果(OrderSymbol()!= Symbol() || Type <2)继续。
int Ticket=OrderTicket()。
Modify=OrderDelete(Ticket);
如果(Modify == true) Alert ("Order Deleted"); continue;
如果(Modify != true)警告("订单删除失败")。
继续。
}
}
//-------------------------------------------------------------------------------------------


像这样试试吧。

for(int i=OrdersTotal()-1;i>=0;i--) {
  if(OrderSelect(i,......................
 

下午好。需要一点帮助。有一个函数,关闭了一个利润最丰厚的手。

我需要把它循环起来。

请告知如何使用这个功能,例如,如果我的账户资产超过5个点,那么这个功能应该是有效的。

void ClosePosWithMaxProfitInCurrency(string sy="", int op=-1, int mn=-1) {
  double pr=0;
  int    i, k=OrdersTotal(), np=-1;

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (pr<OrderProfit()+OrderSwap()) {
            pr=OrderProfit()+OrderSwap();
            np=i;
          }
        }
      }
    }
  }
  if (np>=0) {
    if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();
    }
  } 

}

 
sannin:

下午好。需要一点帮助。有一个函数,关闭了一个利润最丰厚的手。

我需要把它循环起来。

请告知如何使用它。 例如,如果我的账户净值高于5点,那么这个功能应该是有效的。

例如,如果账户净值高于5点(4个字符)--在实际市场中,如果订单数量 高于3-4个,它们将很容易变成负值(根据删除的结果)。:)))

P.S. 据我所知,你需要一个现成的代码,而解决这样一个问题的算法对你来说是没有用的!

 
TarasBY:
5个点(4个标志)--在实际市场中,如果订单数量大于3-4个,它将很容易变成(通过删除的结果)减去。:)))


我是......而且我最近一直在关注黄金......它的反应没有我想象的那么快

我还没有使用过这样的功能......这就是我请求支持的原因。

 
下午好,我在开发专家顾问 时遇到一个问题,它没有关闭订单,尽管指标规定了关闭的条件,请解释这是什么,提前感谢
附加的文件:
 
sannin:


好吧,我是......而且我最近一直在关注黄金......它不像我想象的那么快

我还没有使用过这个表格中的功能......所以这里请求支持

首先,你要计算出该工具的总头寸的BU线(它用于确定当订单达到盈利点时的平仓条件)。

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Определение Уровня БезУбытка по символу                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_BreakEven (string fs_Symbol,     // Symbol
                       double fd_DeltaLots,  // разность объемов ордеров Buy и Sell
                       double fd_Profit)     // текущий профит по открытым ордера
{
    if (fd_DeltaLots == 0.) return (0.);
    double ld_BU = 0., ld_tickvalue = MarketInfo (fs_Symbol, MODE_TICKVALUE);   // цена одного пункта
//----
    //---- Уровень общего безубытка для открытых ордеров
    if (fd_DeltaLots > 0.) ld_BU = MarketInfo (fs_Symbol, MODE_BID) - (fd_Profit / (ld_tickvalue * fd_DeltaLots)) * MarketInfo (fs_Symbol, MODE_POINT);
    else if (fd_DeltaLots < 0.) ld_BU = MarketInfo (fs_Symbol, MODE_ASK) - (fd_Profit / (ld_tickvalue * fd_DeltaLots)) * MarketInfo (fs_Symbol, MODE_POINT);
//----
    return (ld_BU);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

然后计算当前价格与盈亏平衡线之间的差额。 如果 "差额 "令人满意,我们就进入删除订单的程序。首先要做的是找到最有利可图/亏损的订单的票。

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Получаем Тикет самого прибыльного/убыточного ордера                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_TicketWithControlProfit (string fs_Symbol = "",  // Инструмент
                                  int fi_Magic = -1,      // Magic
                                  int fi_Type = -1,       // OrderType
                                  int fi_TypeProfit = 0)  // Профитность ордера среди остальных ордеров:
                                                          // >= 0 -  с самым большим профитом;
                                                          // < 0 - самый убыточный
{
    double ld_Profit = 0., ld_curProfit;
    int    li_Total = OrdersTotal(), li_Ticket = -1;
//----
    if (fs_Symbol == "") fs_Symbol = Symbol();
    if (fi_TypeProfit < 0) ld_Profit = 10000000000.;
    for (int i = li_Total - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue;
        if (OrderSymbol() != fs_Symbol) continue;
        if (fi_Magic > -1) if (OrderMagicNumber() != fi_Magic) continue;
        if (fi_Type > -1) if (OrderType() != fi_Type) continue;
        if (fi_Type > 1) continue;
        ld_curProfit = OrderProfit() + OrderSwap() + OrderCommission();
        if (fi_TypeProfit >= 0) {if (ld_Profit <= ld_curProfit) continue;}
        else if (ld_Profit >= ld_curProfit) continue;
        ld_Profit = ld_curProfit;
        li_Ticket = OrderTicket();
    }
//----
    return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

删除可以从任何一个方向进行。让我们删除。

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Функция закрытия "своих" ордеров по признаку                               |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fClose_AllOrdersByProfit (string fs_Symbol = "",  // Инструмент
                              int fi_Magic = -1,      // Magic
                              int fi_Type = -1,       // OrderType
                              int fi_TypeProfit = 0)  // Направление закрытия ордеро по профитности:
                                                      // >= 0 - начиная от самого большого профита;
                                                      // < 0 - начиная от самого маленького профита;
{
    int li_Ticket = fGet_TicketWithControlProfit (fs_Symbol, fi_Magic, fi_Type, fi_TypeProfit),
        li_cnt = 0;
//----
    while (li_Ticket > 0)
    {
         //---- Здесь вставите свою процедуру закрытия 
         //---- что-то типа:
         //ClosePosByTicket (li_Ticket);
         li_Ticket = fGet_TicketWithControlProfit (fs_Symbol, fi_Magic, fi_Type, fi_TypeProfit);
         li_cnt++;
    }
//----
    return (li_cnt);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

进一步组装合适的单位并不太困难:你要做的还是去...:)

 
我想把一个价格值分配给一个变量。

a=(NormalizeDouble(OrderOpenPrice(),5));


但由于某些原因,价格在1.3360处画了一个四位数的数值

你能告诉我这个错误吗?
 
lottamer:
我想把一个价格值分配给一个变量。



但由于某些原因,价格在1.3360处画了一个四位数的数值

你能告诉我这个错误吗?

也许DC是四位数的?或者不使用DoubleToStr(YourPrice,5)输出价格。
 
Sepulca:

也许DC是四位数的?或者在没有DoubleToStr(YourPrice,5)的情况下显示价格。


直流电是五位数的...

没有DoubleToStr(YourPrice,5)是什么意思? 我没有DoubleToStr(YourPrice,5)的地方。