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

 
Ivan_Invanov:
一般的に、あなたの回答から判断すると、あなたはプログラムの仕組みをよく理解していないようです。だから、バカな質問だと思われるんです。前のコメント者が思っているように、止まってしまうのです。ただ、他の言語でのプログラミング経験から、ループで本体を実行し、イベントが来たらそれに飛び込んでいくのだと思います。もし、プログラム本体がループで実行されるのであれば、なぜそのような書き方になって いるのかが分かります。

new tick "イベントが発生すると、OnTick()ハンドラでプログラムが起動し、完了まで実行され、停止します。新しいティックの登場により、すべてが最初から繰り返される。プログラム実行中に新しいtickが来て、プログラムが前のtickの処理を終えていない(まだ実行中)場合、このtickはスキップされます。

MQLのプログラムはループしません。OnInit()、OnDeinit()、OnTick()の3つのエントリポイントがあります。

起動時にOnInit()、ティック受信時に-OnTick()、動作終了時に-OnDeinit()が実行されます。

他にもハンドラーはあります。でも、ここで誰かに複製を頼むくらいなら、ヘルプを 開いた方がいい。

Документация по MQL5: Программы MQL5
Документация по MQL5: Программы MQL5
  • www.mql5.com
Для того чтобы mql5-программа могла работать, она должна быть скомпилирована (кнопка "Компилировать" или клавиша F7). Компиляция должна пройти без ошибок (допускаются предупреждения, которые необходимо проанализировать). При этом в соответствующей директории Эксперты, пользовательские индикаторы и скрипты прикрепляются к одному из открытых...
 

こんにちは。インジケーターを作成中に、ターミナルを再起動するとバグが発生することを発見しました。このバグを元に、テスト用の小さなソースコードを作りました。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

class Loader {
private:
  string symbol;
  ENUM_TIMEFRAMES timeframe;

public:  
  Loader(): symbol(Symbol()), timeframe(Period()) 
  {
    Print(__FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString(timeframe));
    ResetLastError();
    Print(__FUNCTION__ + " bars: " + (string)iBars(symbol, timeframe)); // Данный вызов iBars() даёт 0 при перезапуске терминала
    Print(__FUNCTION__ + " Error: " + (string)GetLastError());
    Print(__FUNCTION__ + " bars (2): " + (string)iBars(Symbol(), Period())); // Этот же вызов iBars() работает нормально
  }
};

Loader * loader;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
  loader = new Loader();
//---
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
  delete loader;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]
) {
  return(rates_total);
}

この例がチャート上に投げられた場合(あるいはシステム起動後の最初の端末起動の 場合)、すべて正常に動作します。ログには次のように書かれています。

2020.06.24 21:05:50.773 Loader::Loader symbol: EURUSD timeframe: PERIOD_H1

2020.06.24 21:05:50.773 ローダー::ローダーバー: 140433

2020.06.24 21:05:50.773 Loader::Loader Error: 0

2020.06.24 21:05:50.773 ローダー::ローダーバー (2): 140433


しかし、このインジケータでターミナルを再起動すると、エラーが発生します。

2020.06.24 21:07:34.963 ローダー::Loader シンボル: EURUSD タイムフレーム: PERIOD_H1

2020.06.24 21:07:34.963 Loader::Loader bars::0

2020.06.24 21:07:34.963 Loader::Loader Error: 4401

2020.06.24 21:07:34.964 ローダー::ローダーバー (2): 140433

シンボルとタイムフレームの初期化OK

2020.06.24 21:07:34.963 ローダー::Loader シンボル: EURUSD タイムフレーム: PERIOD_H1

しかし、iBars(symbol, timeframe)はなぜか0を表示します。

2020.06.24 21:07:34.963 Loader::Loader bars::0

この場合、エラー4401が表示されます。

しかし、iBars(Symbol(), Period())は問題なく動作します。

2020.06.24 21:07:34.964 ローダー::ローダーバー (2): 140433

ログメッセージによると、少なくともsymbol = Symbol()とtimeframe = Period()です(端末が再起動するラグ中も)。iBars(Symbol, Timeframe)はシンボルとタイムフレームが完全に正しいのに、iBars(Symbol(), Period())はうまくいっているのに、ログによるとパラメータが同じなのにどうしてゼロになるのでしょうか?

Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
  • www.metatrader5.com
По завершении установки в меню "Пуск" создается группа программ торговой платформы, а на рабочем столе дополнительно помещается ярлык программы. Используйте их для запуска. Нельзя запускать одновременно две копии платформы из одной директории. Чтобы одновременно запустить несколько копий, установите соответствующее количество программ в разные...
ファイル:
Test.mq5  7 kb
 
このスレの司会者を知っている人はいますか?
 

MetaQuotes DemoでMT4デモ口座を開設するにはどうすればよいですか?以前は問題なく動作していましたが、現在はダイアログの最後のページで「登録、少し待ってください」と表示され、この状態ではいつまでもアイドル状態で、ログインとパスワードのフィールドが空のままになっています。ログにメッセージはありません。デモ」と「リアル」、様々な種類のアカウントを試した。

UPD あるブローカーのデモを試しましたが、同じでした。

 
Artyom Trishkin:

new tick "イベントが発生すると、OnTick()ハンドラでプログラムが起動し、完了まで実行され、停止します。新しいティックの登場により、すべてが最初から繰り返される。プログラム実行中に新しいtickが来て、プログラムが前のtickの処理を終えていない(まだ実行中)場合、このtickはスキップされます。

MQLのプログラムはループしません。OnInit()、OnDeinit()、OnTick()の3つのエントリポイントがあります。

起動時にOnInit()、ティック受信時に-OnTick()、動作終了時に-OnDeinit()が実行されます。

他にもハンドラーはあります。でも、ここで誰かに複製を頼むくらいなら、ヘルプを 開いた方がいい。

ありがとうございます。はい、それは理解しています。ただ、その関数はプログラム本体に書かれているのです。どこかで呼ばれているのに気づかなかったのかもしれません。
 
Ivan_Invanov:
ありがとうございます。はい、それは理解しています。ただ、その関数はプログラム本体に書かれているのです。どこかで呼ばれているのに気づかなかったのかもしれません。

どうすれば、あなたの言っていることがわかるのでしょうか?例を挙げてください。

 
Artyom Trishkin:

どうすれば、あなたの言っていることがわかるのでしょうか?例を挙げてください。

そうです、私はその呼び出しに気づきませんでした。今調べたら、それは取引を開く関数から呼び出さ れたものでした。
 
Ivan_Invanov:
ありがとうございます。はい、わかりました!ただ、関数がプログラム本体に書かれているんですね。たぶん、どこかで募集を見落としたに違いない。

mql4では、関数はどのような順番で書かれても問題ありませんし、上でも下でも問題ありません。C++では、すべての関数が記述順にしか動作せず、呼び出す場合は呼び出し先の前に定義しておかないとプログラムがクラッシュしてしまうというようなことはない。その人は関数の書き方を順番に教えてくれたけど、C++でどうやるかは覚えてないんだ。

 
Ivan_Invanov:

ごあいさつよろしくお願いします。こんな疑問があります。私の理解は正しいでしょうか。プログラムは最初から最後まで実行されますが、あるイベント(例えばティック)が発生すると停止し、ontick関数が 実行を開始し、その後実行を終了して再び最初から実行されるのでしょうか。この質問は、例えば取引ロットの大きさをプログラム本体やontick関数のどこに書けばいいのか、ということに関連しています。

端末の例である公式botを見ると、プログラム本体で多くの計算が行われており、なぜそうなるのか理解できない。

私のロットはこのように計算されます。

#property link      "http://www.mql5.com"
input double CheckLots = 0.01;
input int    Persent   = 5;
   double Lots=NormalizeDouble(AccountBalance()*CheckLots/1000-0.005,2);  

Expert Advisorの先頭にある...そして、コードの一番最後に置いた。

OnTick関数がLots変数を呼び出すと、EAがそれを見つけて再計算します。

 

アルチョム・トリシキン

このスレのモデレーターはあなたですか?