【初心者向け】MQL5のCTradeクラスの使い方|EAサンプルコードあり

「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を作るコツです。

この記事で紹介したサンプルコードをベースに、あなたなりのアイデアを少しずつ加えていってください。

弊さいとが独自に開発した「FXオリジナルインジケーター」を無料でプレゼント!

インターネット上に存在しないインジケーター、他では高額な金額で販売されているようなインジケーターも無料で配布する期間限定のプレゼント企画!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です