English Русский 中文 Español Deutsch Português
外部指標のためのアラートとコメント:外部スキャンに基づく多通貨分析

外部指標のためのアラートとコメント:外部スキャンに基づく多通貨分析

MetaTrader 4 | 8 12月 2015, 12:28
989 0
Vladimir
Vladimir

はじめに

前の記事では、特殊文字・記号を使用する外部指標から必要な情報を得る可能性について説明しています(「外部指標のためのアラートとコメント」)。又は、指標ブッファ上に情報を記憶する指標からのアラートについて説明しています(「外部指標のためのアラートとコメント:第二部」)。

もう一つ大切なのは、指標線の交差に基づいて指標を分析する方法です。

前に述べたように、指標バッファからデータの検索・受け方がそんなに難しくないです。それで、このテクニカル指標で多通貨の分析機能を実現してみましょう。

ずっとチャートを監視するトレーダーの目が疲れますね。それで、多くのトレーダーがいくつかの通貨ペアを選んで取引します。

このように、他の通貨ペアを考慮せず、取引成功の機会を逸することもあります。ということで、多通貨分析を自動化することが必要だと思います。

それでは、通貨ペアの変更を表示する機能としてアラート関数を使うことを提案しています。


多通貨指標のアラート

まず最初に、データ処理ブロック内のコードを見てみましょう。

double buffer1, buffer2, buffer12, buffer22;
// 前の2つのチャートのバーを分析する
            buffer1  = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff1, 1);
            buffer12 = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff1, 2);
            buffer2  = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff2, 1);
            buffer22 = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff2, 2);
            if(buffer12<=buffer22&&buffer1>buffer2)
               {
                  Alert (text+"UP"); // 交差がある
                  send_email (text+"UP");
                  return (1);
               }
            if(buffer12>=buffer22&&buffer1<buffer2)
               {
                  Alert (text+"DN"); // 交差がある
                  send_email (text+"DN");
                  return (1);
               } 
            return (0);

上記のコードからわかるように、すべてが簡単です。以前の記事では、指定したバッファを特定の色で塗りつぶす可能性について説明しました。ここで、バッファのお互いの位置値が分析で使用されます.

これ、別のコードブロックにしましょう。多通貨の分析や複数時間軸での分析を行うために超必要です。

可能な通貨ペアの一覧を外部ファイルに入れて取り込めます。そのようなアプローチは、簡単なデータ検索を可能にします。

記事の終わりでファイルの作り方の詳細を述べています。

データをファイルから読み取るサブプリグラムは以下の通りです。

//+------------------------------------------------------------------+
//|                                           SymbolList_fromSet.mq4 |
//|                                      Copyright © 2006, komposter |
//|                                      mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
void LoadFileToSymbol()
   {
      {
              int file_handle = FileOpen(SetFile_name + ".set", FILE_READ);
              //---- 間違いが起こる場合
              if(file_handle < 0)
                {
                         Print("間違い №", GetLastError(), " ファイルを開くとき!!!");
                         return(-1);
                }
              int SymbolsCount = 0;
              while(true)
                {
                         Symbols[SymbolsCount] = FileReadString(file_handle);
                         //---- ファイル最後までやり抜く場合、ストップする
                         if(GetLastError() == 4099) 
                             break;
                         if(FileIsEnding(file_handle)) 
                             break;
                         SymbolsCount ++;
                         ArrayResize(Symbols, SymbolsCount + 1);
                }
              FileClose(file_handle);
      }
   
   }  
//--------------------------------------------------------------+

通貨ペアの配列を準備した後で、複数時間軸での分析機器を作成することのみが必要です。

デフォルトに現在の時間軸から計算し始めます。

// シンボルの配列を分析する
         for (int i=0; i<ArraySize(Symbols); i++)
            {  Total = 0;
               switch (Period())
                  {
                     case 43200: Total = Total +  process ( Symbols[i], 43200);
                     case 10080: Total = Total +  process ( Symbols[i], 10080);
                     case  1440: Total = Total +  process ( Symbols[i],  1440);
                     case   240: Total = Total +  process ( Symbols[i],   240);
                     case    60: Total = Total +  process ( Symbols[i],    60);
                     case    30: Total = Total +  process ( Symbols[i],    30);
                     case    15: Total = Total +  process ( Symbols[i],    15);
                     case     5: Total = Total +  process ( Symbols[i],     5);
//                     case     1: Total = Total +  process ( Symbols[i],     1);
                  }

現在の時間軸から最小値の時間軸まで計算行われます。このように、日足から計算を行いたい場合、日足チャート上にこの指標をアクティブ化しなければなりません。1時間足から計算を行いたい場合、1時間足チャート上にこの指標をアクティブ化しなければなりません。等々。// 1バーにつき、再計算が行われます。

そのようなアプローチはテクニカル指標の再計算を簡単にしました。ただ、必要な時間軸を選択して、追加引数を入れて、必要な情報を得ます。

注意:1分足の行目をコメントアウトします。必要なければ、この行のコメントを外してください。

//                     case     1: Total = Total +  AlertComment ( Symbols[i],     1);

データ資源として、2MA_forAlert.mq4という添付ファイルの指標を使ってみましょう。2MA_forAlert - 普通のテクニカル指標で、2つの移動平均線の差をグラフにしたものです。2つの移動平均線のあるテクニカル指標の中でどれでもいいですね。スティックやMACD等。

テクニカル指標をいろいろ使ってアラートは以下のようになります。


ライン値を保存するバッファは順序が違います。例:

0 - メインライン

1 - シグナルライン

又は

0 - シグナルライン

1 - メインライン

それで、外部指標を使用する時、ラインの順序を自分で設定します。エラーの場合、追加される入力引数の値を変更しなければなりません。

extern int       ExtBuff1      = 0;
extern int       ExtBuff2      = 1;

引数として8つのバッファが可能です(0~7)。

このテクニカル指標が外部ファイルを使用するので、クライアント端末にこれをどうやって生成するかをご紹介します。

最初は、ウィンドウで必要な通貨ペアの一覧を作ります。そのためには以下のようにします。

1. すべての利用可能な通貨ペアを開く


2. 必要な通貨ペアを選択する

自分の予定どおりに選択します。


3. [Market Browse]ボタンをクリックすると、ファイルを保存できます。


4. ファイルがEAのデータファイルに保存されます。


どんなファイル名をつけても良いのですが、ファイルの拡張子を「.set」から変換できません。今の例では、「forexall.set」というファイルが使用されます。

extern string    SetFile_name  = "forexall"; // 設定した通貨ペアの記号を含むファイル

ファイルを作成した後で、ヒストリー(履歴)をロードするために、各通貨ペアのチャートを1つずつ開くことが必要です。そうでなければ、通貨ペアのデータを正しく処理しない可能性があります。

ファイルをデフォルトの\experts\symbolsetsフォルダに保存した場合、\experts\filesフォルダにコピーしてください。このフォルダだけから指標でファイルを開くことができます。次に、指標では処理するファイルの名前を入力する必要があります。

外部スキャニングのメールニュースを配信してほしい場合、引数Signal_emailにTrueを設定する必要があります。

extern bool      Signal_email  = false;

ある人は、携帯電話への転送をプログラムで実現して、携帯電話に通知を受けるようにします。人によりますね。

すべてのテクニカル指標のファイルは\experts\indicatorsフォルダに保存しなければなりません。


まとめ

このように、アラートの機能を使って、さまざまなモジュールを組み合わせて、自分で共通情報モデルを作成できます。トレーダーにとって一番大事なのは、ちょうど間に合う時間に情報を得ることです。

結論として、この指標のコードを出します。

//+------------------------------------------------------------------+
//|                                                    Alert_MT4.mq4 |
//|                                      Copyright © 2009, Fibook.ru |
//|                                             http://www.fibook.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Fibook.ru"
#property link      "http://www.fibook.ru"

#property indicator_chart_window

extern string    SetFile_name="forexall"; // 設定した通貨ペアの記号を含むファイル
extern string    nameIndicator = "指標の名前を入力して";
extern int       ExtBuff1      = 0;
extern int       ExtBuff2      = 1;
extern string    UserText      = "交差";
extern bool      Signal_email  = false;

string Symbols[1],text;
int expBars=0;
//+------------------------------------------------------------------+
//| カスタム指標の反復関数                                              |
//+------------------------------------------------------------------+
int start()
  {
// 新バーが発生しない場合、終了する
   if(!isNewBar()) return;
   int Total;
//---- 入力引数の内容をチェックする
   if(ControlError()==false) return;
//---- ファイルからSymbols配列に記号をロードする
   LoadFileToSymbol();
//----

// シンボルの配列を分析する
   for(int i=0;i<ArraySize(Symbols);i++)
     {
      Total=0;
      switch(Period())
        {
         case 43200: Total = Total +  process ( Symbols[i], 43200);
         case 10080: Total = Total +  process ( Symbols[i], 10080);
         case  1440: Total = Total +  process ( Symbols[i],  1440);
         case   240: Total = Total +  process ( Symbols[i],   240);
         case    60: Total = Total +  process ( Symbols[i],    60);
         case    30: Total = Total +  process ( Symbols[i],    30);
         case    15: Total = Total +  process ( Symbols[i],    15);
         case     5: Total = Total +  process ( Symbols[i],     5);
         //                     case     1: Total = Total +  process ( Symbols[i],     1);
        }
      if(Total>1)
        {
         text=StringConcatenate(" 注意!!!      ",Symbols[i]," は",Total, "数のTFのための", UserText,"がある");
         Alert(text);
         send_email(text);
        }
     }

//----
   return(0);
  }
//+------------------------------------------------------------------+

int process(string Sym_,int TF)
  {
   text=StringConcatenate(Sym_," ",TF," テクニカル指標",nameIndicator,"は線を交差する");
   double buffer1,buffer2,buffer12,buffer22;
// 前の2つのチャートのバーを分析する
   buffer1  = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff1, 1);
   buffer12 = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff1, 2);
   buffer2  = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff2, 1);
   buffer22 = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff2, 2);
   if(buffer12<=buffer22 && buffer1>buffer2)
     {
      Alert(text+"UP"); // 交差がある
      send_email(text+"UP");
      return(1);
     }
   if(buffer12>=buffer22 && buffer1<buffer2)
     {
      Alert(text+"DN"); // 交差がある
      send_email(text+"DN");
      return(1);
     }
   return(0);

  }
//+------------------------------------------------------------------+
//|                                           SymbolList_fromSet.mq4 |
//|                                      Copyright © 2006, komposter |
//|                                      mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+

void LoadFileToSymbol()
  {
     {
      int file_handle=FileOpen(SetFile_name+".set",FILE_READ);
      //---- 間違いが起こる場合
      if(file_handle<0)
        {
         Print("間違い№",GetLastError(),"ファイルを開くとき!!!");
         return(-1);
        }
      int SymbolsCount=0;
      while(true)
        {
         Symbols[SymbolsCount]=FileReadString(file_handle);
         //---- ファイル最後までやり抜く場合、ストップする
         if(GetLastError()==4099)
            break;
         if(FileIsEnding(file_handle))
            break;
         SymbolsCount++;
         ArrayResize(Symbols,SymbolsCount+1);
        }
      FileClose(file_handle);
     }

  }
//--------------------------------------------------------------+
void send_email(string text)
  {
   if(Signal_email==true) SendMail("アラート",text);
  }
//--------------------------------------------------------------+
bool ControlError()
  {
// 指標の名前が入力されたかどうかチェックする
   if(nameIndicator=="指標の名前を入力して")
     {
      Alert("指標の名前を入力して");
      return(false);
     }
// 記号が入るファイルの存在を確認する
   int handle;
   handle=FileOpen(SetFile_name+".set",FILE_CSV|FILE_READ,';');
   if(handle<1)
     {
      Alert("エラー:",SetFile_name,".set ファイルを見つけられません",GetLastError());
      return(false);
     }
// 入力変数の内容を確認する
   if(ExtBuff1>7 || ExtBuff2>7)
     {
      Alert("ExtBuff1バッファかExtBuff2バッファは引数が間違い");
      return(false);
     }
   if(ExtBuff1==ExtBuff2)
     {
      Alert("エラー: ExtBuff1はExtBuff2に等しくなくでなければなりません。");
      return(false);
     }

   return(true);
  }
/*--------------------------------------------------------------+
 |関数は、新バーが発生する場合、 trueを返す                          |
 +--------------------------------------------------------------*/
bool isNewBar()
  {
   bool res=false;
   if(expBars!=Bars)
     {
      expBars=Bars;
      res=true;
     }
   return(res);
  }
//+------------------------------------------------------------------+

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1371

添付されたファイル |
2MA_forAlert.mq4 (5.04 KB)
Alert_MT4.mq4 (11.6 KB)
行列代数ライブラリ『LibMatrix』(第一部) 行列代数ライブラリ『LibMatrix』(第一部)
著者は読者に簡単な行列代数ライブラリを紹介します。主要な機能とその特徴を見ていきます。
MQL5 クックブック:異なるプリントモードの使用 MQL5 クックブック:異なるプリントモードの使用
本稿は MQL5 クックブックシリーズの始まりです。プログラミングの最初の一歩を踏み出そうとしている方が徐々に新しい言語の知識を得ることができるようにシンプルな例を使って始めます。私自身、とても困難だったと言える最初にトレードシステムを設計しプログラムする上での努力を覚えています。それが私の人生で最初のプログラム言語だったという事実があります。それでも思ったより簡単であることが判り、かなり複雑なプログラムを作成できるまで数か月しかかかりませんでした。
「チュヴァショーフのフォーク」という取引システム 「チュヴァショーフのフォーク」という取引システム
この記事では、スタニスラブ・チュヴァショーフで作成された取引システムの特徴とソースコードについて説明しています。この相場の状態を分析する方法がトーマス・デマークで作成された「一番近い時間帯のためのトレンドラインを作成するために基準点としてフラクタルを使う」方法に似ています。
MQL5クラウドネットワーク:まだ計算しているのですか? MQL5クラウドネットワーク:まだ計算しているのですか?
MQL5クラウドネットワークのサービスが開始してから、一年と半年ほど経過しました。この先進的な出来事はアルゴリズムによるトレーディングの新しい時代を開きました。今では、クリック数回で、トレーディング戦略の最適化のために自由に何千ものCPUを使用することができます。