| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「MT4」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の57版が非表示)
1行目: 1行目:
 
==MT4==
 
==MT4==
 
{{amazon|B017HFIIEA}}
 
{{amazon|B017HFIIEA}}
 +
*[https://mql4.metasys-seeker.com/category/index/ MQL4リファレンス]
 +
*[https://www.mql5.com/ja/docs MQL5リファレンス]
 
===プログラムの種類===
 
===プログラムの種類===
 
*種類によって保存される場所が異なる
 
*種類によって保存される場所が異なる
24行目: 26行目:
 
*チャートに挿入すると、価格の変化に応じて自動売買のできるプログラム
 
*チャートに挿入すると、価格の変化に応じて自動売買のできるプログラム
 
*過去のデータに対して仮想売買を実行し結果を表示するバックテストにも利用可能
 
*過去のデータに対して仮想売買を実行し結果を表示するバックテストにも利用可能
 +
 +
==売買注文==
 +
===メタトレーダーで出せる注文===
 +
#成行注文
 +
##その時点での買い気配や売り気配ですぐにポジションを建てる
 +
#逆指値注文
 +
##待機注文の一種
 +
##価格が一定になったら、成り行きで注文を建てる
 +
##買いの逆指値は現在価格の上、売りの逆指値は現在価格の下に置かれる
 +
##価格がその水準まで上昇、下落して、その後もそのポジションに動いて利益を生むことを想定する
 +
#指値注文
 +
##逆指値注文の逆
 +
##価格がその水準まで上昇、下落したのち、反転して利益を生むことを想定する
 +
##自動売買ではあまり使われない
 +
 +
==基本==
 
===コンパイル===
 
===コンパイル===
 
*ソースコードは拡張子、mq4
 
*ソースコードは拡張子、mq4
29行目: 47行目:
 
[[File:mt4_programming_compile.png|600px]]
 
[[File:mt4_programming_compile.png|600px]]
  
===実行手順===
+
===変数===
#ファイル-新規作成 からウィザードでスクリプトを作成
+
----
#コーディングして、コンパイル
+
====定義済変数====
#ナビゲーターウィンドウに出現するので、チャートにドロップ
 
#ターミナルウィンドウ「エキスパート」に出力された
 
[[File:mt4_dev_proc.png|600px]]
 
 
 
*スクリプトをはじめ、MT4で作成するあらゆるプログラムは、チャートに挿入して実行される
 
===定義済変数===
 
 
----
 
----
 
{| class="wikitable"
 
{| class="wikitable"
101行目: 113行目:
 
|-
 
|-
 
|}
 
|}
 +
====外部変数====
 +
----
 +
*トレーディングシステムに対して調整可能なパラメータ
 +
*トレードやインディケーターの設定を行う
 +
*変数の前に、extern をつけて宣言
 +
 
===組込関数===
 
===組込関数===
 
----
 
----
*https://www.mql5.com/ja/docs
+
*[https://www.mql5.com/ja/docs MQL5リファレンス]
 +
 
 
===定義済変数===
 
===定義済変数===
 
----
 
----
129行目: 148行目:
 
|  
 
|  
 
|  
 
|  
 +
|-
 +
|}
 +
===プリプロセッサ===
 +
----
 +
{| class="wikitable"
 +
|-
 +
! scope="col"| プリプロセッサ定義
 +
! scope="col"| 意味
 +
! scope="col"| 備考
 +
|-
 +
| #property indicator_chart_window
 +
| 指標をチャートと同じウインドウに表示
 +
|
 +
|-
 +
| #property indicator_separate_window
 +
| 指標をチャートと別のウインドウに表示
 +
|
 +
|-
 +
| #property indicator_buffers N
 +
| プロットさせる指標の数(N)
 +
|
 +
|-
 +
| #propertyindicator_typeN
 +
| 指標の種類を指定
 +
| Nの部分は、1 - 512 を指定
 +
|-
 +
| #propertyindicator_colorN
 +
| 指標の色を指定
 +
| 例:#propertyindicator_color1clrRed
 +
|-
 +
| #propertyindicator_styleN
 +
| 指標の線種
 +
| STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT 例:#propertyindicator_style1STYLE_DOT
 +
|-
 +
| #propertyindicator_widthN
 +
| 指標の太さ
 +
| 例 #propertyindicator_width1 2
 +
|-
 +
|
 +
|
 +
|-
 +
|
 +
|
 +
|-
 +
|
 +
|
 
|-
 
|-
 
|}
 
|}
152行目: 217行目:
 
|-
 
|-
 
|}
 
|}
===カスタム指標プログラミン===
+
===関数のインポート===
 +
----
 +
<pre>
 +
#import "library.ex4"
 +
    double MyFunction();
 +
#import
 +
</pre>
 +
 
 +
==プログラミング==
 +
===スクリプト実行手順===
 +
#ファイル-新規作成 からウィザードでスクリプトを作成
 +
#コーディングして、コンパイル
 +
#ナビゲーターウィンドウに出現するので、チャートにドロップ
 +
#ターミナルウィンドウ「エキスパート」に出力された
 +
[[File:mt4_dev_proc.png|600px]]
 +
 
 +
*スクリプトをはじめ、MT4で作成するあらゆるプログラムは、チャートに挿入して実行される
 +
 
 +
===カスタム指標(インディケーター)プログラミング===
 
----
 
----
 +
*よく利用されるインディケーターとして、移動平均線や、ストキャスティックスなどがある
 +
*カスタム指標は、チャート上にテクニカル指標データを順次プロットしていく
 +
*プログラムは、チャート上の価格が更新されるたびに繰り返し実行される
 +
====表示方法====
 +
----
 +
*配列を指標バッファにSetIndexBuffer()関数を用いて関連づける
 +
*新規作成-カスタムインディケーター
 +
 +
<pre>
 +
#property indicator_separate_window
 +
#property indicator_buffers 1
 +
 +
double buf[];
 +
//+------------------------------------------------------------------+
 +
//| Custom indicator initialization function                        |
 +
//+------------------------------------------------------------------+
 +
int OnInit()
 +
  {
 +
//--- indicator buffers mapping
 +
  SetIndexBuffer(0, buf);
 +
//---
 +
  return(INIT_SUCCEEDED);
 +
  }
 +
//+------------------------------------------------------------------+
 +
//| Custom indicator iteration function                              |
 +
//+------------------------------------------------------------------+
 +
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[])
 +
  {
 +
//---
 +
  for(int i=0; i<5; i++) {
 +
      buf[i] = close[i];
 +
  }
 +
//--- return value of prev_calculated for next call
 +
  return(rates_total);
 +
  }
 +
//+------------------------------------------------------------------+
 +
</pre>
 +
 +
[[File:mt4_custom_indicator.png|800px]]
 +
 +
===エキスパートアドバイザプログラミング===
 +
----
 +
*一般にEAはインディケーターを使って売買シグナルを点灯させる
 +
====EA例====
 +
----
 +
<pre>
 +
#property strict
 +
 +
input int FastMAPeriod = 10;
 +
input int SlowMAPeriod = 40;
 +
input double Lots = 0.1;
 +
 +
int Ticket = 0;
 +
 +
int OnInit()
 +
  {
 +
  return(INIT_SUCCEEDED);
 +
  }
 +
void OnDeinit(const int reason)
 +
  {
 +
  }
 +
void OnTick()
 +
  {
 +
  double FastMA1 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
 +
  double SlowMA1 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
 +
  double FastMA2 = iMA(_Symbol, 0 ,FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
 +
  double SlowMA2 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
 +
 
 +
  int pos = 0;
 +
  if (OrderSelect(Ticket, SELECT_BY_TICKET) && OrderCloseTime() == 0)
 +
  {
 +
      if (OrderType() == OP_BUY)
 +
      {
 +
        pos = 1;
 +
      }
 +
      if (OrderType() == OP_SELL)
 +
      {
 +
        pos = -1;
 +
      }
 +
  }
 +
 
 +
  bool ret;
 +
  if (FastMA2 <= SlowMA2 && FastMA1 > SlowMA1)
 +
  {
 +
      if (pos < 0)
 +
      {
 +
        ret = OrderClose(Ticket, OrderLots(), OrderClosePrice(), 0);
 +
        if (ret)
 +
        {
 +
            pos = 0;
 +
        }
 +
      }
 +
      if (pos == 0)
 +
      {
 +
        Ticket = OrderSend(_Symbol, OP_BUY, Lots, Ask, 0, 0, 0);
 +
      }
 +
  }
 +
  if (FastMA2 >= SlowMA2 && FastMA1 < SlowMA1)
 +
  {
 +
      if (pos > 0)
 +
      {
 +
        ret = OrderClose(Ticket, OrderLots(), OrderClosePrice(), 0);
 +
        if (ret)
 +
        {
 +
            pos = 0;
 +
        }
 +
      }
 +
      if (pos == 0)
 +
      {
 +
        Ticket = OrderSend(_Symbol, OP_SELL, Lots, Bid, 0, 0, 0);
 +
      }
 +
  }
 +
  }
 +
</pre>
 +
 +
====ヒストリーセンター====
 +
----
 +
*メニュー - ツール - ヒストリーセンター
 +
*通貨ペアと足を選択し、ダウンロード
 +
*上記ストラテジーテスターを実行
 +
*[https://www.fxddtrading.com/bm/jp/resources/mt4-one-minute-data ヒストリカルデータダウンロード]
 +
[[File:mt4_history_center.png|500px]]
 +
 +
*https://efxcursion.com/812.html
 +
====バックテスト====
 +
----
 +
*EAを過去のチャート上で仮想的に動作させること
 +
*MT4ではストラテジーテスターという機能が搭載されている
 +
*メニュー - 表示 - ストラテジーテスター で表示される
 +
[[File:mt4_storategy_tester.png|600px]]
 +
 +
*結果
 +
[[File:mt4_backtest_chart.png|700px]]
 +
*レポート
 +
[[File:mt4_backtest_result_report.png|400px]]
 +
 +
===ボリンジャーバンド===
 +
ボリンジャーバンドの上位ライン、下位ラインは、一定期間の価格の標準偏差に比例した幅をもつため、値動きが大きくなると幅が広がります。通常は、価格がその上下ラインを超えることはないのですが、さらに値動きが大きくなると、上下ラインを超える場合が出てきます。その状態を、買われ過ぎ、売られ過ぎと判断すると、そのうち価格が元の移動平均に戻ると期待できます。そのような想定にもとづくと、下図のように価格が上位ラインを上抜けたときに売りシグナル、下位ラインを下抜けたときに買いシグナルとする方法が考えられます。これがいわゆる「逆張り(カウンタートレンド)」のシステムです。
 +
 +
 +
==Tips==
 +
===[[Visual Studio Code]]===
 +
*https://fx-ai-trading.com/fx/mql/vs-code.html
 +
*https://creator.fx-ea-system-project.com/mql-programming/visual-studio-code/
 +
 +
*ExtensionをMQL4で検索し、以下をインストール
 +
[[File:mt4_vscode_extension.png|700px]]
 +
 +
*コンパイラの設定
 +
[[File:mt4_vscode_estention_compiler_setttings.png|500px]]
 +
*メタエディタパスの設定
 +
[[file:mt4_vscode_extension_metaeditor_path.png|600px]]
 +
 +
====[[Mac]]====
 +
[https://www.typea.info/blog/index.php/2021/06/06/mt4_dev_mac_vscode_method/ MetaTrader4 開発をMacとVisual Studio Codeで行う手順]

2021年10月24日 (日) 13:30時点における最新版

MT4

プログラムの種類

  • 種類によって保存される場所が異なる
  • 保存フォルダ一覧を開くには、ファイル-データフォルダを開く
  • プログラムファイルなどは、MQL4フォルダ以下に格納される
    • mac の場合、/Users/{ユーザー名}/Library/Application Support/MetaTrader 4/Bottles/metatrader4/drive_c/Program Files/MetaTrader 4/MQL4 が物理的な場所

Mt4 mac filelocation.png

スクリプト(Script)


  • Scriptsフォルダに保存される
  • 複数の処理をまとめて実行
  • チャートに挿入すると一度だけ実行
    • 口座情報や通貨ペア情報の取得
    • 過去のチャートデータの一斉処理

カスタム指標(Custom Indicator)

  • Indecatorsフォルダに保存される
  • MT4にすでに組み込まれているテクニカル指標と同様に、チャートに挿入することで独自に作成したテクニカル指標をチャートにプロットする

エキスパートアドバイザー(Expert Advisor,EA)

  • Expertsフォルダに保存される
  • チャートに挿入すると、価格の変化に応じて自動売買のできるプログラム
  • 過去のデータに対して仮想売買を実行し結果を表示するバックテストにも利用可能

売買注文

メタトレーダーで出せる注文

  1. 成行注文
    1. その時点での買い気配や売り気配ですぐにポジションを建てる
  2. 逆指値注文
    1. 待機注文の一種
    2. 価格が一定になったら、成り行きで注文を建てる
    3. 買いの逆指値は現在価格の上、売りの逆指値は現在価格の下に置かれる
    4. 価格がその水準まで上昇、下落して、その後もそのポジションに動いて利益を生むことを想定する
  3. 指値注文
    1. 逆指値注文の逆
    2. 価格がその水準まで上昇、下落したのち、反転して利益を生むことを想定する
    3. 自動売買ではあまり使われない

基本

コンパイル

  • ソースコードは拡張子、mq4
  • コンパイルすると、ex4

Mt4 programming compile.png

変数


定義済変数


変数 意味 備考
Bid 売値
Ask 買値
Open 始値 配列
High 高値 配列
Low 安値 配列
Close 終値 配列
_Symbol 通貨ペア名
_Point 通貨ペアごとの異なる最小値幅
_Digit 小数点以下桁数
_Period 現在のチャートのタイムフレーム(分)換算

外部変数


  • トレーディングシステムに対して調整可能なパラメータ
  • トレードやインディケーターの設定を行う
  • 変数の前に、extern をつけて宣言

組込関数


定義済変数


取引関数


  • 自動売買を許可する必要がある
  • ツール-オプション -エキスパートアドバイザ タブ - 自動売買を許可する にチェック

Et4 ordersend.png

定義済関数 意味 備考
OrderSend 取引操作の実行に使用され、リクエストを取引サーバに送信

プリプロセッサ


プリプロセッサ定義 意味 備考
#property indicator_chart_window 指標をチャートと同じウインドウに表示
#property indicator_separate_window 指標をチャートと別のウインドウに表示
#property indicator_buffers N プロットさせる指標の数(N)
#propertyindicator_typeN 指標の種類を指定 Nの部分は、1 - 512 を指定
#propertyindicator_colorN 指標の色を指定 例:#propertyindicator_color1clrRed
#propertyindicator_styleN 指標の線種 STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT 例:#propertyindicator_style1STYLE_DOT
#propertyindicator_widthN 指標の太さ 例 #propertyindicator_width1 2

口座情報

定義済関数 意味 備考
AccountInfoString 口座のプロパティの値を返します プロパティ
AccountInfoInteger 口座のプロパティの値を返します プロパティ
AccountInfoDouble 口座のプロパティの値を返します プロパティ

関数のインポート


#import "library.ex4"
    double MyFunction();
#import

プログラミング

スクリプト実行手順

  1. ファイル-新規作成 からウィザードでスクリプトを作成
  2. コーディングして、コンパイル
  3. ナビゲーターウィンドウに出現するので、チャートにドロップ
  4. ターミナルウィンドウ「エキスパート」に出力された

Mt4 dev proc.png

  • スクリプトをはじめ、MT4で作成するあらゆるプログラムは、チャートに挿入して実行される

カスタム指標(インディケーター)プログラミング


  • よく利用されるインディケーターとして、移動平均線や、ストキャスティックスなどがある
  • カスタム指標は、チャート上にテクニカル指標データを順次プロットしていく
  • プログラムは、チャート上の価格が更新されるたびに繰り返し実行される

表示方法


  • 配列を指標バッファにSetIndexBuffer()関数を用いて関連づける
  • 新規作成-カスタムインディケーター
#property indicator_separate_window
#property indicator_buffers 1

double buf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, buf);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   for(int i=0; i<5; i++) {
      buf[i] = close[i];
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Mt4 custom indicator.png

エキスパートアドバイザプログラミング


  • 一般にEAはインディケーターを使って売買シグナルを点灯させる

EA例


#property strict

input int FastMAPeriod = 10;
input int SlowMAPeriod = 40;
input double Lots = 0.1;

int Ticket = 0;

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
  }
void OnTick()
  {
   double FastMA1 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   double SlowMA1 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   double FastMA2 = iMA(_Symbol, 0 ,FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
   double SlowMA2 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
   
   int pos = 0;
   if (OrderSelect(Ticket, SELECT_BY_TICKET) && OrderCloseTime() == 0)
   {
      if (OrderType() == OP_BUY) 
      {
         pos = 1;
      }
      if (OrderType() == OP_SELL)
      {
         pos = -1;
      }
   }
   
   bool ret;
   if (FastMA2 <= SlowMA2 && FastMA1 > SlowMA1)
   {
      if (pos < 0)
      {
         ret = OrderClose(Ticket, OrderLots(), OrderClosePrice(), 0);
         if (ret) 
         {
            pos = 0;
         }
      }
      if (pos == 0) 
      {
         Ticket = OrderSend(_Symbol, OP_BUY, Lots, Ask, 0, 0, 0);
      }
   }
   if (FastMA2 >= SlowMA2 && FastMA1 < SlowMA1)
   {
      if (pos > 0)
      {
         ret = OrderClose(Ticket, OrderLots(), OrderClosePrice(), 0);
         if (ret)
         {
            pos = 0;
         }
      }
      if (pos == 0) 
      {
         Ticket = OrderSend(_Symbol, OP_SELL, Lots, Bid, 0, 0, 0);
      }
   }
  }

ヒストリーセンター


Mt4 history center.png

バックテスト


  • EAを過去のチャート上で仮想的に動作させること
  • MT4ではストラテジーテスターという機能が搭載されている
  • メニュー - 表示 - ストラテジーテスター で表示される

Mt4 storategy tester.png

  • 結果

Mt4 backtest chart.png

  • レポート

Mt4 backtest result report.png

ボリンジャーバンド

ボリンジャーバンドの上位ライン、下位ラインは、一定期間の価格の標準偏差に比例した幅をもつため、値動きが大きくなると幅が広がります。通常は、価格がその上下ラインを超えることはないのですが、さらに値動きが大きくなると、上下ラインを超える場合が出てきます。その状態を、買われ過ぎ、売られ過ぎと判断すると、そのうち価格が元の移動平均に戻ると期待できます。そのような想定にもとづくと、下図のように価格が上位ラインを上抜けたときに売りシグナル、下位ラインを下抜けたときに買いシグナルとする方法が考えられます。これがいわゆる「逆張り(カウンタートレンド)」のシステムです。


Tips

Visual Studio Code

  • ExtensionをMQL4で検索し、以下をインストール

Mt4 vscode extension.png

  • コンパイラの設定

Mt4 vscode estention compiler setttings.png

  • メタエディタパスの設定

Mt4 vscode extension metaeditor path.png

Mac

MetaTrader4 開発をMacとVisual Studio Codeで行う手順