アラート

別ウィンドウにメッセージを表示します。

void  Alert(
  argument,     // 初めの値
  ...          // 他の値
  );

パラメータ

argument

[in]  コンマで区切られた任意の値。情報出力を複数の行に分割するには、改行文字「 \n 」または 「 \ r \ n 」を使用することが出来ます。パラメータの数は 64 を超えることは出来ません。

戻り値

なし

注意事項

配列は Alert() 関数には渡せません。配列は要素ごとに出力する必要があります。double 型のデータは小数点以下8桁で出力され、float 型のデータは小数点以下 5 桁で表示されます。実数を異なる精度または科学形式で出力するには DoubleToString() 関数が使用されます。

bool 型のデータは「 true 」または 「 false 」の文字列として出力されます。日付は YYYY.MM.DD HH:MI:SS として出力されます。日付を別の形式で表示するには TimeToString() 関数が使用されます。カラー型のデータは R、G、B の文字列、または、色がカラーセットに存在する場合は色名として出力されます。

Alert() 関数はストラテジーテスター内では使用できません。

例:

//--- 列挙体
enum ENUM_INTERSECT_DIRECTION
 {
  INTERSECT_DIRECTION_NONE= 0, // 交差なし
  INTERSECT_DIRECTION_UP  = 1, // 上向きに交差
  INTERSECT_DIRECTION_DOWN=-1, // 下向きに交差
 };
 
//--- 入力パラメータ
input   uint               InpPeriod = 10;           // MA期間
input   int               InpShift  = 0;             // MAシフト
input   ENUM_MA_METHOD     InpMethod = MODE_SMA;     // MA法
input   ENUM_APPLIED_PRICE InpPrice  = PRICE_CLOSE;   // MA適応価格
 
//--- グローバル変数
int     ExtMaHandle;
int     ExtMaPeriod;
double   ExtData[2];
MqlRates ExtRates[2];
 
//+------------------------------------------------------------------+
//| エキスパート初期化関数                                                |
//+------------------------------------------------------------------+
int OnInit()
 {
//--- 入力パラメータにゼロが指定されている場合、移動平均を計算する期間はデフォルト値(10)と等しくなる
  ExtMaPeriod=int(InpPeriod<1 ? 10 : InpPeriod);
//--- 指定されたパラメータを使用して移動平均指標のハンドルを作成する
  ExtMaHandle=iMA(Symbol(),PERIOD_CURRENT,ExtMaPeriod,InpShift,InpMethod,InpPrice);
  ResetLastError();
  if(ExtMaHandle==INVALID_HANDLE)
    {
    PrintFormat("Failed to create iMA() handle. Error code: %d",GetLastError());
    return(INIT_FAILED);
    }
   
//--- 最終価格更新時刻を取得する
  datetime tick_time=TickTime();
//--- 最後の2つのバーから移動平均データと価格データを取得する
  if(GetData(ExtMaHandle,ExtData,ExtRates) && tick_time!=0)
    {
    //--- 価格がMAを上回る場合
    if(ExtRates[1].close>ExtData[1])
       {
        //--- メッセージテキストを作成してアラートを表示する
        string message=StringFormat("Bar time: %s. The price is above the moving average",TimeToString(ExtRates[1].time));
        Alert(message+" at "+TimeToString(tick_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
        /*
        結果:
        Alert: Bar time: 2024.02.16 18:00. The price is above the moving average at 2024.02.16 18:47:43
        */
       }
    else
       {
    //--- 価格がMAを下回る場合
        if(ExtRates[1].close<ExtData[1])
          {
        //--- メッセージテキストを作成してアラートを表示する
          string message=StringFormat("Bar time: %s. The price is below the moving average.",TimeToString(ExtRates[1].time));
          Alert(message+" at "+TimeToString(tick_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
           /*
           結果:
          Alert: Bar time: 2024.02.16 19:00. The price is below the moving average at 2024.02.16 19:33:14
           */
          }
        else
          {
        //--- メッセージテキストを作成してアラートを表示する
          string message=StringFormat("Bar time: %s. The price and moving average are equal.",TimeToString(ExtRates[1].time));
          Alert(message+" at "+TimeToString(tick_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
           /*
           結果:
          Alert: Bar time: 2024.02.16 20:00. The price and moving average are equal at 2024.02.16 20:12:22
           */
          }
       }
    }
   
//--- 成功
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| エキスパートティック関数                                                 |
//+------------------------------------------------------------------+
void OnTick()
 {
  ResetLastError();
//--- 最後の2つのバーから移動平均データと価格データを取得する
  if(!GetData(ExtMaHandle,ExtData,ExtRates))
    return;
//--- 現在の足の移動平均を横切る価格の方向を取得する
  ENUM_INTERSECT_DIRECTION intersect=GetIntersectDirection(ExtData,ExtRates);
 
//--- 前のメッセージを保存するための変数
  static string message_prev="";
 
//--- 価格が現在のバーの移動平均を上向きに超えた場合
  if(intersect==INTERSECT_DIRECTION_UP)
    {
//--- 交差が発生したティック時間を取得する
    datetime tick_time=TickTime();
    if(tick_time==0)
        return;
    //--- メッセージテキストを作成する
    string message=StringFormat("Bar time: %s. The price crossed the MA from bottom to top",TimeToString(ExtRates[1].time));
//--- 前のメッセージが現在のメッセージと異なる場合は、メッセージと時間経過を含むアラートを表示する
    if(message!=message_prev)
       {
        Alert(message+" at "+TimeToString(tick_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
        message_prev=message;
        /*
        Result:\
        Alert: Bar time: 2024.02.16 09:00. The price crossed the MA from bottom to top at 2024.02.16 09:20:35
        */
       }
    }
 
//--- 価格が現在のバーの移動平均を下向きに超えた場合
  if(intersect==INTERSECT_DIRECTION_DOWN)
    {
//--- 交差が発生したティック時間を取得する
    datetime tick_time=TickTime();
    if(tick_time==0)
        return;
    //--- メッセージテキストを作成する
    string message=StringFormat("Bar time: %s. The price crossed the MA from top to bottom",TimeToString(ExtRates[1].time));
//--- 前のメッセージが現在のメッセージと異なる場合は、メッセージと時間経過を含むアラートを表示する
    if(message!=message_prev)
       {
        Alert(message+" at "+TimeToString(tick_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
        message_prev=message;
        /*
        Result:\
        Alert: Bar time: 2024.02.16 10:00. The price crossed the MA from top to bottom at 2024.02.16 10:42:15
        */
       }
    }
 }
//+------------------------------------------------------------------+
//| 価格と移動平均データを配列に取得する                                     |
//+------------------------------------------------------------------+
bool GetData(int handle,double &ma_data[],MqlRates &price_data[])
 {
  ResetLastError();
//--- 最後の2つのバーから移動平均データを取得する
  if(CopyBuffer(handle,0,0,2,ma_data)!=2)
    {
    PrintFormat("CopyBuffer() failed. Error code: %d",GetLastError());
    return(false);
    }
//--- 最後の2つのバーから価格データを取得する
  if(CopyRates(Symbol(),PERIOD_CURRENT,0,2,price_data)!=2)
    {
    PrintFormat("CopyRates() failed. Error code: %d",GetLastError());
    return(false);
    }
 
  return(true);
 }
//+------------------------------------------------------------------+
//| 移動平均を横切る価格の方向を返す                                        |
//+------------------------------------------------------------------+
ENUM_INTERSECT_DIRECTION GetIntersectDirection(double &ma_data[],MqlRates &price_data[])
 {
  double ma0=ma_data[1];
  double ma1=ma_data[0];
  double close0=price_data[1].close;
  double close1=price_data[0].close;
 
  if(close1<=ma1 && close0>ma0)
    return(INTERSECT_DIRECTION_UP);
  else
    {
    if(close1>=ma1 && close0<ma0)
        return(INTERSECT_DIRECTION_DOWN);
    else
        return(INTERSECT_DIRECTION_NONE);
    }
 }
//+------------------------------------------------------------------+
//| 秒単位でのティック時刻を返す                                             |
//+------------------------------------------------------------------+
datetime TickTime()
 {
  MqlTick tick={};
 
  ResetLastError();
  if(!SymbolInfoTick(Symbol(),tick))
    {
    PrintFormat("SymbolInfoTick() failed. Error code: %d",GetLastError());
    return(0);
    }
 
  return(tick.time);
 }