記事"かずかずのインスツルメントで取引を行うExpert Advisorの作成"についてのディスカッション - ページ 3

 

6.足りないようです:

TradePerformer(4, Symb4, Trade4, StLoss4, TkProfit4, Lots4, Slippage4, UpSignal, DnSignal, UpStop, DnStop);

in Exp_TEMA.mq5 ?

 
ias:

6.欠けているようだ

Exp_TEMA.mq5?

そうだ!こんな異常な暑さの中、頑張りすぎてオーバーヒートしてしまったに違いない!
 
Renat:

再現可能な例を作ってください。つまり、コンパイルして、チャートに投げて、結果が得られるような、出来合いのコードが必要なのです。

これがなければ、私たちが話していることを理解する人はほとんどいないでしょう。

人々を無駄に遠ざけることのないように、私は手を抜こうと思った。

これが完全版だ:

#property indicator_separate_window    // インジケータは別のウィンドウに描画されます。
#property indicator_buffers 1



#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Aqua

input string InstrumentName = "EURJPY";

//-- インジケータの配列
double ScreenBuffer[]; 

//-- ダイナミック・バッファ
double ArrayBuffer[];

int OnInit()                          // 特別な init() 関数
{
//--------------------------------------------------------------------

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   return 0;                          // 終了
}
//--------------------------------------------------------------------
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[])
{
int Counted_bars;   // 操作するバーの数 
int copied;

//--------------------------------------------------------------------
   //1 入力 rates_total = 9667 / prev_calculated = 0 / Bars = 9667
   //-- rates_total = 9667 / prev_calculated = 9667 / Bars = 9667
   //-- 処理中 rate_total = 9668 / prev_calculated = 9667 / Bars = 9668
   //Print("rates_total: " + (string)rates_total);
   if (rates_total == prev_calculated) return (rates_total);//-- 同じバーだから、もういい...」。

   //-- 未処理のバーの数を取得する(最初の入力ではすべて、次に1)。
   //-- 出力バーの数はチャートそのものを指すが、ここでは別の計器を出力する。
   //-- バーの数は異なるかもしれないので、まずすべてのデータをバッファにダンプする。
   Counted_bars = rates_total-prev_calculated;
   
   // Print("Counted_bars: " + Counted_bars);
   Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(Symbol(),0));
   //-- メインの楽器の小節数でメモリーを割り当てる。
   if (ArrayResize(ArrayBuffer, Counted_bars,0) == -1) return (rates_total);//-- メモリ割り当てエラー --
   //--- EMPTY_VALUE値で配列要素を初期化する。
   ArrayInitialize(ArrayBuffer,EMPTY_VALUE);
         
   //-- この楽器が実際に持っている小節数を取得する。
   copied = (int)SeriesInfoInteger(InstrumentName,0,SERIES_BARS_COUNT);
   
   if (copied > 0){
      copied=CopyClose(InstrumentName,0,0,copied,ArrayBuffer);//-- メモリ・バッファにデータを書き込む
      if (copied <= 0) return (rates_total);//-- エラー
   } 
   else{

      return (rates_total);//-- エラー 
   }
    
   if (Counted_bars > copied) Counted_bars = copied;//-- 低い方の値を取る

   Counted_bars--;//-- 0から数えるので
   //-- メモリ・バッファにデータがロードされたので、それをスクリーン・バッファに右から左に書き込む。
   for (int i = Counted_bars; i > 0; i--){
      ScreenBuffer[i] = ArrayBuffer[i];
   }   
   
//--------------------------------------------------------------------
   return(rates_total);
}


void OnDeinit(const int reason)
{
   ObjectsDeleteAll(0,0,-1);             // チャートのすべてのオブジェクトが削除される。
}
 

なぜ別のインストゥルメントのチャートを正常に表示できないのでしょうか?

MQL4ではすべてうまくいったのですが、ここでは同じインストゥルメントに表示した場合のみうまくいき、その後はエラーは出ません。

削除済み  
gisip:

なぜ別のインストゥルメントのチャートを正常に表示できないのでしょうか?

MQL4ではすべてうまくいったのですが、ここでは同じインストゥルメントに表示した場合のみうまくいき、その後はエラーは出ません。


実装やアルゴリズムが正しいかどうかは分かりませんが、コードとそれでできたことから、私は次のように考えています:

文字列

// Print("Counted_bars: " + Counted_bars);
Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(Symbol(),0));

文字列は次のようになるはずです。

// Print("Counted_bars: " + Counted_bars);
Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(InstrumentName,Period()));


おそらく、どこでもピリオドを "0 "としてPERIOD_CURRENTに 変更する方が正しいだろう。

少なくとも、このような変更をした後は、すべてうまくいきました。

追記

あまり関係ないかもしれませんが、この方法だとコンパイラの重要度がぐっと下がります。

Print("rates_total: ",rates_total," / prev_calculated: ",prev_calculated," / Bars: ",Bars(InstrumentName, PERIOD_CURRENT));
 
Interesting:

一般的に正しい実装とアルゴリズムがわかっているわけではないが、コードとそれでできたことに基づいて、そう仮定することにする:

文字列

文字列は次のようになります。

追記

おそらく、どこでもピリオドを "0 "としてPERIOD_CURRENTに変更する方が正しいだろう。

少なくとも、このような変更をした後は、すべてうまくいったのだが......。

グラフが現実に対応していない。
 

私の画面ではこう見える:


明らかに間違っている。
削除済み  

私の場合はこうなった。

しかし、私はインデューサーのロジックとその実装に踏み込んでいないので、結果の正しさを判断することはできない。


追記

私なら、パラメータのシンボルを削除して、現在のシンボルとTFで作成し、通常のiCustom()を使用してExpert Advisorまたは他のツールで使用します。

それに、私はバッファ(電卓の末尾などのこと)を扱うロジックをよく理解していない。私の意見では、取り組むべきことがたくさんあります...。

ファイル:
proba.mq5  4 kb
 
Interesting:

それが私が得たものだ

しかし、私はインデューサーのロジックとその実装に踏み込んでいないので、結果の正しさを判断することはできない。


追記

私なら、パラメータのシンボルを削除して、現在のシンボルとTFに従ったものにし、通常のiCustom()を使ってExpert Advisorや他のツールで使用します。


アドバイスありがとうございます。
削除済み  

Interesting:

それに、バッファ(電卓の尻尾などのこと)を使うロジックもよく理解できていない。私の意見では、まだまだ課題が山積みです......。


私が正しく理解していれば、バッファは1つで十分です(正しく計算され、チャートに描画される必要があるだけです)。

追記

インデューサーは "右"(現在)ではなく、"左"(歴史の最初)のデータを表示するような気がするのですが・・・。

それとも、このインジケータのロジックを全く理解していないのでしょうか?