MQL5による株式発振器とは - ページ 2

 
DV2010: しかし 、変化して いる値(チェックされている!)はIndicator配列に書き込ま れるのに、 変化している Equity 値が Indicatorに表示 されないのはなぜでしょうか?

そこには何も書かれておらず、ループは呼び出されていない。自分で確認する
 

それは、ループがすべてのティックで呼び出されることです。

自分の目で確かめてください!出力をわざとループの本体に入れました。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[]){
   for (int i = prev_calculated; i <= rates_total-1; ++i){
      Print("Equity - OnCalculate - Cycle: prev_calculated=",prev_calculated,"   rates_total=",rates_total);
      Print("Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=", AccountInfoDouble(ACCOUNT_EQUITY));
      Values[i] = AccountInfoDouble(ACCOUNT_EQUITY);
   }
   return rates_total;
}

そして、その結末がこちらです。

2011.01.20 13:58:56     Core 1  OnTester result 0
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   order performed sell 0.15 at 1.33829 [#13 sell 0.15 EURUSD at 1.33829]
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   deal performed [#13 sell 0.15 EURUSD at 1.33829]
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   deal #13 sell 0.15 EURUSD at 1.33829 done (based on order #13)
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   position closed due end of test at 1.33829 [buy 0.15 EURUSD 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 22:00:00   Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=9949.299999999999
2011.01.20 13:58:56     Core 1  2011.01.14 22:00:00   Equity - OnCalculate - Cycle: prev_calculated=6418   rates_total=6419
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   CTrade::PositionOpen: instant buy 0.15 EURUSD at 1.33593 [done at 0.00000]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   order performed buy 0.15 at 1.33593 [#12 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal performed [#12 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal #12 buy 0.15 EURUSD at 1.33593 done (based on order #12)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   instant buy 0.15 EURUSD at 1.33593 (1.33577 / 1.33593 / 1.33577)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   CTrade::PositionClose: instant buy 0.15 EURUSD at 1.33593 [done at 0.00000]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   order performed buy 0.15 at 1.33593 [#11 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal performed [#11 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal #11 buy 0.15 EURUSD at 1.33593 done (based on order #11)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   instant buy 0.15 EURUSD at 1.33593 (1.33577 / 1.33593 / 1.33577)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=9929.65
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   Equity - OnCalculate - Cycle: prev_calculated=6417   rates_total=6418
 
DV2010:

それは、ループがすべてのティックで呼び出されることです。

自分の目で確かめてください!出力をわざとループの本体に入れました。

そして、その結末がこちらです。

テストと何の関係があるのですか?チャート上でインジケーターを 走らせるとただ、私の編集を忘れないでください。
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 

ここでテストする理由は、テスト期間内のEquityの変化を履歴で確認する必要があるからです。

ご指摘の通り、テスト モードと新しいチャートにドラッグしての両方でインジケータを動かしてみました。

このインディケータは、現在の相場までの全期間、および任意のタイムフレームで動作します(または、「すべてを見ることができる」というのは具体的にどういう意味ですか?)

それでもEquityの値は一定ですが、ログへの出力は変化していることがわかります。

( そうでなければ、ループが機能しているかどうかを、Print 以外にどうやって知ることができるのでしょうか?)

...念のため、Expert Advisorの "スケルトン "とインジケータを添付しておきます。

#property copyright "Copyright 2010, Pavlov Sergei"
#property link      ""
#property version   "1.00"

#include <\..\Experts\_My\Classes\ClassExpert\ClassExpert.mqh>
ClassExpert Expert1;

int Equity1=0;
void OnInit(){
   Equity1 = iCustom(NULL,0,"Equity",
                          5,          // Период
                          0,          // Смещение
                          MODE_SMA,   // Метод рассчета
                          PRICE_CLOSE // считаем по ценам закрытия)
                          );
   Expert1.Init();
}
void OnTick(){
   Expert1.OnTick();
}
void OnDeinit(const int reason){
   Expert1.Deinit();
}
 
DV2010:

ここでテストする理由は、テスト期間内のEquityの変化を履歴で確認する必要があるからです。

ご指摘の通り、テストモードと新しいチャートにドラッグ&ドロップの両方でインジケータを動かしてみました。

このインディケータは、現在の相場までの全期間、および任意のタイムフレームで動作します(または、「すべてを見ることができる」というのは具体的にどういう意味ですか?)

それでもEquityの値は一定ですが、ログへの出力は変化していることがわかります。

( そうでなければ、ループが機能しているかどうかを、Print 以外にどうやって知ることができるのでしょうか?)

...念のため、Expert Advisorの "スケルトン "とインジケータを添付しておきます。

間違ったインジケータをEAに 組み込んでも意味がありません。まだ、私のオプションをチェックしていないのですか?
 

私の勘違いかもしれませんが、テスト終了後のチャート上のインジケーターの 表示とテスト時の計算を比較するのではないのでしょうか?

ポイントは、テスターからのカスタムインディケータの結果(計算配列)は一切チャートに転送されず、チャート上の新しい計算で指定されたインディケータが起動されるだけという点です。

Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 

このインジケータを分足チャートで実行すると(オープンポジションを持って いる場合)、10~15分後にこのような画像が表示されます。


コード

//+------------------------------------------------------------------+
//|                                             Equity_Indicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double Values[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Values,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,100);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(Values,false);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {


   Print("prev_calculated=",prev_calculated,"   rates_total=",rates_total);
   int limit=prev_calculated;
   if(limit>0) limit--;

//---Блок заполнения Индикатора и журнала сообщений значениями
   for(int i=limit; i<rates_total;++i)
     {
      Values[i]=AccountInfoDouble(ACCOUNT_EQUITY);
     }
   return rates_total;
  }
//+------------------------------------------------------------------+
 

ロシュ さん、私のインジケーターは何がおかしいのか、すでにお聞きしていますし、あなたのバリアントも確認したことを書いていますよ しかも、私はできるだけ詳しく説明しようとしたのに、あなたは「ループがうまくいかない」「自分の目で確かめてください」と簡単にしか書かない...。

...Renat さん、私の理解では、テスト終了後、テスト中の計算とインジケータ配列の充填を もとに、 インジケータがチャートに表示 されるようです。しかし、テスターからの結果がカスタムインジケーターチャートに転送されないというのはどういうことでしょうか?

では、何のために必要なのか、また、配列への値の代入をコードから削除すると、なぜインジケータラインが一気に消えてしまうのか(一定の横線でも消えてしまう)。

OnCalculated で記入される指標値の 配列と、チャート上の指標 値の対応が 曖昧ないかと思った のですが、そうでなければ指標値の初期化はどう すればいいのでしょうか。

わかりにくい...些細なことのようですが、数日前から悩んでおり、せめて履歴上でどう違う解き方ができるのか、全く解けないのか、ヒントにしてくれる人がなかなかいません。

改めて、私の理解では(間違っていたらご指摘ください。)

1.テスターでテスト期間を指定し、私のインジケータが添付されたExpert Advisorを選択 します。

2.最初の呼び出し OnCalculated は、パラメータ prev_calculated =0 と rates_total = テスト開始時に対応するティック(バー)の数で呼び出さ れます。この期間内は、バランス値が初期値で一定に保たれます。

テスト期間内のバーによる OnCalculatedのその後の呼び出しは 、個々のバーごとに発生し、ここで我々は、変更するそれらのデータで指標の値の配列を初期化することができます(例えば、価格を複製し、私が書いたように、動作しましたが、その後、なぜ価格を変更するのではなく、値を変更して初期化 Equity ませ んか)

そしてとにかく、あなたはプロです。この単純な作業が解決されるといいのですが、それとも MetaTraderはまだこのような「高み」に到達していないのでしょうか:)))

私はこの問題に対して、私の簡単な解決策を提示しましたが、うまくいきません。

では、どのように実装すればよいのでしょうか。ヒストリーでのテスト結果に基づき、価格チャートの下にエクイティ・チャートを表示します。

 
一つ言っておくと、可視化モードが起動するまで、問題を解決するのは簡単ではありません。一つは、テスト中に株式データをファイルに書き出し、ファイルからインジケータバッファにデータを書き込んで、株式グラフをプロットすることです。
 

Roshさん、オンライン用のバリアントはすでに掲載されていますが、Historyを主に扱う者として、過去のデータで動作するバリアントが必要なんです。そして、何が一番の難点なのか、いまだに理解できないでいます。

トレーダーは、取引数が 少ないため、オンラインのバランスグラフを把握することができます(BuyとSellを押す時間がほとんどないエクストラスカルパーでない限り)。

実際、何百、何千もの取引履歴がある場合、株式のダイナミクスは非常に重要になりますが、テスターのグラフは、原則としてこれらのダイナミクスと価格のダイナミクスを単純に比較することはできません(もちろん、MetaQuoteがプログラマーにとって重要なのは、弱いポジションと強いポジションの個別のシリーズを分析せずに既に準備された専門家を迅速に排除することだと考えているなら、話は別です)。

理由: