mql4语言的特点、微妙之处以及技巧 - 页 2

 
请随意从方法中返回GetPointer(this)。

至少在方法设定器中这是合理的--代码可能会变得更加可读和紧凑,你会得到一个命名的参数。

ChartObject *hline=HLine::New(1.255).Color(clrGreen).Width(2).Selectable(true); // не надо помнить очерёдность параметров и можно писать в одну строку - цепочкой

// получается вот из подобного :
class HLine:public ChartObject {
public:
   HLine(double price);
   HLine *New(double _price) { return new HLine(_price); } // это чтобы не городить (new HLine(...)).Method1
   HLine *Color(color _clr) { fgColor=_clr; return GetPointer(this); }  // а это чтобы получались цепочки obj.Method1(..).Method2(..)
};
当然,要谨慎使用,因为在语言中没有异常`s,也不希望

,而且有点干扰函数的返回类型的限定。
 
Maxim Kuznetsov:
请随意从方法中返回GetPointer(this)。
这种方式&这 更简明。
 
fxsaber:
这种方式&这 更简明。
GetPointer() 可以被谨慎地重写,例如为了调试的目的。
 
GetPointer 获取的指针不能被删除,它的意义何在?
 
// После этого в MQL4 будут компилироваться все библиотеки из MQL5\Include\Math
#property strict

#ifdef __MQL4__
  #include <Math\Alglib\bitconvert.mqh>  
  
  #define  TEMP_MACROS(A) double A( double ) { return(0); }
    TEMP_MACROS(MathLog1p)
    TEMP_MACROS(MathExpm1)
    TEMP_MACROS(MathArcsinh)
    TEMP_MACROS(MathArccosh)
    TEMP_MACROS(MathArctanh)
  #undef  TEMP_MACROS
#endif
 
Alexey Viktorov:
好吧,让我首先开始。

要关闭一个订单,我们不需要定义订单类型 和与该类型相对应的价格。在OrderClosePrice()中写上 "按价格关闭 "就足够了!

/********************Script program start function********************/
void OnStart()
{
   int i, total = OrdersTotal()-1;
    for(i = total; i >= 0; i--)
     {
      if(OrderType() < OP_SELLSTOP)
       {
        if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100))
        printf("***********");
       }
     }
}/********************************************************************/


相当酷!) 谢谢你。

从这个例子来看,你也不需要OrderSelect()?

 
Liza_:


(酷!) 谢谢。

从这个例子来看,OrderSelect()也不需要?

是的,它是。阿列克谢刚刚错过了...
 
Liza_:

很好!) 谢谢。

是的,它允许编写相当简洁的脚本用于战斗。
// Закрывает позиции, описание - https://www.mql5.com/ru/code/17943
sinput int RTOTAL = 4;            // Число повторов при неудачных сделках
sinput int SLEEPTIME = 1;         // Время паузы между повторами в секундах
sinput int Deviation_ = 10;       // Отклонение цены
sinput bool exAllSymbols = false; // false - только текущий, true - все символы

#define _CS(A) ((!IsStopped()) && (A))

bool CloseAllPositions( const bool AllSymbols = true, const int Slippage = 0 )
{
  bool Res = true;
  
  for (int i = OrdersTotal() - 1; _CS(i >= 0); i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) &&
        (AllSymbols ? true : (OrderSymbol() == Symbol())))
      Res &= OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage);
      
  return(Res);
}

void OnStart()
{
  for (int i = 0; _CS((i < RTOTAL) && (!CloseAllPositions(exAllSymbols, Deviation_))); i++)
    Sleep(SLEEPTIME * 1000);
}
与MQL5-同类产品相比,它并不占优势。我想知道是否有比较结果相反的情况......。
 
Artyom Trishkin:
需要的。只是由于懒惰而错过了......

是的,嗯...真的很混乱。

但以前,我没有遇到过这些话题。

fxsaber:

所以你只能在相应的OrderSelect之后使用OrderClosePrice。由于OrderSelect为Order(const)-functions复制了一次数据,而同一个RefreshRates无法更新它们。

例如,如果OrderClosePrice未能关闭,那么在下一次尝试之前必须再次进行OrderSelect(不需要RefreshRates)。

ZS 这条线是2005年的!这里 有开发者的详细论证。

所以你可以使用它,但要明白可能会有麻烦。
 

未结订单应从更高的数字开始分析,即for(int nom=OrdersTotal()-1; nom>=0; nom--)
这在删除订单时尤其重要。
但如果我们反其道而行之,for(int nom=0; nom<OrdersTotal(); nom++)会发生什么??
一开始,索引等于零,第一个编号为0的订单被删除。
那么指数就会变成等于1。在这一点上,其余的订单被转移了,而编号为1的订单
占据零点位置。前2号人物占据1号位置。它将被删除。
然后指数变成2。而一开始是4号的订单将被删除。
因此,在开始时占据偶数位置的订单被删除。奇数的将被保留。这可以从订单和数字的评论中看出。
我附上一个脚本,显示了删除和截图的两个选项
有20个未决订单

被逐一删除

附加的文件:
PROBA-ORD.mq4  3 kb