「EA開発を始めたものの、CTradeクラスの使い方がわからない…」
「サンプルコードをコピペしても、エラーばかりで動かない…」
「公式ドキュメントを読んでも、実践的な使い方がイマイチ分からない…」
そんな悩みを抱えているトレーダーの方も多いのではないでしょうか。
実は私も最初のEA開発で同じような壁にぶつかりました。
でも、基本さえ押さえれば、CTradeクラスを使ったEA開発は思ったより簡単です。
この記事では、プログラミング初心者でも理解できるよう、実践的なコード例を交えながらCTradeクラスの使い方を解説していきます。
記事の内容を理解して実践すれば、あなたも基本的なEAを開発できるようになります。
目次
CTradeクラスとは?基礎から理解しよう
MT5でEAを開発するなら、避けて通れないのがCTradeクラスです。
まずは基本的な役割から、具体的にできることまでをしっかり押さえていきましょう。
CTradeクラスの役割
CTradeクラスは、MT5で注文を出すための便利な道具箱のようなものです。
従来のOrderSendやOrderCloseといった関数を使う方法と比べて、格段に扱いやすくなっています。
たとえば、従来の方法だと注文を出すために10行以上のコードが必要でした。
でもCTradeクラスを使えば、たった2~3行で同じことができます。
さらに、エラー処理も簡単になり、コードの信頼性が高まります。
CTradeクラスでできること
CTradeクラスを使えば、トレードに必要なほとんどの操作が簡単にできます。
主な機能を見ていきましょう。
注文の発注と決済
- 成行注文を出す
- 指値・逆指値注文を出す
- 保有ポジションを決済する
ポジション管理
- 現在のポジション情報を取得
- 注文の修正や取り消し
- 損切り・利確注文の設定
これらの操作が、シンプルなコードで実現できます。
実際のトレードでは、移動平均線のクロスや、RSIの条件でエントリーを判断する際に使います。
また、複数の条件を組み合わせた複雑な売買ルールも、CTradeクラスを使えば簡単に実装できます。
次の章では、具体的な使い方とコード例を見ていきましょう。
CTradeクラスの基本的な使い方
いよいよ実践的な内容に入っていきます。
まずは開発の準備から、基本的な注文方法までを、具体的なコード例を使って解説していきます。
準備の仕方
EAでCTradeクラスを使うには、まず以下のコードをファイルの先頭に書く必要があります。
#include <Trade\Trade.mqh>
CTrade trade; // tradeという名前でCTradeオブジェクトを作成
次に、OnInitで基本的な設定を行います。
int OnInit()
{
trade.SetExpertMagicNumber(123456); // マジックナンバーの設定
trade.SetDeviationInPoints(10); // 許容スリッページ
trade.SetTypeFilling(ORDER_FILLING_IOC);// 注文の約定方法
return(INIT_SUCCEEDED);
}
これだけで準備は完了です。
基本的な注文方法
注文を出すときは、Buy()やSell()などのシンプルな関数を使います。
例えば、0.1ロットの買い注文を出す例
if(!trade.Buy(0.1)) // 0.1ロットの買い注文
{
Print("注文エラー:", trade.ResultRetcode());
return;
}
売り注文も同じように簡単です。
if(!trade.Sell(0.1)) // 0.1ロットの売り注文
{
Print("注文エラー:", trade.ResultRetcode());
return;
}
指値注文を出すときは、価格を指定します。
double price = SymbolInfoDouble(_Symbol, SYMBOL_ASK) + 100 * _Point;
if(!trade.BuyLimit(0.1, price)) // 指値買い注文
{
Print("注文エラー:", trade.ResultRetcode());
return;
}
ポジションの決済も簡単です。
if(!trade.PositionClose(_Symbol)) // 現在のポジションを決済
{
Print("決済エラー:", trade.ResultRetcode());
return;
}
その他の関数は公式サイトでご確認ください。
実践!シンプルなEAの作り方
いよいよ実践的なEAの作り方を解説します。
よく使われる2つのインジケーターを使った売買ルールを実装してみましょう。
移動平均線を使った売買の実装例
2本の移動平均線のクロスでエントリーする、シンプルなEAを作ってみましょう。
// 移動平均線クロスEA with TP/SL
#include <Trade\Trade.mqh>
CTrade trade;
// 入力パラメーター
input int MA_FAST_PERIOD = 5; // 短期移動平均線の期間
input int MA_SLOW_PERIOD = 20; // 長期移動平均線の期間
input double TP_POINTS = 300; // 利確幅(ポイント)
input double SL_POINTS = 100; // 損切り幅(ポイント)
input double LOT_SIZE = 0.1; // 取引ロット数
void OnInit()
{
trade.SetExpertMagicNumber(123456); // マジックナンバーの設定
trade.SetDeviationInPoints(10); // 許容スリッページ
trade.SetTypeFilling(ORDER_FILLING_IOC);// 注文の約定方法
}
void OnTick()
{
// 現在のポジション数をチェック
int positions = PositionsTotal();
if(positions > 0) return; // ポジションがある場合は新規注文を出さない
// 移動平均線の値を取得
double maFast = iMA(_Symbol, PERIOD_CURRENT, MA_FAST_PERIOD, 0, MODE_SMA, PRICE_CLOSE);
double maSlow = iMA(_Symbol, PERIOD_CURRENT, MA_SLOW_PERIOD, 0, MODE_SMA, PRICE_CLOSE);
double maFastPrev = iMA(_Symbol, PERIOD_CURRENT, MA_FAST_PERIOD, 1, MODE_SMA, PRICE_CLOSE);
double maSlowPrev = iMA(_Symbol, PERIOD_CURRENT, MA_SLOW_PERIOD, 1, MODE_SMA, PRICE_CLOSE);
double askPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bidPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
// ゴールデンクロス(買いシグナル)
if(maFastPrev <= maSlowPrev && maFast > maSlow)
{
double sl = bidPrice - SL_POINTS * _Point; // 損切り価格
double tp = askPrice + TP_POINTS * _Point; // 利確価格
if(!trade.Buy(LOT_SIZE, _Symbol, askPrice, sl, tp))
{
Print("買い注文エラー:", trade.ResultRetcode());
return;
}
}
// デッドクロス(売りシグナル)
if(maFastPrev >= maSlowPrev && maFast < maSlow)
{
double sl = askPrice + SL_POINTS * _Point; // 損切り価格
double tp = bidPrice - TP_POINTS * _Point; // 利確価格
if(!trade.Sell(LOT_SIZE, _Symbol, bidPrice, sl, tp))
{
Print("売り注文エラー:", trade.ResultRetcode());
return;
}
}
}
RSIを使った売買の実装例
RSIの売られすぎ・買われすぎを判断してエントリーするEAを作ってみましょう。
// RSIのEA with TP/SL
#include <Trade\Trade.mqh>
CTrade trade;
// 入力パラメーター
input int RSI_PERIOD = 14; // RSIの期間
input int OVERBOUGHT_LEVEL = 70; // 買われすぎのライン
input int OVERSOLD_LEVEL = 30; // 売られすぎのライン
input double TP_POINTS = 300; // 利確幅(ポイント)
input double SL_POINTS = 100; // 損切り幅(ポイント)
input double LOT_SIZE = 0.1; // 取引ロット数
void OnInit()
{
trade.SetExpertMagicNumber(123456); // マジックナンバーの設定
trade.SetDeviationInPoints(10); // 許容スリッページ
trade.SetTypeFilling(ORDER_FILLING_IOC);// 注文の約定方法
}
void OnTick()
{
// 現在のポジション数をチェック
int positions = PositionsTotal();
if(positions > 0) return; // ポジションがある場合は新規注文を出さない
// RSIの値を取得
double rsiCurrent = iRSI(_Symbol, PERIOD_CURRENT, RSI_PERIOD, PRICE_CLOSE, 0);
double rsiPrevious = iRSI(_Symbol, PERIOD_CURRENT, RSI_PERIOD, PRICE_CLOSE, 1);
double askPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bidPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
// 売られすぎから回復(買いシグナル)
if(rsiPrevious < OVERSOLD_LEVEL && rsiCurrent >= OVERSOLD_LEVEL)
{
double sl = bidPrice - SL_POINTS * _Point; // 損切り価格
double tp = askPrice + TP_POINTS * _Point; // 利確価格
if(!trade.Buy(LOT_SIZE, _Symbol, askPrice, sl, tp))
{
Print("買い注文エラー:", trade.ResultRetcode());
return;
}
}
// 買われすぎから下落(売りシグナル)
if(rsiPrevious > OVERBOUGHT_LEVEL && rsiCurrent <= OVERBOUGHT_LEVEL)
{
double sl = askPrice + SL_POINTS * _Point; // 損切り価格
double tp = bidPrice - TP_POINTS * _Point; // 利確価格
if(!trade.Sell(LOT_SIZE, _Symbol, bidPrice, sl, tp))
{
Print("売り注文エラー:", trade.ResultRetcode());
return;
}
}
}
これらのコードは、そのままコピペして使えるように作っています。
もちろん、実際の運用では適切なパラメーター調整や、リスク管理の追加が必要です。
CTradeクラスを使ったEA開発まとめ
この記事では、CTradeクラスの基本から実践的なEAの作り方まで解説してきました。
EA開発で成功するためのポイントは、実はそれほど複雑ではありません。
最初はシンプルな売買ルールから始めることが大切です。複雑な売買ルールは後回しにして、まずは移動平均線やRSIといった基本的なインジケーターを使ったEAを作ってみましょう。
そして、各ステップでしっかりと動作確認を行い、エラー処理を徹底することで、安定したEAが作れます。
また、EAを作る際はエラー処理を軽視しないことが重要です。
注文が出せたかどうか、必ず結果を確認するようにしましょう。
エラーが発生したときは適切なメッセージを出力することで、トラブルの早期発見と解決につながります。
そして、機能は一度にすべてを詰め込まず、段階的に追加していくことをおすすめします。基本的な売買ルールが正しく動くことを確認してから、少しずつ機能を追加していきましょう。
新しい機能を追加するたびにテストを行い、動作を確認します。欲張りすぎずに、一歩一歩着実に進めることが、長続きするEAを作るコツです。
この記事で紹介したサンプルコードをベースに、あなたなりのアイデアを少しずつ加えていってください。
コメントを残す