こんにちは~。
MQLをマスターしたくて、花粉が怖くて外に出れないりょうです。
今回は、前回作成したEAをちょっと手直ししてみようという試みです。
決済の条件を付けよう
前回作成したEAは、初めてのEA作成なので「とりあえず動かせる」ことだけを考えて作りました。
その結果『エントリーだけをするEA』になってしまったのでちょっと修正してみます。
直してみた結果がこちらです↓。
//+------------------------------------------------------------------+
//| GoldenCloss.mq4 |
//| Copyright 2021, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit() {
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick() {
//1本前のローソク足の移動平均線の値を取得する(短期・長期)
double MAShort0 = iMA( NULL, PERIOD_CURRENT, 7, 0, MODE_SMA, PRICE_CLOSE, 0 );
double MALong0 = iMA( NULL, PERIOD_CURRENT, 21, 0, MODE_SMA, PRICE_CLOSE, 0 );
//2本前のローソク足の移動平均線の値を取得する(短期・長期)
double MAShort1 = iMA( NULL, PERIOD_CURRENT, 7, 0, MODE_SMA, PRICE_CLOSE, 1 );
double MALong1 = iMA( NULL, PERIOD_CURRENT, 21, 0, MODE_SMA, PRICE_CLOSE, 1 );
//決済条件 エントリーが1つでもあればforループを回す 1本前に陰線が出たら決済
for( int i = OrdersTotal() - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true) {
if(Close[1] < Open[1]) {
int result = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), 2 );
}
}
}
//エントリー条件 ゴールデンクロスでエントリー
if(MAShort1 < MALong1 && MAShort0 > MALong0) {
int result = OrderSend( Symbol(), OP_BUY, 0.01, Ask, 20, 0, 0 );
}
}
//+------------------------------------------------------------------+
テストをした結果がこちらです↓。
相変わらずエントリーはめちゃくちゃですが、エントリーしっぱなしではなくちゃんと決済してくれるようになりました!
決済条件がこちらです↓。
for( int i = OrdersTotal() - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true) {
if(Close[1] < Open[1]) {
int result = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), 2 );
}
}
}
OrderSelect()関数・・・注文を選択する関数 trueかfalseを返す
SELECT_BY_POS・・・注文のインデックスによる選択
MODE_TRADES・・・現在の取引プールから選択
OrderClose()関数・・・ポジションを決済する関数
OrderTicket()・・・注文のチケット番号を返す
OrderLots()・・・注文のロット数を返す
OrderClosePrice()・・・現在の決済価格を返す
2・・・許容スリッページ 今回は2と設定しています
陰線が出たら決済という条件にしているのですぐ決済しますが、とにかく『エントリー → 決済』という一連の流れでEAを作ることができました!
これであとはいろんなテクニカル分析を勉強したらいい感じのEAをつくれるぞ!!
それが大変なんだけどね
そうなんだよね・・・
『//』で作ったコードに注釈を付けよう
あと変更した点と言えば、
//1本前のローソク足の移動平均線の値を取得する(短期・長期)
//2本前のローソク足の移動平均線の値を取得する(短期・長期)
//決済条件 エントリーが1つでもあればforループを回す 1本前に陰線が出たら決済
//エントリー条件 ゴールデンクロスでエントリー
この部分となります。
『//』を入れると『//』より右からコメントを入れることができるようになります。
ソースコードとして意味は持たない文字になるので、メモや解説を入れるのに便利です。
長いソースコードはどこに何を書いたかわからなくなるにゃ
ちゃんと「このコードは何をしているか」を書くようにした方が今後の自分の為になるね
かくして、りょうはMQLの基本中の基本を習得したのであった