新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1332

 
DanilaMactep:

我按照你的建议做了代码。在代码的开头,我有一个条件来选择止损的类型--atp或固定。

然后我注释了我的规范化,并这样设置

利润计算是代码中的下一步。 那里没有问题,在计算完利润后,我添加了建议我使用的可怕的公式。

所有的编译都没有错误。但当我运行测试时,日志中出现了错误,据我所知是除以0,测试被停止。我哪里搞砸了,或者我做错了什么?


只要删除它。

     sl = fabs(OrderOpenPrice()-OrderStopLoss())/_Point;// ПРИСВОИЛ ЗНАЧЕНИЕ КАК СОВЕТОВАЛИ
     //sl= NormalizeDouble(sl,Digits());// НОРМАЛИЗАЦИЯ ЗНАЧЕНИЯ СТОП ЛОССА ДЛЯ ОТКРЫТИЯ СДЕЛКИ ТО  ЧТО БЫЛО ЗАКОМЕНТИРОВАЛ
 
DanilaMactep:

我按照你的建议做了代码。在代码的开头,我有一个条件来选择止损的类型--atp或固定。

然后我注释了我的规范化,并这样设置

利润计算是代码中的下一步。 那里没有问题,在计算完利润后,我添加了建议我使用的可怕的公式。

所有的编译都没有错误。但当我运行测试时,日志显示了一个错误,我得到了除以零的结果,测试被停止了。我在哪里搞砸了,或者我哪里做得不对?


只是当你得到两种不同的选择时,你不应该同时应用两种选择。

你是把Sl算作两个不同的选择吗?

sl= iATR( NULL,PeriodForWork_sl,atr_sl_period,1);// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА


sl= razmer_fikc_sl*Point; // ПЕЕРМЕННОЙ СТОП ЛОССА ПРИСВАЕВАЕМ ФИКСИРОВАНОНЕ ЗНАЧЕНИЕ ПУНКТОВ И ДОМНОЖАЕМ НА ПОИНТ

你得到了价格值的价值。而公式应该包含从......到.... 的点。

因此,与价格有一定距离的止损是iATR(.........)/_Point或razmer_fikc_sl,但在函数中使用两个不同的值不是很方便,因此最好只留一个变量

double lot =MathFloor((Free*MaxRisk/100)/(sl/Point*LotVal)/Step)*Step; //СТРАШНАЯ ФОРМУЛА РАСЧЁТА ОБЪЁМА ЛОТА

不要忘了,在计算地段大小之前,应该先计算sl。

 
sl= iATR( NULL,PeriodForWork_sl,atr_sl_period,1)/Point;// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА
请务必
 

让它成为...

void OnTick()
  {
//---
if(tip_sl==en_po_atr)
     { //ЕСЛИ ТИП СТОП ЛОССА СТОИТ ПО АТР ТО ВЫСЧИТЫВАЕМ ЕГО ИЗ АТР
     sl= iATR( NULL,PeriodForWork_sl,atr_sl_period,1)/Point;// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА
      Print("СТОП ПО АТР, ЕГО РАЗМЕР "+sl);
     }
     else //ИНАЧЕ- ТО ЕСТЬ ЕСЛИ СТОП ЛОСС ФИКСИРОВАННЫЙ В ПУНКТАХ
     {
     sl= razmer_fikc_sl; // ПЕЕРМЕННОЙ СТОП ЛОССА ПРИСВАЕВАЕМ ФИКСИРОВАНОНЕ ЗНАЧЕНИЕ ПУНКТОВ И ДОМНОЖАЕМ НА ПОИНТ
      Print("СТОП ПО АТР, ЕГО РАЗМЕР "+sl);
     }
double lot =MathFloor((Free*MaxRisk/100)/(sl*LotVal)/Step)*Step; //СТРАШНАЯ ФОРМУЛА РАСЧЁТА ОБЪЁМА ЛОТА
 
MakarFX:

只要删除它。

我修好了那条线,测试就开始了--非常感谢你们。只是不明白为什么从iATR中获取止损点到一个变量时,为什么要除以最后的点?P/S 我在数学上有真正的困难,我不是在胡闹 :-( 但我猜测测试很顺利,用100手放最小,用10000手不同的时候,所以工作很好...再次感谢您的帮助...

 
DanilaMactep:

我已经修复了字符串,测试开始了--非常感谢你们!"。只是不明白为什么从iATR中获取止损点到一个变量时,为什么要除以最后的点?P/S 我在数学上有困难,我不是在胡闹 :-( 但我猜测测试很顺利,在100个存款的时候,很多是最小的,而在10000个存款的时候,一直是不同的,所以它是可行的...再次感谢你的帮助...

ATR给出的是一个十进制数字,如0.00120

razmer_fikc_sl是一个整数。

为了计算地段,你需要点,也就是整数

ATR/Point给出一个整数

 
这是一个老话题,但我找不到解决办法。如何指定时间间隔(例如从12:00到14:00)并在此间隔内只开一次符合某些条件(例如RSI<30)的订单。


类似于睡眠的东西:在一个给定的条件下开一个订单,2小时内什么都不做。但在测试器中,睡眠 不起作用。
 
Порт-моне тв:
这是个老话题,但我找不到解决办法。如何指定时间段(例如,从12:00到14:00),并且只在这个时间段开出满足某些条件(例如,RSI<30)的订单。


类似于睡眠的东西:在一个给定的条件下开一个订单,2小时内什么都不做。但在测试器中,睡眠 不起作用。

第一个条件--时间已到
第二个条件--rsi
第三个条件--历史上没有这样的订单,在开盘价的区间内

 

下午好。

有一个指标Elliott Wave Oscillator,它提供变量EWO的数值。有高于零的正EWO和低于零的负EWO。

从过去100个EWO读数中,有必要计算正EWO的平均值,并分别计算负EWO的平均值。

我从指标中获取数值 double EWO=iCustom(Symbol(),0, "Elliott Wave Oscillator",0,0)。

请告知哪个mql4代码可以在EA中实现这一点?


我设法找到了模数的平均值。

double avarage_EWO = 0;
for(int g=0;g<100;g++)
avarage_EWO = avarage_EWO +MathAbs( iCustom(Symbol(),0, "Elliott Wave Oscillator",0,g) ) ; // modulo average
avarage_EWO = avarage_EWO/100;


但如何分别计算平均正值和平均负值的EWO?

谢谢!



 

获利",所以下了订单

我搞不清楚ORDER_REASON_TP 是怎么做的,有什么用。

我知道DEAL_REASON_TP 是如何工作的,但我不知道这里的订单是怎么回事

原因: