只今インジケーターにオーダー機能をつけてEA化しようと奮闘中です。
インジケーターは問題なく出来あがり、オーダー関係はスクリプトで作成し動作チェックを行い、
結合してようやくEAのバックテストを行う段階まで来ました。
しかしEAのバックテストでは、インジケーターの肝であるSetIndexBuffer()が機能せず、
バッファを用いたラインの描画やデータ管理が行えずに不具合が生じてしまいました。
データ管理については、
iCustom()を用いて外部インジケーターのバッファ値を取得できることが分かったので、
結合は中止し、EAからiCustom()でバッファ値を取得する形式にしました。
ラインの描画については、
バックテスト中に表示されませんが、ストップボタンを押下したタイミングで描画されています。
(ビジュアルモードは有効になっています)
質問ですが、
EAのバックテスト中にバッファを用いたラインを描画する方法はないでしょうか?
また、インジケーターをEAに移植する方法で参考となるご意見を教えていただけたら助かります。
以下、iCustom()を検証したソースです。
mq4
1//+------------------------------------------------------------------+ 2//| /Experts/add/custom/Test/TestICustom_EA.mq4 3//+------------------------------------------------------------------+ 4#property strict 5 6int OnInit() 7{ 8 return(INIT_SUCCEEDED); 9} 10 11void OnDeinit(const int reason) 12{ 13 14} 15 16void OnTick() 17{ 18 UpdateMA(); 19} 20 21void UpdateMA() 22{ 23 string symbol = Symbol(); 24 int period = PERIOD_CURRENT; 25 string indicatorName = "add\custom\Test\TestICustom_Indicator.ex4"; // mq4形式ではなく、ex4形式、区切りは[\]を使用する 26 int mode = 0; // バッファのインデックス 27 int shift = 0; // 常に最新のロウソク足 28 29 double ma = iCustom(symbol, period, indicatorName, mode, shift); // inputパラメータなし 30 Print("[ma] ", ma); 31}
mq4
1//+------------------------------------------------------------------+ 2//| /indicators/add/custom/Test/TestICustom_Indicator.mq4 3//+------------------------------------------------------------------+ 4#property strict 5 6#property indicator_chart_window 7#property indicator_buffers 1 8#property indicator_color1 clrRed 9#property indicator_width1 1 10 11double ma[]; 12 13int OnInit() 14{ 15 IndicatorBuffers(1); 16 SetIndexBuffer(0, ma); 17 SetIndexStyle(0, DRAW_LINE); 18 return(INIT_SUCCEEDED); 19} 20 21void OnDeinit(const int reason) 22{ 23 24} 25 26int OnCalculate(const int rates_total, 27 const int prev_calculated, 28 const datetime &time[], 29 const double &open[], 30 const double &high[], 31 const double &low[], 32 const double &close[], 33 const long &tick_volume[], 34 const long &volume[], 35 const int &spread[]) 36{ 37 int limit; 38 if (prev_calculated == 0) 39 limit = rates_total - 1; 40 else 41 limit = rates_total - prev_calculated; 42 43 UpdateMA(limit); 44 45 return (rates_total); 46} 47 48void UpdateMA(int limit) 49{ 50 int i; 51 string symbol = Symbol(); 52 int period = PERIOD_CURRENT; 53 int ma_shift = 0; 54 55 for (i=limit; i>=0; i--) 56 { 57 ma[i] = iMA(symbol, period, 10, ma_shift, MODE_SMA, PRICE_CLOSE, i); 58 } 59} 60
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/15 09:06