MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 212

 
geratdc:

こんにちは。


以下の情報を探しています。

1. Expert Advisor の作業における重要なイベントを処理する際の SMS 通知の実装について。

12-00 PSTから18-00 PSTまでの取引開始と終了の実現について(もちろん、毎週の取引セッションの開始と終了についてのSMS通知もあります)。

取引完了後のメール通知の実装について(18-00 PTN) - テスターで、1週間の取引セッションのアドバイザーの作業に関するレポートを、グラフと開始日、終了日、価格、ポジション終了 後の利益/損失の表示で送信します。それとも、レポートはtxt形式になるのでしょうか?


どのような関数やスクリプトで実現できるのか、教えてください。SMSや電子メールでの通知やレポートなど、それに関するトピックがあるかもしれません。

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

こんな感じですが、よりシンプルにするために)))


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

sms通知のアルゴリズムは悪くなく、私たちのEAはメールを送り、メールオペレーターは手紙のテキストを送ります。すべて見事にシンプルです。必要なのは、携帯電話の登録だけ。楽になりましたね。

私は読んできます、私は似たような関数を見つけた - SendMail().私はそれがどのように複雑なのだろうか?

昔はすべてこのような規格がありました。SMSの代わりにプッシュメッセージを使用し、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件の注文が削除されないで残っています。

また、この関数に何度アクセスしても、この関数が残りの注文をクローズすることはない。

価格が間違っているというエラーが表示される。

私はrequoteだと思ったのですが、もしこの機能をすでに500000回リクエストしていたら、requoteは何でしょうか?

間違った価格 であってはならないこととは?

他のEAでこのような無意味なことをしたことはない。

 
Valerius:

皆さん、こんにちは。

このコードを作った - すべての注文を一度に削除します。

問題は、ほとんどすべての注文が締め切られていることです。しかし、まだ1-2件の注文が削除されないで残っています。

また、この関数に何度アクセスしても、この関数が残りの注文をクローズすることはない。

価格が間違っているというエラーが表示される。

私はrequoteだと思ったのですが、もしこの機能をすでに500000回リクエストしていたら、requoteは何でしょうか?

間違った価格であってはならないこととは?

他のEAでこのような無意味なことをしたことはない。

注文が多い場合は、価格が古くなる時間があります。RefreshRates() を追加すればOKのはず。
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
 
Alexey Viktorov:
注文が多い場合は、価格が古くなる時間があります。RefreshRates() を追加すれば問題ないはずです。

それが、注文が1~2件残っているのです。

すべての注文が削除されるまで、この関数を何度も呼び出すようにしました。

考え方としては、買い注文であればBidで決済されるべきで、今の値段は関係ない。

いくらなんでもBidで閉めるべき。

そして、この機能に何千回も対処していれば、いずれにせよ価格は下がるはずです。

それとも、私が何か理解していないのでしょうか?

 
Valerius:

それが、注文が1~2件残っているのです。

すべての注文が削除されるまで、この関数を何度も呼び出すようにしました。

理論的には、買いの注文であればBidで決済されるはずで、今の価格は関係ない。

いくらなんでもBidで閉めるべき。

そして、この機能に何千回も対処していれば、いずれにせよ価格は下がるはずです。

それとも、私が理解していないことがあるのでしょうか。

削除の際、ログにエラーは出ていませんか?

価格はサイクル中に十分に行くことができます。AskとBidは、強制的に(RefreshRates()を呼び出したときに)または新しいティックを処理するときに更新される定数です。そこで、ループが1回転するごとにRefreshRates()を呼び出して、何が起こるか見てみましょう。

 
ありがとうございます、試してみます。
 
Valerius:
それが、注文が残り1、2個なんですよ。
すべての注文が削除されるまで、この関数を呼び出すループを作りました。
理論的には、買い注文であればBidで決済されるはずで、その瞬間の価格は関係ない。
いくらなんでもBidで閉めるべき。
そして、この機能に何千回も対処していれば、いずれにせよ価格は下がるはずです。
それとも、私が何か理解していないのでしょうか?

試しに1)Printを Alertに置き換えると、結果がすぐに画面に表示されます - その方が速い 2)そこにエラーコードが 表示されます。印刷して見る 3)OrderSelect関数の エラーコードを 取得して印刷し、すぐにOrderSymbol()、OpderType()、OrderTicket()

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

試しに1) PrintをAlertに置き換えると、結果がすぐに画面に表示されます - その方が速い 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);
}     
理由: