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

 
geratdc:

你好。


寻找以下信息。

1.关于在处理EA工作中的关键事件时实施SMS-通知。

关于从北京时间12:00至18:00实现开仓和平仓的交易(当然有短信通知:)关于每周交易时段的开始和结束)。

关于实施交易完成后的电子邮件通知(18-00 PTN)--在测试器中发送每周交易时段的顾问工作报告,其中包括图表和开仓日期、平仓日期、价格、平仓 后的利润/亏损。或者报告将是txt格式的?


请告知哪些函数或脚本可以实现它?可能有一个关于这个问题的主题--短信和电子邮件通知和报告。

https://www.mql5.com/ru/articles/1454

这里有一些类似的东西,但为了让它更简单)))


https://www.mql5.com/ru/forum/53920

短信通知的算法还不错,我们的EA向我们发送电子邮件,而电子邮件运营商向我们发送信件的文本。所有这些都非常简单。我们所需要的是注册我们的移动电话。现在更容易了。

我去看看,我发现了一个类似的函数--SendMail().我想知道它有多复杂?

所有这么长的时间都有这么一个标准。使用推送信息而不是短信,SendMail()已经发现了它。
 

大家下午好!

做了这个代码 - 一次性删除所有的订单。

//===================================================================
void delete_all_orders()
{
bool err;
int ot;
for(int iss=OrdersTotal()-1; iss>=0; iss--)
   {
    if(OrderSelect(iss, SELECT_BY_POS, MODE_TRADES))
      {
       if(OrderSymbol()==Symbol())
         {
          if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
           {
            ot=OrderTicket();
            Print("Удаляем ордер тикет - ",OrderTicket());
            err=OrderDelete(OrderTicket(),clrNONE);
            if(err==false) error(GetLastError());
            Print("Удален ордер тикет - ",ot);
           }
          if(OrderType()==OP_BUY)
           {
            ot=OrderTicket();
            Print("Удаляем ордер тикет - ",OrderTicket());
            err=OrderClose(OrderTicket(),OrderLots(),Bid,10,clrNONE);
            if(err==false) error(GetLastError());
            Print("Удален ордер тикет - ",ot);
           }
          if(OrderType()==OP_SELL)
           {
            ot=OrderTicket();
            Print("Удаляем ордер тикет - ",OrderTicket());
            err=OrderClose(OrderTicket(),OrderLots(),Ask,10,clrNONE);
            if(err==false) error(GetLastError());
            Print("Удален ордер тикет - ",ot);
           }
         }
      }
   }
return;
}

问题是,几乎所有的订单都被关闭。但我们仍有1-2个订单没有被删除。

而且无论我访问这个函数多少次,这个函数都不能关闭剩余的订单。

我得到一个错误,显示错误的价格。

我以为是重新报价,但如果我们已经请求这个功能500000次,那么重新报价可能是什么?

什么不能是错误的价格

我从来没有和其他EA发生过这样的胡闹。

 
Valerius:

大家下午好!

做了这个代码 - 一次性删除所有的订单。

问题是,几乎所有的订单都被关闭。但我们仍有1-2个订单没有被删除。

而且无论我访问这个函数多少次,这个函数都不能关闭剩余的订单。

我得到一个错误,显示错误的价格。

我以为是重新报价,但如果我们已经请求这个功能500000次,那么重新报价可能是什么?

什么不能是错误的价格?

我从来没有和其他EA发生过这样的胡闹。

如果有大量的订单,价格就有时间过时了。添加RefreshRates(),应该就可以了。
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
 
Alexey Viktorov:
如果有大量的订单,价格就有时间过时了。添加RefreshRates(),应该就可以了。

这就是问题所在:还剩下一两份订单。

我对这个函数进行了循环调用,直到所有订单被删除。

在概念上,如果是买入的订单,它应该被Bid关闭,而现在是什么价格并不重要。

它应该以任何价格按Bid收盘。

而且,如果我们已经处理了这个功能好几千次,那么无论如何,价格都应该关闭。

或者,也许我不明白什么?

 
Valerius:

这就是问题所在:还剩下一两份订单。

我对这个函数进行了循环调用,直到所有订单被删除。

理论上讲,如果是买入的订单,应该由Bid来关闭,而现在是什么价格并不重要。

它应该以任何价格按Bid收盘。

而且,如果我们已经处理了这个功能好几千次,那么无论如何,价格都应该关闭。

还是有什么是我不明白的?

删除时日志中是否有错误?

价格在周期内可以走得足够远。卖出价和买入价是常数,它们要么被强制更新(当调用RefreshRates()时),要么在处理一个新的tick时被强制更新。因此,在每个循环轮回之后,调用RefreshRates(),看看会发生什么。

 
谢谢,我会试一试的。
 
Valerius:
问题就在这里,还剩下一两份订单。
我对这个函数进行了循环调用,直到所有订单被删除。
理论上讲,如果是买入的订单,应该由Bid来关闭,此时是什么价格并不重要。
它应该以任何价格按Bid收盘。
而且,如果我们已经处理了这个功能好几千次,那么无论如何,价格都应该关闭。
或者,也许我不明白什么?

试试1)用Alert代替Print,可以立即在屏幕上看到结果--这样更快 2)你在那里得到错误代码。打印出来看看 3) 获取并打印OrderSelect函数的 错误代码,并立即打印OrderSymbol(), OpderType(), OrderTicket()。

if (! OrderSelect(.......))
{
  Alert(GetLastError());
  continue;
}
Alert("OrderSymbol = ",OrderSymbol(), "   OpderType = ", OpderType(), "   OrderTicket = ", OrderTicket());
 
STARIJ:

试试1)用Alert代替Print,以便立即在屏幕上看到结果--这样更快 2)你在那里得到错误代码。打印出来看看 3) 获取并打印OrderSelect函数的 错误代码,并立即打印OrderSymbol(), OpderType(), OrderTicket()。


也试过RefreshRates()。什么都没有改变。警报- 与打印相同,给出 - 错误的参数。

错误3。

我早上起来看到EA已经触发了,并显示了删除整晚所有订单的功能。

请求的计数器显示有几百万个请求。这意味着订单不会被删除。

这个EA还检查是否所有的订单都被删除,它就像一个保险。如果有订单,我们将调用

删减的功能是要求的。程序会被卡住。这意味着,在所有订单被删除之前,循环不会停止。

这种麻烦发生在2个货币对上。我已经失去了理智。该怎么做?

 
Valerius:


我已经试过RefreshRates()。什么都没有改变。警报--与打印相同,它说--参数错误。

错误3。

今天早上醒来,看到EA已经触发了,并且显示呼叫删除所有的订单,整整一个晚上。

请求的计数器显示有几百万个请求。这意味着订单不会被删除。

这个EA还检查是否所有的订单都被删除,它就像一个保险。如果有订单,我们将调用

删减的功能是要求的。程序会被卡住。这意味着,在所有订单被删除之前,循环不会停止。

这种麻烦发生在2个货币对上。我已经失去了理智。该怎么做?

那什么是error()函数?

            if(err==false) error(GetLastError());
            Print("Удален ордер тикет - ",ot);

这可能是问题所在。

 
Alexey Viktorov:

什么是error()函数?

有可能这就是问题所在。


error()函数只是显示一个错误代码。这个功能没有问题,我在许多EA中都有这个功能,而且我从来没有改变过它。

所以这绝对不是问题所在。

功能本身就在这里。

//====================================================================
int error(int errr)
{
string descr;
switch(errr)
  {
  // Коды ошибок, возвращаемые торговым сервером или клиентским терминалом:
  case 0:    descr= ""; return(0);
  case 1:    descr= "Нет ошибки, но результат не известен"; break;
  case 2:    descr= "Общая ошибка"; break;
  case 3:    descr= "Неправильные параметры"; break;
  case 4:    descr= "Торговый сервер занят"; break;
  case 5:    descr= "Старая версия клиентского терминала"; break;
  case 6:    descr= "Нет связи с торговым сервером"; break;
  case 7:    descr= "Недостаточно прав"; break;
  case 8:    descr= "Слишком частые запросы"; break;
  case 9:    descr= "Недопустимая операция нарушающая функционирование сервера"; break;
  case 64:   descr= "Счет заблокирован"; break;
  case 65:   descr= "Неправильный номер счета"; break;
  case 128:  descr= "Истек срок ожидания совершения сделки"; break;
  case 129:  descr= "Неправильная цена"; break;
  case 130:  descr= "Неправильные стопы"; break;
  case 131:  descr= "Неправильный объем"; break;
  case 132:  descr= "Рынок закрыт"; break;
  case 133:  descr= "Торговля запрещена"; break;
  case 134:  descr= "Недостаточно денег для совершения операции"; break;
  case 135:  descr= "Цена изменилась"; break;
  case 136:  descr= "Нет цен"; break;
  case 137:  descr= "Брокер занят"; break;
  case 138:  descr= "Новые цены"; break;
  case 139:  descr= "Ордер заблокирован и уже обрабатывается"; break;
  case 140:  descr= "Разрешена только покупка"; break;
  case 141:  descr= "Слишком много запросов"; break;
  case 145:  descr= "Модификация запрещена, так как ордер слишком близок к рынку"; break;
  case 146:  descr= "Подсистема торговли занята"; break;
  case 147:  descr= "Использование даты истечения ордера запрещено брокером"; break;
  case 148:  descr= "Количество открытых и отложенных ордеров достигло предела, установленного брокером"; break;
  case 149:  descr= "Попытка открыть противоположную позицию к уже существующей, если хеджирование запрещено"; break;
  case 150:  descr= "Попытка закрыть позицию по инструменту в противоречии с правилом FIFO"; break;
  case 4000: /*descr= "Нет ошибки";*/ return(0);
  case 4001: descr= "Неправильный указатель функции"; break;
  case 4002: descr= "Индекс массива - вне диапазона"; break;
  case 4003: descr= "Нет памяти для стека функций"; break;
  case 4004: descr= "Переполнение стека после рекурсивного вызова"; break;
  case 4005: descr= "На стеке нет памяти для передачи параметров"; break;
  case 4006: descr= "Нет памяти для строкового параметра"; break;
  case 4007: descr= "Нет памяти для временной строки"; break;
  case 4008: descr= "Неинициализированная строка"; break;
  case 4009: descr= "Неинициализированная строка в массиве"; break;
  case 4010: descr= "Нет памяти для строкового массива"; break;
  case 4011: descr= "Слишком длинная строка"; break;
  case 4012: descr= "Остаток от деления на ноль"; break;
  case 4013: descr= "Деление на ноль"; break;
  case 4014: descr= "Неизвестная команда"; break;
  case 4015: descr= "Неправильный переход"; break;
  case 4016: descr= "Неинициализированный массив"; break;
  case 4017: descr= "Вызовы DLL не разрешены"; break;
  case 4018: descr= "Невозможно загрузить библиотеку"; break;
  case 4019: descr= "Невозможно вызвать функцию"; break;
  case 4020: descr= "Вызовы внешних библиотечных функций не разрешены"; break;
  case 4021: descr= "Недостаточно памяти для строки, возвращаемой из функции"; break;
  case 4022: descr= "Система занята"; break;
  case 4050: descr= "Неправильное количество параметров функции"; break;
  case 4051: descr= "Недопустимое значение параметра функции"; break;
  case 4052: descr= "Внутренняя ошибка строковой функции"; break;
  case 4053: descr= "Ошибка массива"; break;
  case 4054: descr= "Неправильное использование массива-таймсерии"; break;
  case 4055: descr= "Ошибка пользовательского индикатора"; break;
  case 4056: descr= "Массивы несовместимы"; break;
  case 4057: descr= "Ошибка обработки глобальныех переменных"; break;
  case 4058: descr= "Глобальная переменная не обнаружена"; break;
  case 4059: descr= "Функция не разрешена в тестовом режиме"; break;
  case 4060: descr= "Функция не подтверждена"; break;
  case 4061: descr= "Ошибка отправки почты"; break;
  case 4062: descr= "Ожидается параметр типа string"; break;
  case 4063: descr= "Ожидается параметр типа integer"; break;
  case 4064: descr= "Ожидается параметр типа double"; break;
  case 4065: descr= "В качестве параметра ожидается массив"; break;
  case 4066: descr= "Запрошенные исторические данные в состоянии обновления"; break;
  case 4099: descr= "Конец файла"; break;
  case 4100: descr= "Ошибка при работе с файлом"; break;
  case 4101: descr= "Неправильное имя файла"; break;
  case 4102: descr= "Слишком много открытых файлов"; break;
  case 4103: descr= "Невозможно открыть файл"; break;
  case 4104: descr= "Несовместимый режим доступа к файлу"; break;
  case 4105: descr= "Ни один ордер не выбран"; break;
  case 4106: descr= "Неизвестный символ"; break;
  case 4107: descr= "Неправильный параметр цены для торговой функции"; break;
  case 4108: descr= "Неверный номер тикета"; break;
  case 4109: descr= "Торговля не разрешена"; break;
  case 4110: descr= "Длинные позиции не разрешены"; break;
  case 4111: descr= "Короткие позиции не разрешены"; break;
  case 4200: descr= "Объект уже существует"; break;
  case 4201: descr= "Запрошено неизвестное свойство объекта"; break;
  case 4202: descr= "Объект не существует"; break;
  case 4203: descr= "Неизвестный тип объекта"; break;
  case 4204: descr= "Нет имени объекта"; break;
  case 4205: descr= "Ошибка координат объекта"; break;
  case 4206: descr= "Не найдено указанное подокно"; break;
  case 4207: descr= "Ошибка при работе с объектом"; break;
  }
Comment("Ошибка!  ",descr); 
Print("Ошибка!  ",descr);
return(errr);
}     
原因: