今回は、MT4のEAサンプルソース(FX用)を公開します。
トレードに使うテクニカル分析インジケータを使わずローソク足のみで、陽線又は陰線が数回続いたらエントリーしています。
2024/05/29 ロジック及びソースコードの見直しを行いました
はじめに
ローソク足の情報だけでプラス収支にできるロジックを考えて、とりあえず陽線・陰線の連続でエントリーしていくEAを作りました。
トレード時に陰線陽線使ってエントリーする際の確認や、ローソク足周りの処理をEAに取り入れる際の参考になればと思います!
EAの仕様
それでは、今回のソースコードのエントリー/決済/パラメータ設定についての仕様を説明します。
エントリータイミング
ロングエントリー
ローソク足(バー)の陽線が3連続かつ高値を更新していらロングでエントリーします。また、ローソク足の陽線が4連続していた場合はエントリーしません。
ショートエントリー
ローソク足(バー)の陰線が3連続かつ安値を更新していたらショートでエントリーします。また、ローソク足の陰線が4連続していた場合はエントリーしません。
※連続数はパラメータ設定で変更できます
決済タイミング
損切40pips、利確90pipsです。
※共にパラメータ設定で変更できます
その他の仕様
設定値は以下の通りです。
- BarLoopCnt = 4 ⇒ 陽線・陰線が何回続いたらエントリーするかを設定する
- Lots = 1 ⇒ ロット数です(0.01=1000通貨)
- TP= 900 ⇒ 利確までのポイント(900で90pips)
- SL = 400 ⇒ ストップロスまでのポイント(400で40pips)
既に建玉がある場合は追加でエントリーはしません。
新しい足(バー)が出来た際に1度だけ処理を行います。※1時間足の場合だと1時間に1回処理する
EAレポート結果
2020年~2024年5月期間の1時間足でバックテスト確認してみました。わりと良い感じのプラス収支になりました。
ダウンロード
上記のEAファイルになります。
“陽線と陰線を見るEA” をダウンロード 13_InYou-1.ex4 – 3031 回のダウンロード – 9.15 KBソースコード
以下サンプルソースコードになります。
※丸々コピペでコンパイルできます
//+------------------------------------------------------------------+
//| ASI.mq4 |
//| Copyright 2020, mef Software. |
//| https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, mef Software."
#property link "https://fx-prog.com/"
#property version "1.00"
#property strict
input int BarLoopCnt = 3;
input double Lots = 1;
input int TP = 900;
input int SL = 400;
datetime prevtime;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
int start()
{
//---
int orderPtn=0; //0:何もしない 1:買い 2:売り
int total=0;
int errorcode; // エラーコード
int ea_ticket_No,ea_order_entry_Type=0,ea_order_MagicNo; // チケットNo,エントリタイプ,マジックNo.
double ea_order_stop_price=0,ea_order_good_price=0,ea_order_entry_price=0; //ストップロスレート,利確レート,エントリーレート
//---
//新しい足ができた時だけやる
if(Time[0] != prevtime){
prevtime = Time[0];
}else{
return(0);
}
//***売買判断箇所***//
//バーの陽線(陰線)がBarLoopCnt分続いている事をチェック
for(int i=0; i < BarLoopCnt+1; i++){
//ループ1回目は無条件
if(i==0){
//陽線の場合
if(iOpen(NULL, 0, i+1) < iClose(NULL, 0, i+1)){
orderPtn = 1;
}
//陰線の場合
else if(iOpen(NULL, 0, i+1) > iClose(NULL, 0, i+1)){
orderPtn = 2;
//条件合わずで抜ける(ありえない)
}else{
orderPtn = 0;
break;
}
//ループ2回目以降は同じ線
}else if(i != BarLoopCnt && i != 0){
//陽線 かつ 高値を切り上げている場合
if(orderPtn == 1 && iOpen(NULL, 0, i+1) < iClose(NULL, 0, i+1) && iHigh(NULL, 0, i) > iHigh(NULL, 0, i+1)){
orderPtn = 1;
}
//陰線 かつ 安値を切り下げている場合
else if(orderPtn == 2 && iOpen(NULL, 0, i+1) > iClose(NULL, 0, i+1) && iLow(NULL, 0, i) < iLow(NULL, 0, i+1)){
orderPtn = 2;
}else{
orderPtn = 0;
}
//ループ最終
}else{
//陽線 かつ 高値を切り上げている場合
if(orderPtn == 1 && iOpen(NULL, 0, i+1) < iClose(NULL, 0, i+1)){
orderPtn = 0;
}
//陰線 かつ 安値を切り下げている場合
else if(orderPtn == 2 && iOpen(NULL, 0, i+1) > iClose(NULL, 0, i+1)){
orderPtn = 0;
}
}
Print("ptn:",orderPtn);
Print(i);
}
//***売買判断箇所***//
//***決済判断箇所***//
total=OrdersTotal();
if(total == 0 && orderPtn > 0)
{
if(orderPtn == 1)
{
ea_order_entry_price = Ask; // 現在の買値でエントリー
ea_order_entry_Type = OP_BUY; //OP_BUY
ea_order_stop_price = Ask - SL * Point; //損切りポイント(-10銭)
ea_order_good_price = Ask + TP * Point; //利喰いポイント(+10銭)
}
else if(orderPtn == 2)
{
ea_order_entry_price = Bid; // 現在の売値でエントリー
ea_order_entry_Type = OP_SELL; //OP_SELL
ea_order_stop_price = Bid + SL * Point; //損切りポイント(-10銭)
ea_order_good_price = Bid - TP * Point; //利喰いポイント(+10銭)
}
ea_order_MagicNo=0000; //マジックナンバーは0000固定とする
ea_ticket_No = OrderSend( // 新規エントリー注文
NULL, // 通貨ペア
ea_order_entry_Type, // オーダータイプ[OP_BUY / OP_SELL]
Lots, // ロット(0.01単位,FXTFは1=10Lot)
ea_order_entry_price, // オーダープライスレート
20, // スリップ上限
ea_order_stop_price, // ストップレート
ea_order_good_price, // リミットレート
"テストオーダー", // オーダーコメント
ea_order_MagicNo, // マジックナンバー(識別用)
0, // オーダーリミット時間
clrRed // オーダーアイコンカラー
);
if ( ea_ticket_No == -1) // オーダーエラー
{
errorcode = GetLastError(); // エラーコード取得
if( errorcode != ERR_NO_ERROR) // エラー発生
{
printf("エラー");
}
}
else { // 注文約定
Print("新規注文約定。 チケットNo=",ea_ticket_No);
}
}
return(0);
}
主な構文
iOpen()、iClise()で陽線と陰線を判断できるので特に特別な構文は使っていません。
あと、何連続でも対応できるようにしたかったのでfor文で作っています。
さいごに
以上、陽線と陰線を使ったEAのサンプルソースでした。
陰線と陽線を確認するだけでも勝ちに持っていく事ができるんだなと少し驚きです。是非トレードの検証等に取り入れてみて下さい。
※ EAのサンプルソースを一覧表にまとめました
※オンラインレッスンやってます
コメント