エラー、バグ、質問 - ページ 1153

 
joo:
フォーラムの投稿にある動画が再生されません。動画の代わりに空白のスペースがあります。
youtubeサイトでは正常に動画が再生され、他のyoutubeサイトでは動画が再生されるのですが・・・。
確認しよう。
 
Renat:
Windows 8.1にインストールしたプログラムを実行するにはどうすればよいですか?ポータブルで?
いいえ、普段は/portableなしで動かしています。それだけでなく、念のため、MT5のインストールとアンインストールを2回行いました。デインストール後、AppDataのフォルダも 手動で削除しました。
 

Windows 8.1で通常のユーザーとして作業する場合、MT5端末が入力された口座番号を記憶しない。また、MetaEditorは、MQL5 Storageの 状態を保存しません。管理者として作業するか、metaeditor64.exeおよびterminal64.exeのファイルのプロパティで「管理者としてこのプログラムを実行する」が選択されている場合のみ、修正することが可能です。

しかし、この場合、通常のユーザーアカウントで実行すると、管理者のパスワードを入力しなければならないのですが、セキュリティの問題を考えると、これは正しいのでしょうか?

P.S. 端末は最新ですが、問題は新しいものではありません。


 

こんにちは。

私はかなりリソースを消費するインジケータ(7つ以上の配列から計算される)を持っています、それはターミナルで「断続的に」だけ正常にロードします、私は何の理由かわかりません。エラーは出ていませんので、MT5ターミナル自体の問題かと...。

テスターでテストしたいのですが、テスターではエラーが出続けています:スクリーンショットを添付します。

アドバイスお願い します。テスターの起動前にエラー処理を行い、エラーが出た場合はテスターで強制的にインジケーターを再読み込みすることは可能でしょうか?

 
M1k3:

こんにちは。

私はかなりリソースを消費するインジケータ(7つ以上の配列から計算される)を持っています、それはターミナルで「断続的に」だけ正常にロードします、私は何の理由かわかりません。エラーは出ていませんので、MT5ターミナル自体の問題かと...。

テスターでテストしたいのですが、テスターではエラーが出続けています:スクリーンショットを添付しました。

アドバイスをお願い します。テスターの起動前にエラーを処理し、エラーが出た場合はテスターで強制的にインジケータを再読み込みする方法はありますか?

.

エラーはあなたのコードにあり、ターミナルにあるものではありません。このエラーは、配列が範囲外であることを示すものです。例えば、サイズが[4]の配列があり、値[5]を取得しようとしているとします。
 
barabashkakvn:
エラーはあなたのコードにあり、ターミナルにあるものではありません。このエラーは、配列がその範囲から外れることです。例えば、サイズが[4]の配列があり、値[5]を取得しようとしているとします。

配列が引用符(100%)やインジケータ値で埋め尽くされてしまい、修正できません。ターミナルで、ある瞬間に相場や指標Xの値がNULLで出力され、別の瞬間に通常の値(0本目ではない)が出力される。なぜそうなるのかはわかりません。

テスターでは常にNULL値が存在します。気配値やインジケーターの値を掛けようとするとエラーが発生しますが、そこはNULLです。

 
M1k3:

配列が引用符(100%)やインジケータ値で埋め尽くされてしまい、修正できません。ターミナルで、ある瞬間に引用符Xの値がNULLになり、別の瞬間には正常な値(0本目のバーではない)になります。なぜそうなるのかはわかりません。

テスターでは常にNULL値が存在します。気配値やインジケーターの値を掛けようとするとエラーが発生しますが、そこはNULLです。

コードデバッグを行うか、疑わしいコード部分にPrint() 演算子を挿入してください。こうすることで、どこにエラーがあるのかを理解することができます。
 
barabashkakvn:

このコードは、インジケータとOnInit()関数のコードです。したがって、OnInit()はターミナル起動時に処理され、このコードは正しくtick priceを表示します。 OnInit() であり init() ではありません。 もしエラーが繰り返される場合は、コードとターミナルのバージョンを送ってください。

OnInit()でマーケット情報(MarketInfo...)をインジケータから 受信しようとしていることがエラーになっています。このインジケータは取引機能を持たないため、初期化中は口座情報や相場情報の更新を待つことはありません。

マーケットデータを取得するには、インジケーターではなくEAの OnInit()を使用します。

相場情報をインジケーターで使用する場合は、初回実行の場合はOnCalculate()関数で、タイムフレームやインジケーターの設定を変更した場合はOnInit()で、フラグ(bool)を入力して口座情報(Account...)が正しいか確認する必要があります。

人を惑わさないこと。インジケーターのinit()またはOnInit()のいずれを使用するかにかかわらず、ターミナルは、ログインがすでに実行され、ティック値がわかっているときにこのハンドラを呼び出すことを保証するものではありません。だからOnInitでも簡単にゼロになる。また、指標に市場情報を使用することも禁止されていません。しかし、この場合、本当に初期化をインジケータの計算部分に移し、最初のティックで実行しなければなりません。
 
marketeer:
人を惑わさないこと。インジケーターのinit()、OnInit()に関わらず、ログインが完了し、ティック値が判明した時点でこのハンドラが呼ばれることは端末では保証されていません。だからOnInitでも簡単にゼロになる。また、指標に市場情報を使用することも禁止されていません。しかし、この場合、本当に初期化をインジケータの計算部分に移し、最初のティックで実行しなければなりません。

インジケータにトレーディング機能はありません。Expert Advisor はトレード機能を備えています。したがって、EAがマーケット環境および/または口座情報を 呼び出すとき、OnInit()ですべてが正しく行われます。

その証拠に、OnInit()で取引環境と口座情報を参照する簡単なEAを紹介します。

//+------------------------------------------------------------------+
//|                                                  test_expert.mq4 |
//|                              Copyright © 2014, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  //--- выведем всю информацию, доступную из функции AccountInfoDouble()
      printf("ACCOUNT_BALANCE =  %G",AccountInfoDouble(ACCOUNT_BALANCE));
      printf("ACCOUNT_CREDIT =  %G",AccountInfoDouble(ACCOUNT_CREDIT));
      printf("ACCOUNT_PROFIT =  %G",AccountInfoDouble(ACCOUNT_PROFIT));
      printf("ACCOUNT_EQUITY =  %G",AccountInfoDouble(ACCOUNT_EQUITY));
      printf("ACCOUNT_MARGIN =  %G",AccountInfoDouble(ACCOUNT_MARGIN));
      printf("ACCOUNT_FREEMARGIN =  %G",AccountInfoDouble(ACCOUNT_FREEMARGIN));
      printf("ACCOUNT_MARGIN_LEVEL =  %G",AccountInfoDouble(ACCOUNT_MARGIN_LEVEL));
      printf("ACCOUNT_MARGIN_SO_CALL = %G",AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL));
      printf("ACCOUNT_MARGIN_SO_SO = %G",AccountInfoDouble(ACCOUNT_MARGIN_SO_SO));
      //--- MarketInfo
      Print("Symbol=",Symbol());
      Print("Минимальная дневная цена=",MarketInfo(Symbol(),MODE_LOW));
      Print("Максимальная дневная цена=",MarketInfo(Symbol(),MODE_HIGH));
      Print("Время поступления последней котировки=",(MarketInfo(Symbol(),MODE_TIME)));
      Print("Последняя поступившая цена предложения=",MarketInfo(Symbol(),MODE_BID));
      Print("Последняя поступившая цена продажи=",MarketInfo(Symbol(),MODE_ASK));
      Print("Размер пункта в валюте котировки=",MarketInfo(Symbol(),MODE_POINT));
      Print("Количество цифр после запятой в цене инструмента=",MarketInfo(Symbol(),MODE_DIGITS));
      Print("Спрэд в пунктах=",MarketInfo(Symbol(),MODE_SPREAD));
      Print("Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах=",MarketInfo(Symbol(),MODE_STOPLEVEL));
      Print("Размер контракта в базовой валюте инструмента=",MarketInfo(Symbol(),MODE_LOTSIZE));
      Print("Размер минимального изменения цены инструмента в валюте депозита=",MarketInfo(Symbol(),MODE_TICKVALUE));
      Print("Минимальный шаг изменения цены инструмента в пунктах=",MarketInfo(Symbol(),MODE_TICKSIZE));
      Print("Размер свопа для ордеров на покупку=",MarketInfo(Symbol(),MODE_SWAPLONG));
      Print("Размер свопа для ордеров на продажу=",MarketInfo(Symbol(),MODE_SWAPSHORT));
      Print("Календарная дата начала торгов (фьючерсы)=",MarketInfo(Symbol(),MODE_STARTING));
      Print("Календарная дата окончания торгов (фьючерсы)=",MarketInfo(Symbol(),MODE_EXPIRATION));
      Print("Разрешение торгов по указанному инструменту=",MarketInfo(Symbol(),MODE_TRADEALLOWED));
      Print("Минимальный размер лота=",MarketInfo(Symbol(),MODE_MINLOT));
      Print("Шаг изменения размера лота=",MarketInfo(Symbol(),MODE_LOTSTEP));
      Print("Максимальный размер лота=",MarketInfo(Symbol(),MODE_MAXLOT));
      Print("Метод вычисления свопов=",MarketInfo(Symbol(),MODE_SWAPTYPE));
      Print("Способ расчета прибыли=",MarketInfo(Symbol(),MODE_PROFITCALCMODE));
      Print("Способ расчета залоговых средств=",MarketInfo(Symbol(),MODE_MARGINCALCMODE));
      Print("Начальные залоговые требования для 1 лота=",MarketInfo(Symbol(),MODE_MARGININIT));
      Print("Размер залоговых средств для поддержки открытых ордеров в расчете на 1 лот=",MarketInfo(Symbol(),MODE_MARGINMAINTENANCE));
      Print("Маржа, взимаемая с перекрытых ордеров в расчете на 1 лот=",MarketInfo(Symbol(),MODE_MARGINHEDGED));
      Print("Размер свободных средств, необходимых для открытия 1 лота на покупку=",MarketInfo(Symbol(),MODE_MARGINREQUIRED));
      Print("Уровень заморозки ордеров в пунктах=",MarketInfo(Symbol(),MODE_FREEZELEVEL)); 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
ファイル:
 
barabashkakvn:

インジケータにトレーディング機能はありません。Expert Advisor はトレード機能を備えています。したがって、EAがマーケット環境および/または口座情報を 呼び出すとき、OnInit()ですべてが正しく行われます。

私の言葉を証明するために、OnInit()でマーケット環境と口座情報を呼び出す簡単なExpert Advisorを紹介します。

まあ、もともとはインジケーターについての質問だったんですけどね。そして、インジケーターのOnInitについて回答していましたね。Expert Advisorは別の問題で、問題はありませんが、Expert Advisorはインジケータに代わるものではありません。