指定の証拠金維持率以下になった時にLINEとアラートで通知するEA
今回は、指定の証拠金維持率以下になった場合にLINEとアラートで通知するEAを作っていきたいと思います。
基本的には過去のソースコードを組み合わせてしまえばできてしまいます。
メタエディタ(MetaEditor)を立ち上げる
メタエディタ(MetaEditor)を立ち上げましょう。今回は名前を「MagineCole-Alert-LINE」で作成します。
パラメーターを記述する
パラメーターを記述しましょう。
LINEに通知するためのアクセストークンを記述します。
input string Line_token = "";//LINEのアクセストークン
LINE Notifyの設定は以下の記事を参照してください。
次に証拠金維持率以下になった場合にLINEに送りたいメッセージを記入しましょう。
input string Send_Massage = "";//LINEに送りたいメッセージ
次にアラートとLINE通知のON/OFFを記述します。
input bool MarginAlert = True;//アラートのオン・オフ input bool MarginLine = True;//LINE通知のオン・オフ
最後に証拠金維持率の基準を設定しておきましょう。
input int MarginAlertPer = 300;//証拠金維持率の基準
これでパラメーターを記述は完了です。
input string Line_token = "";//LINEのアクセストークン input string Send_Massage = "";//LINEに送りたいメッセージ input bool MarginAlert = True;//アラートのオン・オフ input bool MarginLine = True;//LINE通知のオン・オフ input int MarginAlertPer = 300;//証拠金維持率の基準
OnTick()関数を記述する
OnTick()関数を記述していきましょう。まずはマージンコールの変数を用意します。
double MarginPer = 0;//マージンコールの変数
次に証拠金維持率を計算します。
証拠金維持率の計算式は、「(純資産額-注文証拠金)÷ポジション必要証拠金×100」で算出します。
AccountEquity()の関数は、現在アカウントの有効証拠金の関数です。
AccountMargin()の関数は、取引口座の現在の必要証拠金額である、
現在の保有ポジションを維持するために必要な金額を取得するための関数です。
現在アカウントの有効証拠金/必要証拠金額*100で証拠金維持率を計算します。
MarginPer = AccountEquity()/AccountMargin()*100;//現在の証拠金維持率の計算
アラートがONで証拠金維持率以下の場合に
if(MarginAlert && MarginAlertPer>=MarginPer)//アラートがONで証拠金維持率以下の場合
アラートを鳴らします。
Alert(DoubleToStr(MarginPer, Digits) + "(%)");//アラートを鳴らす
同様にLINE通知がONで証拠金維持率以下の場合に
if(MarginLine && MarginAlertPer>=MarginPer)//LINE通知がONで証拠金維持率以下の場合
LINEに通知を送ります。
LineNotify(Line_token,Send_Massage);//LineNotifyを呼び出し
これでOnTick()関数を記述は完了です。
double MarginPer = 0;//マージンコールの変数 MarginPer = AccountEquity()/AccountMargin()*100;//現在の証拠金維持率の計算 if(MarginAlert && MarginAlertPer>=MarginPer)//アラートがONで証拠金維持率以下の場合 { Alert(DoubleToStr(MarginPer, Digits) + "(%)");//アラートを鳴らす } if(MarginLine && MarginAlertPer>=MarginPer)//LINE通知がONで証拠金維持率以下の場合 { LineNotify(Line_token,Send_Massage);//LineNotifyを呼び出し }
LineNotify関数を記述する
LineNotify関数の記述しましょう。変数をまず設定します。
string headers; char data[], result[];
headersの変数にコンテンツタイプを使用した単純なフォームを入れます。
- Authorization: Bearer
- Token
- \r\n application/x-www-form-urlencoded\r\n
をheadersに代入します。
headers="Authorization: Bearer "+Token+"\r\n application/x-www-form-urlencoded\r\n";
ArrayResize()は最初の次元のサイズを新しく設定します。
StringToCharArray()は文字列をchar型配列にコピーする関数です。
StringToCharArray()は以下の引数になっています。
int StringToCharArray( string text_string, // コピー元の文字列 uchar &array[], // コピー先配列 ※参照渡し int start = 0, // コピー開始する配列インデックス int count = -1, // コピーする文字数 uint codepage = CP_ACP // コードページ );
それらの情報を以下のように記載していきます。
ArrayResize(data,StringToCharArray("message="+Massage,data,0,WHOLE_ARRAY,CP_UTF8)-1);
WebRequest()関数は指定したサーバーにHTTPリクエストを送ります。
WebRequest()関数は以下の記事を参照してください。
int res = WebRequest("POST", "https://notify-api.line.me/api/notify", headers, 0, data, data, headers);
resの値が-1であれば、
if(res==-1)
エラーコードを出します。
Print("Error in WebRequest. Error code =",GetLastError()); MessageBox("Add the address 'https://notify-api.line.me' in the list of allowed URLs on tab 'Expert Advisors'","Error",MB_ICONINFORMATION);
これでLineNotify関数を記述は完了です。
void LineNotify(string Token,string Massage) { string headers;//ヘッダー char data[], result[];//データ、結果 headers="Authorization: Bearer "+Token+"\r\n application/x-www-form-urlencoded\r\n"; ArrayResize(data,StringToCharArray("message="+Massage,data,0,WHOLE_ARRAY,CP_UTF8)-1); int res = WebRequest("POST", "https://notify-api.line.me/api/notify", headers, 0, data, data, headers); if(res==-1) //エラーの場合 { Print("Error in WebRequest. Error code =",GetLastError()); MessageBox("Add the address 'https://notify-api.line.me' in the list of allowed URLs on tab 'Expert Advisors'","Error",MB_ICONINFORMATION); } }
コンパイルする
コンパイルして実際の動きを確認して動いていたら完了です。
ちなみにこれはリアルトレードの場合は使えますが、バックテスト時には使えません。
なので、バックテスト時にはコメントアウトなどしてリアルトレード時のみ使うようにしてください。
ソースコード全体
//+------------------------------------------------------------------+ //| MagineCole-Alert-LINE.mq4 | //| Copyright 2020, FX-EA System Project Creator | //| https://creator.fx-ea-system-project.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, FX-EA System Project Creator" #property link "https://creator.fx-ea-system-project.com/" #property version "1.00" #property strict /*パラメーター*/ input string Line_token = "";//LINEのアクセストークン input string Send_Massage = "";//LINEに送りたいメッセージ input bool MarginAlert = True;//アラートのオン・オフ input bool MarginLine = True;//LINE通知のオン・オフ input int MarginAlertPer = 300;//証拠金維持率の基準 //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- double MarginPer = 0;//マージンコールの変数 MarginPer = AccountEquity()/AccountMargin()*100;//現在の証拠金維持率の計算 if(MarginAlert && MarginAlertPer>=MarginPer)//アラートがONで証拠金維持率以下の場合 { Alert(DoubleToStr(MarginPer, Digits) + "(%)");//アラートを鳴らす } if(MarginLine && MarginAlertPer>=MarginPer)//LINE通知がONで証拠金維持率以下の場合 { LineNotify(Line_token,Send_Massage);//LineNotifyを呼び出し } } //+------------------------------------------------------------------+ void LineNotify(string Token,string Massage) { string headers;//ヘッダー char data[], result[];//データ、結果 headers="Authorization: Bearer "+Token+"\r\n application/x-www-form-urlencoded\r\n"; ArrayResize(data,StringToCharArray("message="+Massage,data,0,WHOLE_ARRAY,CP_UTF8)-1); int res = WebRequest("POST", "https://notify-api.line.me/api/notify", headers, 0, data, data, headers); if(res==-1) //エラーの場合 { Print("Error in WebRequest. Error code =",GetLastError()); MessageBox("Add the address 'https://notify-api.line.me' in the list of allowed URLs on tab 'Expert Advisors'","Error",MB_ICONINFORMATION); } }
まとめ
今回はアラートとLINEに通知を送るという2つの行いましたが、
これにメールアドレスに送信したりなども追加で改良することが可能です。
コメント