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

 
Kairoser:

こんにちは。

420リリースにアップグレードした後、私は自分のEAをテストし始め、それが何らかの理由で「負ける」ようになったことに気づきました。自分のトレードを分析したところ、存在しない価格でストップロスが発動していることに気づきました。例えば、EURUSDでストップロスを1.06520に設定しましたが、最大価格は 1.05920ですが、動作しています。さらに見ていくと、そんな案件がたくさんあるんです。テイクプロフィットは、同じ原理で(存在しない価格で)トリガーされます - デルタは同じです - 600ポイントです。チャート上のテスターでは、上下の矢印はバーから遠く離れた宙に「ぶら下がって」います。

スクリーンショットを添付します。

MetaQuotes-Demoでテストしてください。アルパリは(スプレッドでの)チャート履歴があからさまに間違っている。
 
Renat:
MetaQuotes-Demoのテストを実行してください。アルパリは(スプレッドでの)チャート履歴があからさまに間違っている。
はい、確かにMetaQuotes-Demoサーバーではすべて正常に動作しています。ありがとうございました。
 

いくつか気になる質問があります。

1.ストラテジーテスターでインジケーターを使用した場合、どのように動作するのでしょうか?まず、ハンドルが計算されるすべてのインジケータが起動し、OnTickだけが起動する?

2.もしそうなら、まずOnTickを起動して、付属のインジケータを計算するコマンドを実行するとよいでしょう。そのため、例えば5桁のティックごとに指標を計算する必要はなく、4桁のティックのみ計算すればよいのです。OnTickを起動したら、現在値と前回値を確認して、指標の 計算を開始するかどうか判断しています。

なぜなら、数が多くてかなり「重い」場合、最適化モードでリソースを消費してしまうから...。

ただし、ontickでハンドルを作成し、最後にインジケータを削除して、次のontickの開始時に(必要なら)ハンドルを作成し直すという方法もありますが、パフォーマンスが向上するかどうかは不明です......。

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
olyakish:

いくつか気になる質問があります。

1.ストラテジーテスターで インジケーターを使用した場合、どのように動作するのでしょうか?まず、ハンドルが計算されるすべてのインディケータが実行され、その後OnTickが実行されるだけですか?

より一般的な回答として、すべての指標は、イベントハンドラを呼び出す前に計算されます。

  • オンティック
  • オンタイマー
  • OnChartEvent など
 
olyakish:
2.もしそうなら、まずOnTickを実行し、その後このコマンドで付属のインジケータの計算を実行すると非常に便利です。例えば、5桁のティックごとに指標を計算する必要はなく、4桁のティックにのみ指標を計算したいのです。OnTickを起動するときに、現在と前回の価格をチェックして、指標の 計算を開始するかどうかを判断しています。

なぜなら、数が多くてかなり「重い」場合、最適化モードでリソースを食ってしまうから......。

そんなの無理だよ。テスト用に、より高速なティック生成モードを使用することができます。

  1. 分足でのOHLC価格
  2. テスト対象期間の建値のみ
 
Rosh:

このままではダメだ。テスト用に、より高速なティック生成 モードを使用することができます。

  1. 分足でのOHLC価格
  2. テスト期間中の始値のみ
そういうモードやクセは知っています。ただ、合理的な(おそらく最適な)方法で最適化をスピードアップさせたかったのです。
 

ヘルプ、データ変換 関数が動作したくない、それをテストするために簡単なスクリプトを書きました。Build 420、64ビットOS。

void OnStart()
  {
//---
   int i=0;
   bool res=false;
   string stroka1;
   string stroka2;
   string stroka3;
   string stroka4;
   string stroka5;

   datetime buf1;
   double   buf2;
   double   buf3;
   double   buf4;
   double   buf5;
   
   int filehandle=FileOpen("56451.csv",FILE_READ|FILE_CSV|FILE_ANSI,',',CP_UTF8);

   if(filehandle==INVALID_HANDLE)Print("Ошибка № - ",GetLastError());
   else
     {

      while(!res)
        {
         stroka1 = FileReadString(filehandle);
         stroka2 = FileReadString(filehandle);
         stroka3 = FileReadString(filehandle);
         stroka4 = FileReadString(filehandle);
         stroka5 = FileReadString(filehandle);

         buf1 = StringToTime(stroka1);
         buf2 = StringToDouble(stroka2);
         buf3 = StringToDouble(stroka3);
         buf4 = StringToDouble(stroka4);
         buf5 = StringToDouble(stroka5);

         res=FileIsEnding(filehandle);
         i++;
        }
      FileClose(filehandle);
     }
  }
//+------------------------------------------------------------------+
ファイル:
56451.zip  16 kb
 
sergey1294:

ヘルプ、データ変換関数が動作したくない、それをテストするために簡単なスクリプトを書きました。Build 420、64ビットOS。


どの段階でも引用を排除する...。
 
AlexSTAL:
どの段階でも倒置カンマを取り除く...。
どうやるんですか?
 
sergey1294:
どうやるんですか?

ファイル内に初期状態では存在しないようにするか、読み込み時に追加関数を適用するなどしてください。

string StringWithoutQuotes(string Value)
{
   StringTrimLeft(Value);
   StringTrimRight(Value);
   return(StringSubstr(Value, 1, StringLen(Value) - 2));
}

..........

         stroka1 = StringWithoutQuotes(FileReadString(filehandle));
         stroka2 = StringWithoutQuotes(FileReadString(filehandle));