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

 
AlexeyVik:

哦,还有一件事我不明白。如果N是日期时间,那么D'19:00'是文本格式。它们可以被比较吗?不,在时间比较的情况下,我写道

D'19:00'是一个日期时间类型 的字面常数。
 

我想问问你们,亲爱的程序员,请用俄语向我解释如何用代码搜索过去的指标读数。例如,卖出时的止损,我需要从零条开始放上3个高ZigZag,或者超过第八个上分形。无论我在哪里读到--要么不是这样,要么写得不是这样:)

 
Petiyashaket:

我想问问你们,亲爱的程序员,请用俄语向我解释如何用代码搜索过去的指标读数。例如,卖出时的止损,我需要从零条开始放上3个高ZigZag,或超过第八个分形的顶部。无论我在哪里读到--要么不是这样,要么写得不是这样:)

从零条到图表开始的 循环,int x=0。在循环中,调用所需的指标,例如,fractal。如果值不是空的,就给x加1,当x达到所需的值时--记住循环迭代并退出循环,理论上迭代的值将是所需分形所在的条形的数字。理论上来说,因为在循环运行的过程中,M1上可能会出现一个更多的柱子,然后指针会显示在一个错误的柱子上。)
 
evillive:
在循环中调用所需的指标,例如fractal。如果值不是空的,就给x加1,当x达到所需值时--记住循环迭代并退出循环,理论上迭代值将是所需分形所在的条形的数字。理论上,因为当循环运行时,M1上可能会出现一个新的柱形,然后指针会显示在一个错误的柱形上))
必须节省时间。或者,更好的是,使用存储最后一个分形的形成时间的数组。由于消除了不必要的循环,工作速度将会降低。
 
Petiyashaket:

请用俄语解释一下,如何在代码中搜索过去的指标读数?例如,我需要把止损放在从零条开始的3个高ZigZag上,或者第八个分形的顶部,无论我读到什么--或者不是什么,或者写的不是这样:)

"俄语 "和 "编程语言"(希望有代码解释)不是一回事。

在算法上。

1) 定义感兴趣的ZigZag的返回值,如果它没有 "分形点"--它可以是EMPTY_VALUE 或0.0。

2) 在循环中使用iCustom(),在循环中被检查的条形上获得相应的缓冲指标值,检查它与 "空值 "的差异,并保留这些差异的一个计数器。在你的情况下,当计数器等于3时--条形图的数字(N)将是所需的条形图。

3) High[N]/Low[N]--将是所需水平。

对于标准的ZigZag High,我们正在寻找这样的东西。

#define  ZZ_NULL  0.0

    uint li_N = 0, li_Bar = 1;
    double ld_ZZ = 0.;
//----
    while (li_Bar < Bars - 1)
    {
        ld_ZZ = iCustom (_Symbol, _Period, "ZigZag", /* внешние параметры индикатора */, 1, li_Bar);
        if (ld_ZZ != ZZ_NULL)
        {
            li_N++;
            if (li_N >= 3) break;
        }
        li_Bar++;
    }
    double ld_Price = High[li_Bar];

但在此之前,我们必须将ZigZag代码中显示的缓冲区数量从1改为3。

#property indicator_buffers 3
 

谢谢你的回答,我会回复他们的:)现在的问题是

http://clip2net.com/s/j7xvk9

我不明白为什么它不修改订单,而只是打开新的挂单。

 
Petiyashaket:

谢谢你的回答,我会回复他们的:)现在的问题是

http://clip2net.com/s/j7xvk9

我不明白为什么它不修改订单,而只是打开新的挂单。

 
evillive: 谢谢你的展示 :)
  double Up=iFractals(Symbol(),0,MODE_UPPER,3);           //верхний фрактал
  double Down=iFractals(Symbol(),0,MODE_LOWER,3);         //нижний фрактал
//----
  if(Up>0&&Down==0&&Volume[0]<2) //если верхний есть а нижнего нет то:
    {
    if((High[3]+5*Point-Ask)/Point>MarketInfo(Symbol(),MODE_STOPLEVEL)) //если цена позволяет выставить отложенный ордер то:
    OrderSend(Symbol(),OP_BUYSTOP,Lot,High[3]+5*Point,20,High[3]-sl,High[3]+tp,NULL,Magic,0,Green); // то выставляем байстоп на 5 пунктов выше верхнего фрактала
        {
        for (int pos=0;pos<OrdersTotal();pos++) //     скопировал эту строчку хз откуда ибо не понимаю грёбаный счетчик :) тут видимо и косяк
        OrderSelect(pos,SELECT_BY_POS,MODE_TRADES); // ищем текущие ордера
        if(OrderMagicNumber()==Magic&&OrderSymbol()==Symbol()&&OrderType()==OP_BUYSTOP)// и если все условия совпадают то:
          {
          OrderModify(OrderTicket(),Up+5*Point,Up-sl,Up+tp,0,CLR_NONE);//переносим байстоп на новый верхний фрактал
          }


 
Petiyashaket:
谢谢你的展示 :)
它在修改日志中抱怨的是什么?"愚蠢地打开新的挂单",因为没有限制,但有一个OrderSend
 
Petiyashaket:

1)任何策略都必须由同时开仓的订单数量来定义。因此,在打开下一个订单之前,我们应该检查有多少个已经打开。

2)在一个柱子上,不能同时出现上分形和下分形,分别将该检查列为

    if (Up > 0 && Down == 0)

属于程序员的白痴范畴。

3)在编写返回 缓冲区指标值 的条件之前,你需要确切地知道什么值是它的 "空"?你检查过它是0吗?

4)结构。

    if (Volume[0] > 2)

虽然它能起作用(在大多数情况下),但却是不自然的,因为它是开发商的 "自由意志 "想法,对交易者来说是没有信息的。一个替代方案--对一个新酒吧的追踪。

5)你必须从基础做起,因为这。

    OrderSend(Symbol(),OP_BUYSTOP,Lot,High[3]+5*Point,20,High[3]-sl,High[3]+tp,NULL,Magic,0,Green); // то выставляем байстоп на 5 пунктов выше верхнего фрактала
        {

表明你根本不明白你在写什么。

了解的最好方法是研究其他人的代码是如何工作的,并为你自己的目的修改它们。好运。