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

 
gyfto:

或者进一步简化它。

这里的Δ是差异的意思,即Close[i]-Open[i],而^是程度的标志const - 这个表达式中的常数,i_sizeOfSequentialCorrectionBar * pt,标准的数学符号,我没有编造什么2*bVar-1类似于±1, 这里的bVar是任何bool-variable。而2*bVar-1表达式取值不是0和1,而是-1和+1。≥是MQL4的>=,也是一个标准的数学符号。step是一个台阶,即在cnt++中step等于1,在cnt=0中step等于-cnt。 从符号上看还有什么不清楚的?

gyfto,谢谢你的解释。但有一点。无论如何,我们不能通过改变表达式的输出位数来解决问题。目前,在发生归零的情况下,开盘价和收盘价必须进行 "对调"。也就是说,在我看来,普遍性是无法实现的。这是我一直在思考的问题。

Vadim 前段时间写道,把一个函数放在循环里,会使代码的速度降低一个数量级。我想知道,它是否只适用于函数在每次循环迭代时计算其数值的情况,还是适用于其他任何情况?例 如,在我写完专家顾问之前,我用以下方案重写了 我试图简化的函数。

//+-------------------------------------------------------------------------------------+
//| Расчитываем количество идущих один за одним баров одного признака                   |
//+-------------------------------------------------------------------------------------+
int LastCandlesType(int directionMA)
{
   int cntUp,                                                                            // Счётчик идущих друг за другом свечей с..
       cntDn;                                                                                // .. требуемыми признаками
       
   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      if (directionMA == CROSS_UP)
      {
         if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntDn++;                                                                     // .. прибавим 1 к счётчику

         if ((Close[i] - Open[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntDn = 0;                                                                   // .. счётчик обнуляем

         if (cntDn == i_sequentBarsСount)                                                   // Если cnt баров в подряд медвежьи..
             return (REQUIRED_SEQUENTIAL_BEARS_GOT);                                         // .. Выходим из функции
      }

      if (directionMA == CROSS_DN)
      {
         if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntUp++;                                                                     // .. прибавим 1 к счётчику

         if ((Open[i] - Close[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntUp = 0;                                                                   // .. счётчик обнуляем
     
         if (cntUp == i_sequentBarsСount)                                                   // Если cnt баров в подряд бычьи..
             return (REQUIRED_SEQUENTIAL_BULLS_GOT);                                         // .. Выходим из функции
      }
   }
}

使cntUp cntDn 计数器不同,因为它可能一次有一个值,然后 在循环使用计算条时有另一个值而计数器可以对一个数值进行求和,并继续对另一个数值进行求和。而如果变量相同,一个特征的条数 将被添加到另一个特征的条数计数器中。

这就是需要建议的地方,也许用其他方式总结会更好?

问题是,专家顾问还不是一个大的。我已经有了马车和这个功能。我有一种感觉,猫头鹰不长,反而卖得好,反之亦然。我正在努力理解它是如何发生的。也许这里有什么问题?

 

你好,我开始学习mql4,我写了一个锁住亏损订单的脚本。我无法解决一个问题:脚本锁定了所有从-10开始的亏损订单,但只要价格低于-10,它就一直锁定它们。如何使锁定只发生一次?也就是说,如果亏损达到-10,脚本就会锁定该订单,即使亏损不断增加,也会将其留在那里。

Extern double StopLoss=150;

extern double Profit=-10;

//+------------------------------------------------------------------+

//----
void start()
{
double profit=Profit;
double Lots=0;
for(int i=0;i<OrdersTotal(); i++)
{
if(!OrderSelect(i,SELECT_BY_POS)
continue;

如果(OrderType()==OP_BUY && OrderProfit()<Profit*Point)
Lots+=OrderLots();
if(OrderType()==OP_SELL && OrderProfit()<Profit*Point)
Lots-=OrderLots();


}
if(Lots>0)
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss*Point,0,NULL,Red);
if(Lots<0)
OrderSend(Symbol(),OP_BUY,-(Lots),Ask,3,Bid-StopLoss*Point,0,NULL,Blue);
//----
return(0);
}

 

下午好。

请看代码,我想计算一笔交易的平均时间(挂单 交易)。

//+------------------------------------------------------------------+
//| Расчет среднего времени сделки            |
//+------------------------------------------------------------------+
double Sredneevremyasdelky(){
datetime Tsd=0; // общее время сделок
datetime Tsvsd=0; // среднее время сделки 
int n=0;
int orders=HistoryTotal();  // history orders total

        for(  int i=orders-1;i>=0;i--)
                  {
                 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) 
                   { 
                        Print("Ошибка в истории!"); 
                        break;
                   }
                if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 
                  continue;
                  n++;
                 Tsd=Tsd+(OrderCloseTime()-OrderOpenTime());
                   }
            if (n>0) Tsvsd=Tsd/n/60;


            return(Tsvsd);
         }

从订单的触发到结束。

 
Stells:

下午好。

请看代码,我想计算一笔交易的平均时间(挂单交易)。

从订单的触发到结束。


为什么要计算周期内的平均时间?也许在周期之后再做会更好。而且,设置计算周期将是一个好主意
 
Vinin:

为什么要计算周期内的平均时间? 这是一个不必要的操作。也许在周期之后再做会更好。而且,如果能设置计算周期就更好了
你把它带出了圈外。你如何设置计算周期?
 
Stells:
把它从循环中取出来了。我如何进行计算期?

外部变量,例如
 

我明白了,需要以某种方式将日期带出来。

它是哪种功能?

 
Stells:

我明白了,需要以某种方式将日期带出来。

它是哪种功能?


既然有外部人员,为什么还要把事情搞复杂呢?
 

hoz 我一有空就搬进来

我有这样一个关于优化的问题。我在和EMA算法打交道。正如你所知道的,这是递归,实际上是节省了时间。参照原始代码。

...

转到https://www.mql5.com/ru/forum/144691

 
gyfto:

hoz 我一有空就搬进来

我有这样一个关于优化的问题。我在和EMA算法打交道。正如你所知道的,这是递归,实际上是节省了时间。参照原始代码

我专门选了Matcad来处理由EMA产生的权重。

顺便说一下,现在我很清楚为什么使用EMA的指标(应该称为幂函数,而不是指数函数)使用周期为14。 那么,如果下一个权重比上一个权重更重要,为什么要把上一个权重拿得那么高,而你可以直接包裹一个幂函数?我甚至不再问为什么要使用递归,因为递归之后的最终权重可以通过一个公式得出(见F(n,x)和y(n,x))。


也许你应该开设自己的分支机构。为什么你需要一个 "初学者的分支"?