//+-------------------------------------------------------------------------------------+//| Расчитываем количество идущих один за одним баров одного признака |//+-------------------------------------------------------------------------------------+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); // .. Выходим из функции
}
}
}
//+------------------------------------------------------------------+//| Расчет среднего времени сделки |//+------------------------------------------------------------------+double Sredneevremyasdelky(){
datetime Tsd=0; // общее время сделокdatetime Tsvsd=0; // среднее время сделки int n=0;
int orders=HistoryTotal(); // history orders totalfor( 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);
}
或者进一步简化它。
这里的Δ是差异的意思,即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 前段时间写道,把一个函数放在循环里,会使代码的速度降低一个数量级。我想知道,它是否只适用于函数在每次循环迭代时计算其数值的情况,还是适用于其他任何情况?例 如,在我写完专家顾问之前,我用以下方案重写了 我试图简化的函数。
我 使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);
}
下午好。
请看代码,我想计算一笔交易的平均时间(挂单 交易)。
从订单的触发到结束。
下午好。
请看代码,我想计算一笔交易的平均时间(挂单交易)。
从订单的触发到结束。
为什么要计算周期内的平均时间?也许在周期之后再做会更好。而且,设置计算周期将是一个好主意
为什么要计算周期内的平均时间? 这是一个不必要的操作。也许在周期之后再做会更好。而且,如果能设置计算周期就更好了
把它从循环中取出来了。我如何进行计算期?
外部变量,例如
我明白了,需要以某种方式将日期带出来。
它是哪种功能?
我明白了,需要以某种方式将日期带出来。
它是哪种功能?
既然有外部人员,为什么还要把事情搞复杂呢?
hoz ,我一有空就搬进来。
我有这样一个关于优化的问题。我在和EMA算法打交道。正如你所知道的,这是递归,实际上是节省了时间。参照原始代码。
...
转到https://www.mql5.com/ru/forum/144691
hoz ,我一有空就搬进来。
我有这样一个关于优化的问题。我在和EMA算法打交道。正如你所知道的,这是递归,实际上是节省了时间。参照原始代码。
我专门选了Matcad来处理由EMA产生的权重。
顺便说一下,现在我很清楚为什么使用EMA的指标(应该称为幂函数,而不是指数函数)使用周期为14。 那么,如果下一个权重比上一个权重更重要,为什么要把上一个权重拿得那么高,而你可以直接包裹一个幂函数?我甚至不再问为什么要使用递归,因为递归之后的最终权重可以通过一个公式得出(见F(n,x)和y(n,x))。
也许你应该开设自己的分支机构。为什么你需要一个 "初学者的分支"?