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

 
Бахром Балтабаев 向我的手机发送通知,我指定。

我最近写了一份警报:。但它可以通过添加SendNotification来改进。

// использовать алерт
input bool alert = true;
// использовать push-уведомления
input bool notification = true;
// уровень срабатывания
input double trigLv = 0.0;
// отклонение от trigLv в пунктах
input int deviation = 30; 


// функция взята из https://www.mql5.com/ru/docs/basis/types/double
bool EqualDoubles(double d1,double d2,double epsilon)
  {
   if(epsilon<0) 
      epsilon=-epsilon;
//---
   if(d1-d2>epsilon) 
      return false;
   if(d1-d2<-epsilon) 
      return false;
//---
   return true;
  }

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
  return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[]
) {
  static bool triggered = false;
  static datetime time_ = 0;
  if (!alert && !notification)
    return rates_total;
  if (EqualDoubles(trigLv, close[rates_total - 1], deviation * SymbolInfoDouble(NULL, SYMBOL_POINT))) { // сравнение цены Close с trigLv
    if (time_ != time[rates_total - 1])
      time_ = time[rates_total - 1];
    else
      return rates_total;
    if (!triggered) {
      if (alert)
        Alert("Level ", NormalizeDouble(trigLv, (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " triggered!");
      if (notification)
        SendNotification("Level " + (string)NormalizeDouble(trigLv, (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " triggered!");
    }
    triggered = true;
  }
  else
    triggered = false;
  
  return rates_total;
}

把我强调的那几行添加到源代码中,把它放到指标文件夹中,然后进行编译。这个指标可以被添加到图表中,次数不限,当不同的水平被越过时,可以收到信号。该代码在网上被最终确定。该结果没有得到核实。

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

关于交易、自动交易系统和策略测试的论坛

新手对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论

GlaVredFX, 2022.01.17 18:59

我正在寻找关闭订单 的代码,如果我没有看到任何订单,我将打开一个新的订单。

但由于某些原因,它只关闭了1个订单,并在下一个信号前停止。

2022.01.17 16:22:08.389 2022.01.04 08:00:00 e: 信号1.1322 < 关闭 1.1304 ExistPosSell 0
2022.01.17 16:22:08.389 2022.01.04 08:00:00 e: 信号1.1322 > clos 1.1304 ExistPosBuy 1
2022.01.17 16:22:08.366 2022.01.04 08:00:00 e: Signal 1.1325 < clos 1.1306 ExistPosSell 0
2022.01.17 16:22:08.366 2022.01.04 04:00:00 e: 信号1.1325 > 关闭1.1306 ExistPosBuy 1
2022.01.17 16:22:08.327 2022.01.04 2022.01.04 00:00:00 e: 信号1.1326 < clos 1.1296 ExistPosSell 0
2022.01.17 16:22:08.327 2022.01.04 00:00:00 e: Signal 1.1326 > clos 1.1296 ExistPosBuy 1
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: 信号1.1328 < 收盘1.1283 ExistPosSell 0
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: 收盘1号在1.13598买入0.01欧元兑美元,价格1.12831

2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: 信号1.1328>收盘1.1283 ExistPosBuy 1
2022.01.17 16:22:08.190 2022.01.03 16:00:00 E: open #4 buy 0.01 EURUSD at 1.13512 ok
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: Signal 1.134 < close 1.135 ExistPosSell 0
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: Signal 1.134 > close 1.135 ExistPosBuy 1

if(isNewBar()==true) {  
if(Signal > clos ) {  //--------------------- МА выше цены закрытия предыдущего бара.
     if(ExistPositions( NULL, OP_BUY, Magic) == true) //---------------- Если есть позиция BUY то
ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
         if(ExistPositions( NULL, OP_BUY, Magic) == False) //----------- если позиции BUY отсутствуют то
   ticket=OpenPosition(NULL,OP_SELL, NDLot(Lot),0,0, Magic, Com);} //------------ открываем позицию SELL

if(Signal < clos ) { //--------------------- МА ниже цены закрытия предыдущего бара.
    if(ExistPositions( NULL, OP_SELL, Magic) == true) //---------------- Если есть позиция SELL то
 ClosePosWithMaxProfitInCurrency(); //---------------------закрытие одной позиции с максимальным профитом в валюте депозита.
        if(ExistPositions( NULL, OP_SELL, Magic) == False)  //----------- если позиции SELL отсутствуют то
  ticket=OpenPosition(NULL,OP_BUY, NDLot(Lot),0,0, Magic, Com);} //------------ открываем позицию BUY

} return; 
如果你多注意 一下你的问题和你的代码,你会自己看到问题所在。
 
Mihail Matkovskij #:

如果你多注意 一下你的问题和你的代码,你就会自己看到。

问题是,1个最有利可图的订单应该在1个柱形上关闭,然后我们等待新的柱形并再次关闭1个有利可图的订单。我们不应该一下子就把它们全部关闭。

这意味着我们在第一个条形图上收盘,但在下一个条形图上什么也没有发生。

 
GlaVredFX #:

那里的问题是,1个最有利可图的订单应该在1个柱状体上关闭,然后等待新的柱状体,再次关闭1个有利可图的订单。你不应该一下子关闭所有的东西。

然后你必须正确制定你的问题。你只有一个信号。在新条形图开盘时,你将只得到1个信号。如果只有一个信号,有多少订单会被关闭?而且只有当信号出现在一个新的柱子上时才会出现。而且,如果没有信号,订单将在下一个条形图上被关闭。同样,如果有信号的话。

 
Mihail Matkovskij #:

然后你必须正确制定问题。你只能得到一个信号。而且是在一个新酒吧的开幕式上。如果只有一个信号,有多少订单会被关闭?而且只有当信号出现在一个新的柱子上时才会出现。而且,如果没有信号,订单将在下一个条形图上被关闭。再说,如果有信号的话。

在这种情况下,流程图通常有帮助。或者我们需要在一张纸上或文本文件中逐点详细描述该算法。也只有这样,你才会明白如何编写你的代码。

 

需要在所有可用的订单中先关闭1个订单的功能,谁能分享一下。

 
GlaVredFX #:

因此,如果你注意到了,算法是写在代码中 的。

1) 出现新栏

2)如果MA高于前一个柱状体的收盘价,进入第三步如果MA低于收盘价,进入第四步。

3)如果我们有一个买入头寸,我们以货币对的最大利润关闭一个头寸

3.1)如果没有未平仓的买入 订单,则开立一个卖出头寸

4) 如果我们有一个买入头寸,我们以货币对的最大利润关闭一个头寸。

4.1)如果没有未平仓的卖出 订单,我们就建立一个买入头寸。


现在我又有一个问题,上述算法的这段代码有什么问题。

这段代码包含一组命令。终端不知道你需要什么,它只知道代码中写了什么

...

if(isNewBar()) {  
  if(Signal > clos ) {  //--------------------- МА выше цены закрытия предыдущего бара.
    if(ExistPositions( NULL, OP_BUY, Magic)) //---------------- Если есть позиция BUY то
      ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
    if(!ExistPositions( NULL, OP_BUY, Magic)) //----------- если позиции BUY отсутствуют то
      sellSignal = true;
  } 

 // и аналогично для п.4.

} 
return; 

...

void OnTimer() {
  if (sellSignal) {
    ticket=OpenPosition(NULL,OP_SELL, NDLot(Lot),0,0, Magic, Com); //------------ открываем позицию SELL
    sellSignal = false;
  }
  // и аналогично для buy
}
全局范围内写入 buySignal和sellSignal 变量。
 
Mihail Matkovskij #:

一组命令 写在代码中。终端不知道你需要什么,它只知道代码中写了什么

我删除了这条信息,因为问题在于,订单的关闭不应该是按利润而是按时间。

这是因为我们的利润并不总是,也不总是在该有的地方。

因此,我们需要"关闭所有可用仓位中最开始的一个仓位 " 的功能。

 
GlaVredFX #:

我删除了这条信息,因为问题在于,订单应该根据时间而不是利润来关闭。

因为利润并不总是在那里,也不总是在它应该在的地方。

因此,我们需要"关闭所有可用仓位中最开始的一个仓位 " 的功能。

我在上一篇文章中增加了一个在定时器中开仓的例子。这样就能保证开仓。你可以在那里替代你自己的功能。

 
Mihail Matkovskij #:

在上一篇文章中增加了一个定时器位置开放的例子。这样,该职位就能保证开放。你可以在那里替代你自己的功能。

但不是像这样。你需要监测的结果是

ClosePosWithMaxProfitInCurrency

或你在OnTradeTransaction中的一个新函数。而如果没有位置,它就会进入。或者在buySignal或sellSignal 中写入信号,然后在OnTimer中处理,就像我在例子中显示的那样

原因: