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

 
-Alexey-:
なぜ「開始」ボタンを押すと、最初の入金レベルからではなく、前回のテストが終了したレベルからテストが行われるのですか?4ではそのような問題はありません。初回入金額からテストを始めるには

ご指摘の状況を再現することはできません。

詳しくはこちら

 
stringo:

ご指摘の状況を再現することはできません。

詳細を教えてください。

私は、ウィザードで ストップのある平均にパラボリックを発生させます。オープンプライスでテストを実行し、キャンセルをクリックします。2回目に実行したところ、上記のような状況になりました(残高と資本のチャートは新たに描かれず継続されます)。ウィザードにないExpert AdvisorはOKです。
Мастер MQL5: Создание эксперта без программирования
Мастер MQL5: Создание эксперта без программирования
  • 2010.12.15
  • MetaQuotes Software Corp.
  • www.mql5.com
Вы хотите быстро проверить торговую идею, не тратя времени на программирование? Выберите в "Мастере MQL5" нужный тип торговых сигналов, подключите модули сопровождения позиций и управления капиталом - на этом вся работа закончена. Создайте свои реализации модулей или закажите их через сервис "Работа" - и комбинируйте новые модули с уже существующими.
 

これはバグと思われます。

多通貨テストモードにおいて、2つの計器に新しいバーが 表示されるのを待つと、テスターが正しく動作しない。

少し説明します。isNewBar関数では、メインシンボルに新しいバーが現れたら、ループ内で他のシンボルに新しいバーが現れるのを待ちます。

コードを貼り付けています。

//в тестере баг в режиме мультивалютного тестирования
//позиция открывается если на двух инструментах появился новый бар 
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\PositionInfo.mqh>
//--- input parameters
input int      Per=10;//период средней 
input string   Instrum1="EURUSD";//первый инструмент
input string   Instrum2="GBPUSD";//второй инструмент
//-------------------------------------------------------
CTrade   trade;//торговые функции
COrderInfo orderinfo;//информация об ордере
CPositionInfo  posinfo;//информация о позиции
int hiMA ;//хэндл индикатора 
int OnInit()
  {
      hiMA=iMA(_Symbol,_Period,Per,0,MODE_SMA,PRICE_OPEN) ;
      if(hiMA < INVALID_HANDLE) return(-1) ;
      return(0);
  }
//====================================================================
void OnDeinit(const int reason)
  {
   IndicatorRelease(hiMA) ;
  }
//=====================================================================
void OnTick()
  {
      if(!isNewBar(Instrum2)) return   ;
      //Print("  Это новый бар  ");
      double   Ma[1] ;//показания индикатора 
      CopyBuffer(hiMA,0,0,1,Ma) ;
      MqlTick price;// будет использоваться для получения текущих/последних котировок цены
      bool possel=posinfo.Select(Instrum1) ;
      SymbolInfoTick(Instrum1,price) ;
      if(possel && price.bid > Ma[0] && posinfo.PositionType() == POSITION_TYPE_SELL)
         {//цена выше средней закрываем короткую позу
            trade.PositionClose(Instrum1) ; return ;
         }
      if( !possel && price.bid > Ma[0])
         {//цена выше средней нет поз открываем длинную позу 
            trade.Buy(0.1,Instrum1,0,0,0,NULL) ; return ;
         }
      if( possel && price.ask < Ma[0] && posinfo.PositionType() == POSITION_TYPE_BUY)
         {//цена ниже средней закрываем длинную позу
            trade.PositionClose(Instrum1) ; return ;
         } 
      if(!possel && price.ask < Ma[0])
         {// цена ниже средней нет поз открываем короткую позу
            trade.Sell(0.1,Instrum1,0,0,0,NULL) ;
         }
      return ;
  }
//=======================================================================
bool isNewBar(string other_symbol)
  {//возвращает труе если новый бар на двух инструментах
   static datetime last_bar_time=0;
   int cntsleep ;
   if(last_bar_time==0)
     {//--- это первый вызов, запишем время открытия и выйдем
      last_bar_time=(datetime)SeriesInfoInteger(_Symbol,Period(),SERIES_LASTBAR_DATE);
      return(false);
     }
   datetime curr_time=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);
   if(curr_time!=last_bar_time)
     {//время открытия не совпадает это новый бар 
      last_bar_time=curr_time;
      cntsleep=0 ;
      while(!(curr_time == (datetime)SeriesInfoInteger(other_symbol,Period(),SERIES_LASTBAR_DATE)))
         {// ждем появления нового бара на втором инструменте   
            Sleep(5000); 
            if(cntsleep >10) return(false) ;// недождались 
            cntsleep++ ;
         }
      return(true) ;
     }
    return(false) ;
  }
Обработчик события "новый бар"
Обработчик события "новый бар"
  • 2010.10.04
  • Konstantin Gruzdev
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 
ivandurak:

これはバグと思われます。

マルチカレンシーテストモードで、2つの計器に新しいバーが 表示されるのを待つと、テスターが正しく動作しない。


具体的にどのような点がバグだと思われますか、ご説明ください。テストの内容、得られた結果、期待される結果などの詳細が示されていませんね。

さらに、「MetaTrader 5におけるテストの基本」にもご注目ください。ダニの発生メカニズムや基本的な考え方を解説しています。

 
Rosh:

具体的にどのような点がバグだと思われますか、ご説明ください。テストの詳細や得られた結果が示されておらず、期待される結果がわからないのでは?

さらに、「MetaTrader 5におけるテストの基本」にもご注目ください。ダニの発生メカニズムや基本的な考え方を解説しています。

簡単なことです。

最適化のためにExpert Advisorを起動し、その結果を確認します。

例えば、4番目のパスを選択し、Expert Advisorを実行し、すべての取引でその正常な動作を取得します - ここにレポートがあります。

予感がします。多通貨最適化モードでは、オープンバーで取引が開始されていない場合、テスターはバーに取引をバインドすることができません。

isNewBar関数がループをコメントアウトし、他のシンボルでの新しいバーの出現を待たない場合、すべてが機能します。Terminal version 5 build 642.

そこから記事とコードを読ませていただきました。とはいえ、自分でもわかっているので、再読することもあるかもしれませんが。

ハッピーホリデー

 
-Alexey-:
ウィザードで、ストップがパラボリックの中型のEAを 生成しました。オープンプライスでテストを実行し、「キャンセル」をクリックする。2回目に実行したところ、上記のような状況になりました(残高と資本のチャートは再描画されず継続されます)。ウィザードにないExpert AdvisorはOKです。

を指定して、サービスデスク・アプリケーションを 作成します。

  • ビルド番号
  • システムのビットモードとWindowsのバージョンです。
  • Expert Advisor のコードを囲んでください。
  • EA設定と入力パラメータ
 

以下はコードの一部です。trpar2=falseの とき、パラメータinput int grusdchf=100; input int grusdjpy=100; を最適化しないようにするにはどうしたらよいか。

//------------------------------------------------------------
input bool  trpar1=true ;//разрешение торговли по EURUDSD
input int   greurusd=100;//сетка для EURUSD
input int   grgbpusd=100;//сетка для GBPUSD
//------------------------------------------------------------
input bool  trpar2=true;//
input int   grusdchf=100;//
input int   grusdjpy=100;//
//------------------------------------------------------------
input bool  trpar3=true;//
input int   graudjpy=100;//
input int   grchfjpy=100;//
 
ivandurak:

以下はコードの一部です。trpar2=falseの とき、パラメータinput int grusdchf=100; input int grusdjpy=100; を最適化しないようにするにはどうしたらよいか。

これらのパラメータに対して、テスターのチェックボックスにチェックを入れないでください。あるいは、質問を明確にしないと、あいまいな表現になってしまいます。:)

 

質問です。

オブジェクトポインタの配列を関数に渡す必要があります。もちろん参照で(配列)。

どのような構文を使用すればよいのでしょうか?

void MyFunc(MyClass &*MayClassPointersArray[]);  / не компилируется.
void MyFunc(MyClass *&MayClassPointersArray[]);  / компилируется, но сомневаюсь что смысл правильный

それとも、何か別の使い方をしたほうがいいのでしょうか?

 
ivandurak:

以下はコードの一部です。trpar2=falseの とき、パラメータinput int grusdchf=100; input int grusdjpy=100; を最適化しないようにするにはどうしたらよいか。

input bool trpar2=true;
input int grusdchf=100;
input int grusdjpy=100;

if (trpair2==false)  // если false то всегда 100
  {
   x_grusdchf=100;
   x_grusdjpy=100;
  }
 else                // если true то значения с перебора 
  {
   x_grusdchf=grusdchf;
   x_grusdjpy=grusdjpy;
  }
チェックボックスは3つの入力すべてで有効になっており、その後falseでロックされます。