ホーム テクニカル指標 投稿

Waddah_Attar_Trend_Alert: MetaTrader 5用インジケーターの使い方と設定

添付ファイル
16832.zip (22.5 KB, ダウンロード 0回)

開発者: Waddah Attar氏

Waddah_Attar_Trend インジケーターは、アラート、メール、プッシュ通知機能を搭載しています。

このインジケーターにアラート、メール、プッシュ通知機能を実装するために、以下のコード変更が行われました:

  1. 新しい入力パラメータを追加しました:
    //---- アラート用の入力
    input uint NumberofBar=1;                    // シグナルのバー番号
    input bool SoundON=true;                     // アラートを有効にする
    input uint NumberofAlerts=2;                 // アラートの数
    input bool EMailON=false;                    // シグナルをメールで送信する
    input bool PushON=false;                     // モバイルデバイスにシグナルを送信する
    
  2. インジケーターコードの最後に、3つの新しい関数を追加しました:BuySignal()、SellSignal()、GetStringTimeframe()
    //+------------------------------------------------------------------+
    //| 購入シグナル関数                                              |
    //+------------------------------------------------------------------+
    void BuySignal(string SignalSirname,// メールとプッシュメッセージ用のインジケーター名のテキスト
    double &ColorArray[],// カラーインデックスバッファ
    int ColorIndex,// シグナルを生成するカラーバッファのインデックス
    const int Rates_total, // 現在のバー数
    const int Prev_calculated, // 前のティックのバー数
    const double &Close[], // 終値
    const int &Spread[]) // スプレッド
    {
    //---
    static uint counter=0;
    if(Rates_total!=Prev_calculated) counter=0;

    bool BuySignal=false;
    bool SeriesTest=ArrayGetAsSeries(ColorArray);
    int index,index1;
    if(SeriesTest)
    {
    index=int(NumberofBar);
    index1=index+1;
    }
    else
    {
    index=Rates_total-int(NumberofBar)-1;
    index1=index-1;
    }
    if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) BuySignal=true;
    if(BuySignal && counter<=NumberofAlerts)
    {
    counter++;
    MqlDateTime tm;
    TimeToStruct(TimeCurrent(),tm);
    string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
    SeriesTest=ArrayGetAsSeries(Close);
    if(SeriesTest) index=int(NumberofBar);
    else index=Rates_total-int(NumberofBar)-1;
    double Ask=Close[index];
    double Bid=Close[index];
    SeriesTest=ArrayGetAsSeries(Spread);
    if(SeriesTest) index=int(NumberofBar);
    else index=Rates_total-int(NumberofBar)-1;
    Bid+=_Point*Spread[index];
    string sAsk=DoubleToString(Ask,_Digits);
    string sBid=DoubleToString(Bid,_Digits);
    string sPeriod=GetStringTimeframe(ChartPeriod());
    if(SoundON) Alert("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
    if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
    if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
    }

    //---
    }
    //+------------------------------------------------------------------+
    //| 売却シグナル関数                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname, // メールとプッシュメッセージ用のインジケーター名のテキスト
    double &ColorArray[], // カラーインデックスバッファ
    int ColorIndex, // シグナルを生成するカラーバッファのインデックス
    const int Rates_total, // 現在のバー数
    const int Prev_calculated, // 前のティックのバー数
    const double &Close[], // 終値
    const int &Spread[]) // スプレッド
    {
    //---
    static uint counter=0;
    if(Rates_total!=Prev_calculated) counter=0;

    bool SellSignal=false;
    bool SeriesTest=ArrayGetAsSeries(ColorArray);
    int index,index1;
    if(SeriesTest)
    {
    index=int(NumberofBar);
    index1=index+1;
    }
    else
    {
    index=Rates_total-int(NumberofBar)-1;
    index1=index-1;
    }
    if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) SellSignal=true;
    if(SellSignal && counter<=NumberofAlerts)
    {
    counter++;
    MqlDateTime tm;
    TimeToStruct(TimeCurrent(),tm);
    string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
    SeriesTest=ArrayGetAsSeries(Close);
    if(SeriesTest) index=int(NumberofBar);
    else index=Rates_total-int(NumberofBar)-1;
    double Ask=Close[index];
    double Bid=Close[index];
    SeriesTest=ArrayGetAsSeries(Spread);
    if(SeriesTest) index=int(NumberofBar);
    else index=Rates_total-int(NumberofBar)-1;
    Bid+=_Point*Spread[index];
    string sAsk=DoubleToString(Ask,_Digits);
    string sBid=DoubleToString(Bid,_Digits);
    string sPeriod=GetStringTimeframe(ChartPeriod());
    if(SoundON) Alert("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
    if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
    if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
    }
    //---
    }
    //+------------------------------------------------------------------+
    //| タイムフレームを文字列として取得                                  |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
    {
    //----
    return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
    }
  3. インジケーターの計算サイクル後にBuySignal()とSellSignal()関数を呼び出すコードを追加しました。
    //---
    BuySignal("Waddah_Attar_Trend_Alert",ColorIndBuffer,0,rates_total,prev_calculated,close,spread);
    SellSignal("Waddah_Attar_Trend_Alert",ColorIndBuffer,1,rates_total,prev_calculated,close,spread);
    //---

ここで、ColorIndBufferはラインの色をインデックスとして保存するためのカラーバッファの名前であり、0と1はカラーバッファ内の色の数です。

BuySignal()およびSellSignal()関数は、インジケーターコードのOnCalculate()ブロック内で一度だけ呼び出されることが想定されています。

このインジケーターはSmoothAlgorithms.mqhライブラリクラスを使用します(\MQL5\Includeにコピーしてください)。クラスの使用方法は、「追加バッファを使用せずに中間計算のための価格系列の平均化」という記事で詳しく説明されています。

Fig.1. Waddah_Attar_Trend_Alert インジケーターのチャート

Fig.1. Waddah_Attar_Trend_Alert インジケーターのチャート

Fig.2. Waddah_Attar_Trend_Alert インジケーター。アラート生成

Fig.2. Waddah_Attar_Trend_Alert インジケーター。アラート生成

関連記事

コメント (0)