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

 
Urain:

OnTester()関数の 強制終了はありますか?

あるいは、なぜカスタム関数の前のトランザクションの履歴が存在し、その後ゼロを返すのか :

double OnTester()
  {
   int HTD=-1;
   Custom_func();
   if(HistorySelect(0,TimeCurrent()))HTD=HistoryDealsTotal();   
   return(HTD);
  }

テスターで動作しない機能は何ですか?

テスターは(最適化中に)どのように外部に何かが間違っていることを知らせることができますか(印刷の警告、何も動作しない)?

どうやら今夜はみんな寝ているようだ。
 
Urain:
どうやら今日はみんな寝ているようだ。

エージェントログをご覧になりましたか?もしかしたら、すべて揃っているかもしれません。

私の知る限り、テスターのメインログにプリンターが表示されないのは最適化の時だけです(通常モードではすべて問題ありません)。

OnTester()では、私の理解では、強制終了することはできません。しかも、単にあるテスト結果を算出するだけ(しかも、本来は最適化のためにしか使わない)?

OnTester です。
OnTester()関数は、指定された日付間隔でのExpert Advisorのヒストリカルテストの終了時に自動的に生成されるテスターイベントハンドラ です。この関数は double 型で定義する必要があり、パラメータを持ちません。

doubleOnTester()。

この関数は OnDeinit() の直前に呼び出され、戻り値は double 型である。OnTester()関数は、テスト中のエキスパートだけが使用できます。 その主な目的は、入力パラメータの遺伝的最適化でCustom max基準として使用されるいくつかの値を計算することです。


追記

> なぜカスタム関数の前は取引履歴が表示されるのに、それ以降はゼロになるのですか...。

これは開発者への質問かもしれませんね。

私が理解する限り、OnTesterは(あれば)取引数を返さなければならず、Custom_func()はカスタム関数として理解されるのでしょうか。

 
Urain:

開発者に捧ぐ ...

今まで原則不可能だった機会を与えるのであれば、少なくともあなた方は警告するはずだ。

このバグを捕まえるのに、24時間を無駄にした。

もちろん、それはわかっているのですが、このままでは24時間を無駄にしてしまいます。

コンパイラでエラーになるのは慣れている。

正しいやり方とは?は"=="なのか、それとも"="なのか?
 
Urain:

OnTester()関数の 強制終了はありますか?

あるいは、なぜカスタム関数の前のトランザクションの履歴が存在し、その後ゼロを返すのか :

テスターで動作しない機能は何ですか?

テスターから(最適化中に)何か問題があることを外部に知らせるにはどうしたらよいでしょうか(何も動作しないアラートを表示する)?

メッセージをありがとうございました。応募を受け付けました - 対応中です。

 

新規にポジションを建てる際の証拠金による最大許容ロットはどのように計算するのですか?MQL4では、以下のように行われました。

MaxLot=AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 
EvgeTrofi:

新規にポジションを建てる際の証拠金による最大許容ロットはどのように算出するのですか?MQL4では、このように行われていました。

おおよそこのような感じです。

double CalculateMaxVolume(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))                return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                            return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
このコードは、最大ボリュームを 計算するだけでなく、シンボル設定の範囲内に正確に収まるようにしています。
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
Renat:

こんな感じです。

このコードは、最大体積を 計算するだけでなく、文字設定の範囲内にぴったりと収まるようにしています。
ありがとうございました。ヘルプにOrderCalcMargin()がないのですが... :)
 
EvgeTrofi:
ありがとうございました。ヘルプにOrderCalcMargin() がないのですが... :)
この機能はかなり前に追加されたものです。
 
EvgeTrofi:
では、結局何が正しいのでしょうか?は"=="なのか、それとも"="なのか?

どっちでもいい。

if(a==0){expression} は a が 0 ならば真なので {expression} を実行するという意味です。

if(a=0){expression} equals if(a){a=0;expression}.が真であれば、{a=0;式}となる。

 
Interesting:

エージェントログをご覧になりましたか?もしかしたら、すべて揃っているかもしれません。

私の知る限り、テスターのメインログにプリンターが表示されないのは最適化の時だけです(通常モードではすべて問題ありません)。

私の理解しているOnTester()では、強制終了することはできません。そして、何のために、それは単に特定のテスト結果(実際には最適化のためにのみ使用される)を計算 するのですか?

追記

> なぜカスタム関数以前の取引履歴が存在し、それ以降はゼロを出すのか......。

おそらく、これは開発者の問題なのでしょう。

私が理解する限り、OnTesterは 案件の数(もしあれば)を返すべきで、カスタム関数はCustom_func()ですか?

問題は、最適化そのものが、他の状況のようにプログラムが動作しないことです(そのため、OnTesterの 下からメッセージを送る必要があるのです)。

そのために、アナログプリント(関数にパラメータとして渡された文字列を印刷するためにファイルを作成する関数)を考案しました。

int prints=0;// счётчик вызовов, должен быть обьявлен глобально
//+------------------------------------------------------------------+
//| вывод информации из под тестера                                  |
//+------------------------------------------------------------------+
void WriteFilePrint(string text,string folder="Print")
  {
   string subfolder="Print";
   int han=FileOpen(subfolder+"\\"+folder+(string)prints+".csv",FILE_WRITE|FILE_CSV,";");
   if(han!=INVALID_HANDLE)
     {
      FileWrite(han,text);
      FileClose(han);
     }
   else Print("File open failed"+subfolder+"\\"+folder+".txt, error",GetLastError());
   prints++;
  }

こうして、OnTesterの いくつかの関数の不正な実行をキャッチすることに成功しました。