ライブラリ: イージーキャンバス - ページ 9

 
このライブラリはStrategy Testerで 使えますか?Strategy Testerで手動テストを試してみたいのですが。
 
jaffer wilson:
このライブラリはStrategy Testerで 使えますか?Strategy Testerで手動テストを試してみたいのですが。
はい、動作します。ただし、テスター内のイベントが正しく動作しないことと、時間密度が高いためキャンバスの計算でテスターに過負荷をかけないようにすることです。
後で少し例を挙げます。
でも今は、こちらをご覧ください。
https://www.mql5.com/en/forum/229521/page4#comment_15005864
Possibilities of Canvas.
Possibilities of Canvas.
  • 2020.01.18
  • www.mql5.com
Demonstration of the possibilities of Сanvas in dynamics. The picture never repeats. This script also works on MQL4, but much slower...
 
jaffer wilson:
このライブラリはStrategy Testerで 使えますか?Strategy Testerで手動テストを試してみたい。
#property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ja/code/22164
//+------------------------------------------------------------------+
int max=0,min=0;
double Max=0,Min=0;
int OnInit() {
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
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[]) {
   max= ArrayMaximum(high,rates_total-W.Left_bar,W.BarsInWind);
   min= ArrayMinimum(low,rates_total-W.Left_bar,W.BarsInWind);
   Max=high[max];
   Min=low[min];
   max=rates_total-1-max;
   min=rates_total-1-min;
   if (rates_total>0) Draw();
   return(rates_total);
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // イベント識別子
                  const long& lparam,   // ロング・タイプのイベント・パラメータ
                  const double& dparam, // double 型のイベント・パラメータ
                  const string& sparam) { // 文字列型のイベント・パラメータ
   if (id==CHARTEVENT_MOUSE_MOVE) Draw(); 
}
//+------------------------------------------------------------------+
void Draw () {
   static double pr=0;
   static uint clr=0;
   static uint lastCalc=0;
   uint cur=GetTickCount();
   if (cur-lastCalc<30) return;
   lastCalc=cur; 
   double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if (Canvas.tester) ChartChanged();        // テスターモードの場合、チャートのパラメータを更新する
   if (pr<Ask) clr=0x800000FF;               // 赤
   if (pr>Ask) clr=0x80FF0000;               // ブルー
   Canvas.Erase(clr);
   Canvas.FillCircle((int)Canvas.X(double(max)),(int)Canvas.Y(Max),20,0xAA50FF50);
   Canvas.FillCircle((int)Canvas.X(double(min)),(int)Canvas.Y(Min),20,0xAAFFFF50);
   Canvas.CurentFont("Tahoma",50,50,0xFF80FF80,0.4);
   Canvas.TextPosition(W.MouseX,W.MouseY);
   Canvas.Comm("Ask = " + DoubleToString(Ask,_Digits));
   Canvas.Comm("Bid = " + DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
   Canvas.Comm("Spread = " + DoubleToString((Ask-Bid)/_Point,0));
   Canvas.Update();
   pr=Ask;
}
//+------------------------------------------------------------------+

黄色でハイライトされているのは、テスターの負荷を減らすために必要なものです。
緑でハイライトされているのは、座標を正しくレンダリングするために必要なものです。この行を削除してみて、テスターでどうなるかを見てください。

このインジケーターでは、価格変動の方向によって画面の色が変わり、画面上の最低価格と最高価格が強調表示され、マウスポインターの現在位置のBidとAskに関するテキスト情報が表示されます。


しかし残念なことに、Testerではマウスの移動イベントはマウスの左ボタンが押された時のみ実行されます。
これは私のiCanvasクラスだけでなく、Testerのあらゆるグラフィカル出力にも当てはまります。
私だけがそれを実装するもっと簡単な方法を持っています。
そしてGUIコントロールでさえかなりうまく動作します:


 
お返事とお手本をありがとうございました。
 
jaffer wilson:
回答と例をどうもありがとう。
問題なし
 

こんにちは、

とても素晴らしい仕事だ。ありがとうございます。

CanvasBar Sampleをチェックしていただけますか?ご提案いただいた修正でもテスターでは動作しません。


マイティ

 
Mighty7:

こんにちは、

とてもいい仕事だ。ありがとう。

CanvasBar Sampleをチェックしていただけますか?ご提案いただいた修正を加えても、テスターでは動作しません。

マイティ

ChartChangedをCopyRatesの 前に移動してみてください。

 
迅速な返信をありがとう。
 
Mighty7:
迅速な返信をありがとう。

これはOnChartEventからの 呼び出しであり、テスターでは正しく動作していないためです。

これを試してみてください。

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[])
  {
   if(rates_total==prev_calculated)
     {
      Bar0.close=close[rates_total-1];Bar0.open=open[rates_total-1]; Bar0.high=high[rates_total-1];Bar0.low=low[rates_total-1];
      ShowBars(false);
     }
   else if (Canvas.tester) ShowBars();
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_CHART_CHANGE) ShowBars(true);
  }
将来的には、コードかリンクを添付してください。何しろ、2年近く前に書いたコードの名前を覚えていないのですから。
ファイル:
CanvasBar.mq5  7 kb
 

「将来的には、コードかリンクを添付してください。何しろ、2年近く前に書いたコードの名前を覚えていないのですから。"

わかりました。これで動くようになりました(同期させるためにGetTickCountの 行を削除する必要がありました)。ありがとう。