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

 

下午好,我做了一个块来计算神奇的买入未平仓头寸,但问题是,如果该块在不同的货币对上工作,那么该块只产生一个货币对的结果(最后的未平仓头寸)。我怎样才能修改代码(不改变魔法),使该区块为每个货币对提供结果?

int OpenMagicOrderCount_buy() 
{
   int OpenBuyOrdersCount = 0;
   int OpenOrders = 0;
   int cnt = 0;
   OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
          {                             
                  OpenBuyOrdersCount ++;
          }
   } 
   Print("+++++++++++++++++++++++OpenBuyOrdersCount: " + OpenBuyOrdersCount,"   OrderSymbol()= ", OrderSymbol());
   return(OpenBuyOrdersCount); 
}
 
int OpenMagicOrderCount_buy() 
{
   int OpenBuyOrdersCount = 0;
   int OpenOrders = 0;
   int cnt = 0;
   OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
          {                             
                  OpenBuyOrdersCount ++;
          }
   } 
   Print("+++++++++++++++++++++++OpenBuyOrdersCount: " + OpenBuyOrdersCount,"   OrderSymbol()= ", OrderSymbol());
   return(OpenBuyOrdersCount); 
}
так все " OP_BUY"魔术师会计算
 
7777877:

...继续...

StringSubstr 函数小节的末尾,在括号中给出了以下语句:"另外我们必须注意,在第一个for循环中 (我的注释:必须是deinit(),因为没有其他删除对象的方法),我们不能删除对象,因为每次删除后,对象的总数和它们的编号将发生变化,一些对象的名称将被 跳过"。但在所引用的EA中,根本就没有第二个for 循环。 此外,在for 循环之前的函数deinit()中定义的变量Quant_Del被初始化为0,而变量ifor 循环之前没有定义。

事实证明,上述专家只是微不足道地省略了几行程序。

因此,第1个问题 如下:这真的是一个微不足道的几行遗漏,还是它是一个如此棘手的程序,以至于一个新手在没有外界帮助的情况下无法掌握其含义?

进一步说......在同一章的同一章节中,在引用的文字前有一个链接到同一个专家顾问(在附件中),点击后,在MetaElitor中打开同一个专家顾问。但这个专家顾问的文本是不同的deinit()函数看起来是这样的

那么,如果 "结合" 这句话"另外,请注意,你不能在第一个for循环中删除对象,因为在这种情况下,每次删除后,对象的总数和它们的编号都会改变,一些对象的名称会因此被跳过 "和文本 最后一个变体的deinit()函数,我有第2个问题。

问题。为什么我不能在第一个for 循环中通过将 ObjectDelete(Obj_Name)函数放在if 语句中删除对象?

为什么在每次删除"...对象的总数将发生变化"...?因为在这种情况下,决定对象总数的Quant_Objects 变量的值等于ObjectsTotal(),FORWARD 这个for 循环?

P.S. 提前感谢您的回答,为了不给论坛添乱。

向后转动周期,并尽可能多地删除。
 
FAQ:
向后扩展循环,尽可能多地删除。

我对你的理解正确吗?你应该把deinit函数(尤其是循环)看成是这样的。

int deinit()                           // Спец. функция deinit()
  {
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   for(int k=Quant_Objects; k>=0; k--) // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Если найден объект, …
        {                              // ... начинающийся с Paint_,
         ObjectDelete(Obj_Name);       // … то его и удаляем
        }                              //конец if
     }                                 //конец for
   return;                             // Выход из deinit()
  }                                    //конец deinit
//-------------------------------------------------------------- 10 --
 
Elektronik:


需要这些数据来计算买入和卖出订单之间的差异。

让我们假设一个买入量为0.09手的订单和两个卖出量为0.11手的订单被打开,他们之间的差异将是0.09-0.11=-0.02,或者如果可能的话,他们之间的价值差异。


那么,函数OrderLots。
 
abeiks:

下午好,我做了一个块来计算神奇的买入未平仓头寸,但问题是,如果该块在不同的货币对上工作,那么该块只产生一个货币对的结果(最后的未平仓头寸)。我怎样才能修复代码(不改变魔法),使该区块能对所有货币对进行计算?

变化。

if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&  OrderType() == OP_BUY )

敬请关注。

if (OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
 
我如何用高于最后一根蜡烛的止损来取代EA中以点为单位的止损
 
Neo777:
我如何用高于最后一根蜡烛的止损来取代EA中以点为单位的止损?
double x = ... // Задаем на сколько пипсов выше
double sl = NormalizeDouble(High[1] + x * Point, Digits); // Задаем значение стоплосс на x пипсов выше предпоследней свечи
 

Reshetov:спасибо
извиняюсь за то что не в SRC

如何在此插入

 
7777877:

我对你的理解正确吗?你应该把deinit函数(尤其是循环)看成是这样的。


正确,在这种情况下,移除例如18号对象,19号成为其位置,19=>18,即自动获得一个反向迭代。也用这个来下订单。

另外,由于对象 和订单的列表 在形式上是由=0开始的数组,最大的索引将比数组的大小少一个。

int Quant_Objects=ObjectsTotal()-1;