エキスパート: 2つの移動平均の差

 

2つの移動平均の差:

2つの移動平均値の差に基づいたエキスパートアドバイザー

テスト結果

作者: Winston

 

このインディケータが正しく動作するには、OnInit () で ArraySetSeries (mf, true) と (ms, true) が必要だと思います。

すべての演算子

if (flg == 0) / / initialise on first pass
      {
       ArrayInitialize (ag, EMPTY_VALUE);
       ArrayInitialize (bg, EMPTY_VALUE);
       ArrayInitialize (cg, EMPTY_VALUE);
       hi = 0;
       I = 0;
       trend = 0;
       flg = 1;
       }

すべての演算子はOnInit()でより効果的であり、 "flg "を使用する必要はありません。

MACDを使ったEAのアルゴリズムは次のように単純化されていると思います:

買いを開く:MACDcurrent>MACDprev && MACDcurrent<0; buyed = true.

クローズ買い:buyed && MACDcurrent<MACDprev && MACDcurrent>0; buyed = false。

売りの逆張り。

EAを操作していない時にSLとTPを使用すれば、トレンド(スローMA)に合わせて「買い」または「売り」と言うことができ、新しいシグナルを待つことができます。

 

このインジケーター:madelta_inc.mq5 をチャートにつけても何も描画されません。画像を添付しますので、ご覧ください。また、josemiguel1812が 提案している、フラグ: 'flg'を使用せず、コードの一部をOnInit()イベントに移動させるという変更を加えたコードを以下に掲載します。私は使っていない:ArraySetAsSeries (mf, true)とArraySetAsSeries (ms, true)は使いませんでした。なぜなら、'mf'と'ms'はどちらも1つの要素しかない配列であり、この変更は効果がないと思うからです。しかし、私が知りたいのは、なぜインジケータの線が描画されないのかということです。以下のコードを試してテストしていただけますか?

よろしくお願いします。

//+------------------------------------------------------------------+
//|マデルタ・インク
//|著作権 2013 ウィンストン
//+------------------------------------------------------------------+
#property copyright "Winston 2013"
#property version "1.10"
#property description "madelta_inc"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   3

#property  indicator_type1   DRAW_COLOR_LINE
#property  indicator_color1  White,Yellow,Red
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  2

#property  indicator_type2   DRAW_LINE
#property  indicator_color2  Yellow
#property  indicator_style2  STYLE_DOT
#property  indicator_width2  1

#property  indicator_type3   DRAW_LINE
#property  indicator_color3  Red
#property  indicator_style3  STYLE_DOT
#property  indicator_width3  1

input double d = 0.00195;                       //delta
input double m = 39.2;                          //mult

input int F = 26;                               //高速移動平均
input ENUM_MA_METHOD FM = MODE_SMA;             //高速平均モード
input ENUM_APPLIED_PRICE FP = PRICE_WEIGHTED;   //ファーストプライスモード

input int S = 51;                                     //低速移動平均
input ENUM_MA_METHOD SM = MODE_EMA;                 // 低速平均モード
input ENUM_APPLIED_PRICE SP = PRICE_MEDIAN;        //スロープライスモード

int Ms, Mf, trend;
double px, hi, lo;
double ms[1], mf[1];
double ag[], bg[], cg[], ac[];

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnInit() {
        SetIndexBuffer(0, ag, INDICATOR_DATA);
        ArraySetAsSeries(ag, true);                    //シグナル

        SetIndexBuffer(1, ac, INDICATOR_COLOR_INDEX);
        ArraySetAsSeries(ac, true);                    //シグナル・トレンド・カラー

        SetIndexBuffer(2, bg, INDICATOR_DATA);
        ArraySetAsSeries(bg, true);                    //閾値

        SetIndexBuffer(3, cg, INDICATOR_DATA);
        ArraySetAsSeries(cg, true);                    //閾値

        ArrayInitialize(ag, EMPTY_VALUE);
        ArrayInitialize(bg, EMPTY_VALUE);
        ArrayInitialize(cg, EMPTY_VALUE);
        hi = 0;
        lo = 0;
        trend = 0;
        
        Mf = iMA(NULL, PERIOD_H1, F, 0, FM, FP);
        Ms = iMA(NULL, PERIOD_H1, S, 0, SM, SP);

}

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,           // 価格[]配列のサイズ
                                const int prev_calculated,               // 前の呼び出しで処理されたバー
                                const int begin,                          // 重要なデータがどこから始まるか
                                const double &price[])              // 計算する配列
{

        CopyBuffer(Mf, 0, 0, 1, mf);                   //高速移動平均値

        CopyBuffer(Ms, 0, 0, 1, ms);                   // 低速移動平均値

        px = pow(m * (mf[0] - ms[0]), 3);                // 差を増幅して立方体にする


        if (px > hi) {                               //トレンドの特定
                hi = px;
                lo = hi - d;
                trend = 1;
        }
        if (px < lo) {                               //色の変化を伴う
                lo = px;
                hi = lo + d;
                trend = 2;
        }

        ag[0] = px;
        bg[0] = hi;
        cg[0] = lo;
        ac[0] = trend;

        return (rates_total);
}

//+------------------------------------------------------------------+
ファイル:
screenshot.png  103 kb
 
cyberglassed:

このインジケーター:madelta_inc.mq5 をチャートにつけても何も描画されません。画像を添付しますので、ご覧ください。また、josemiguel1812が 提案している、フラグ: 'flg'を使用せず、コードの一部をOnInit()イベントに移動させるという変更を加えたコードを以下に掲載します。私は使っていない:ArraySetAsSeries (mf, true)とArraySetAsSeries (ms, true)は使いませんでした。なぜなら、'mf'と'ms'はどちらも1つの要素しかない配列であり、この変更は効果がないと思うからです。しかし、私が知りたいのは、なぜインジケータの線が描画されないのかということです。以下のコードを試してテストしていただけますか?

よろしくお願いします。

何を期待しているのですか?インジケータのバッファのインデックス0の値だけがセットされます。
 
angevoyageur:
何を期待しているのですか?インジケータのバッファのインデックス0の値のみが設定されます。

バッファのインデックス0が常に代入されているのを見て少し混乱したので、ArraySetAsSeriesが何らかの影響を及ぼして、直感的に考えられる動作(逆)を変えるとか、そういうことを期待していたのですが、私はmql5の初心者です。とにかく、他の理由でコンピュータを再起動しなければならなくなり、インジケータを再度試してみたところ、今では最初に期待したとおりの線が描画される ようになりました。画像を添付します。

ありがとうございました。

ファイル:
screenshot.png  118 kb
 
cyberglassed:

ArraySetAsSeriesは、直感的な動作(逆)を変更するような影響があるのではと期待していたのですが、私はmql5の初心者です。とにかく、他の理由でコンピュータを再起動しなければならなくなり、インジケータを再度試してみたところ、今では最初に期待したとおりの線が描画される ようになりました。画像を添付します。

Cyberglassedさん、ありがとうございます。

あなたが実行しているコードがあなたが投稿したものと同じでないか、あなたのターミナルがいくつかのバッファから来るデータを描画しているかのどちらかです。

あなたが投稿したコードではそのような結果は得られません。

 

コメントありがとうございます。このインジケーターは、ストラテジーテスターの Visulizationモードでのみ動作するように意図されているという点で、珍しいかもしれません。

ナビゲーターでEAを左クリックし、testを右クリックします。 ストラテジーテスターEURUSDのH1で、Visulizationにチェックを入れ、Startするとインジケーターが表示されるはずです。

どうなったか教えてください。

よろしくお願いします。

ウィンストン

 

このEAは何かおかしい。1つの通貨ペアだけで取引しようとすると、このEAは2日間何もせず、インジケータは時々売りと買いのシグナルを 同時に表示します。

複数の通貨ペアで取引しようとすると、同じことをしますが、手動でポジションをクローズすると、再び取引を開始することを確認しました。

ストラテジーテスターでテストしたときはすべてOKだったのですが、取引しようとするとオープンポジションばかりでクローズしてくれません。

どなたかこれを解決していただけませんか?

 
タイムフレームのマーカーが必要なら、(Ma1-Ma2)と(未知のインジケーター)を組み合わせればいいのでは?
 
ただ、どこをいじればたくさん選択できるようになるのかがわからない。
 
こんにちは!必要なロットを設定する方法はわかったのですが、このボットを複数の商品で同時に動作させるにはどうすればいいのでしょうか?