EA自作企画第6弾!準備がまだ!って人は先に準備しましょう!こっちのページを参照してね!

こちらのサイトのようなところへ行けば、EA自体は購入が可能です。

投資家の祭典 GogoJungle AWARD 2023

今回は最初に作ったLongOn、ShortOnを使って、ロングエントリーとショートエントリーを制限していきます。

目標とするEAに近づけたい…

自作EAの条件

損切しない!

スワップが増える方向にだけエントリー

似たようなところでエントリーしない!

最大ポジション数を取った時にレバレッジ10倍を超えない!

最初に作った一方向のための設定LongOn,ShortOnを使って、エントリー制限を設けます。これ自体は簡単なのですが、どの段階で判定するかってので、趣味というか効率というかなんというか色々書けそうです。

//+------------------------------------------------------------------+
//|                                                 OnewayTrader.mq4 |
//|                                          Copyright 2025, FPshima |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, FPshima"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern bool LongOn = true; //ロングを許可
extern bool ShortOn = false;//ショートを許可

extern int zone = 50;   //エントリー不可範囲
extern int maxPosition = 4;  //最大ポジション数
extern double risk = 10; //取りうる最大リスク

double calculateLotSize()
{
   double accountBalance = AccountBalance();
   double totalRiskAmount = accountBalance * risk/100;
   double eachPositionRisk = totalRiskAmount/maxPosition;
   double minLot = MarketInfo(NULL,MODE_MINLOT);
   double marginRequire = MarketInfo(NULL,MODE_MARGINREQUIRED)*minLot;
   double lotSize = (eachPositionRisk / marginRequire)*minLot;
   if(lotSize <= minLot)
   {
      lotSize = minLot;
   }
   if(lotSize <= 20.0)
   {
     lotSize = NormalizeDouble(lotSize,2);
   }
   if(lotSize > 20.0)
   {
      lotSize = 20.0;
   }
   return lotSize;
}

bool EntryJudge(int tradeType)
{
   double zonePips = zone *Point*10;
   int currentPositions = 0;
   

   
   for(int i = 0 ; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         currentPositions++;
         if(OrderType() == tradeType && MathAbs(OrderOpenPrice()-Ask) <= zonePips && OrderType() == OP_BUY)
         {
            return false;
         }
         
         if(OrderType() == tradeType && MathAbs(OrderOpenPrice()-Bid) <= zonePips && OrderType() == OP_SELL)
         {
            return false;
         }
      }
   }
   if(currentPositions < maxPosition)
   {
      return true;
   }else{
   
      return false;
   }
}
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

   double tradeLot = calculateLotSize();
   Comment("lotSize",tradeLot,"  Zonejudge  " , EntryJudge(OP_BUY));
   if(EntryJudge(OP_BUY) && LongOn == true)
   {
     OrderSend(NULL,OP_BUY,tradeLot,Ask,5,0,0,"Long",0,0,clrRed);
   }
   if(EntryJudge(OP_SELL) && ShortOn != false)
   {
     OrderSend(NULL,OP_SELL,tradeLot,Bid,5,0,0,"Short",0,0,clrRed);
   }
  }
//+------------------------------------------------------------------+

一番わかりやすい、ロングショートのオーダーを送る直前に入れました。複数のオーダー判定をするような場合はもっと上位で判断したほうが良いでしょうけれど、ここが一番わかりやすいかなーという事で、入れました。

ただ、ほとんど変化が無いので、ちょっとだけ書き方を工夫

前回と違いのあるvoid OnTick()だけ見てみましょう

void OnTick()
  {
//---

   double tradeLot = calculateLotSize();
   Comment("lotSize",tradeLot,"  Zonejudge  " , EntryJudge(OP_BUY));
   if(EntryJudge(OP_BUY) && LongOn == true)
   {
     OrderSend(NULL,OP_BUY,tradeLot,Ask,5,0,0,"Long",0,0,clrRed);
   }
   if(EntryJudge(OP_SELL) && ShortOn != false)
   {
     OrderSend(NULL,OP_SELL,tradeLot,Bid,5,0,0,"Short",0,0,clrRed);
   }
  }
//+------------------------------------------------------------------+

トレードするか否かのEntryJudgeと同時に&&でつないでLongOn ==trueか ShortOn !=falseかにしました。ほとんど変化が無いので、あえて、書き方を変えています。ほぼ同じ意味ですが。

==は前回も伝えていますが 同じならば~という意味。一方!は否定形で使われるので、!=は出ないとき~になります。したがって、falseではないとき~という事になります。ただ気を付けたいのはfalseでなければいいので、trueとは限らないという微妙な話になります。まぁ細かい話はしませんが、エラーのもとになったりもするので、書き方には気を使いましょう(笑)

なお!LongOnと書いた場合 LongOnがtrueでない となります。

実際にLongOnもShortOnもtrueにするとこんな感じ。どちらも同時に入ってしまっているので重なっていますが、ロングもショートも同じ価格でエントリーされています。合わせて4ポジションなのでこれ以上エントリーしません。

ちゃんと動いていますね。trueやfalseの設定を変えてどう変化するか見てみてください

次回はオーダーをクローズしますよ!

楽天証券(FX)

おすすめFXアイテム

過去検証や分析はMT4かFT4、Trading viewがおすすめです。

無料が良い人はMT4で、MT4を使わせてくれる口座を使用すると良いです。おすすめはFXTF

ガチで過去検証をやりたい人はFT4、

チャート分析に毎月課金してもいいよって人はTrading viewがおすすめです。無料もあります

Twitterでフォローしよう

おすすめの記事