【mql】ポジション数およびロット数の合計を計算するコード
本noteでは、私がEAを作成した時に参考になったサイトを紹介します。
ポジション数およびロット数の合計を計算するコードです。
EAやインジケーターを作成している方に役立てば幸いです。
使い方
最大ポジション数やロット数の上限を設定したい時に、本コードを注文や決済関数の手前にコピー&ペーストしてご利用ください。
参考サイト
https://autofx100.com/2015/02/07/175404/
問合せ
ご質問・ご意見は以下メールアドレスへお気軽にご連絡下さい。
gabrielfx2100@gmail.com
公式LINEの友達追加はコチラ
(ガブリエルのFX事情を配信中です)
コード紹介
最大ポジション数が5つの例です。
#define OP_OPEN 6 // ポジション
#define OP_LIMIT 7 // 指値注文
#define OP_STOP 8 // 逆指値注文
#define OP_ALL 9 // 全て
#define SUM_ORDER_NUMBER 1 // 注文数
#define SUM_LOTSIZE 2 // ロット数
extern int MAGIC=1; //マジックナンバー
extern double lotSize=0.01; //lot
extern int SumTrades=5; //最大ポジション数
string comment="comment";
int Slippage=3;//スリッページ(point)
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void init()return;
int deinit()return(0);
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
if(★エントリー条件★)
{
//最大ポジション以下なら注文
if(sumOrderNumberOrLotSize(OP_ALL,SUM_ORDER_NUMBER)<SumTrades)
{
//買い注文
reslg=OrderSend(Symbol(),OP_BUY,lotSize,Ask,Slippage,LongSL,LongTP,comment,MAGIC,0,Blue);
}
}
}
//+------------------------------------------------------------------+
//|【関数】指定の注文種類の注文数またはロット数を合計する
//|
//|【引数】 IN OUT 引数名 説明
//| --------------------------------------------------------- |
//| ○ aType 注文種別
//| ○ aKbn カウント対象
//| 1: 注文数
//| 2: ロット数
//|
//|【戻値】合計注文数または合計ロット数
//+------------------------------------------------------------------+
double sumOrderNumberOrLotSize(int aType,int aKbn)
{
double sumOrder = 0.0;
double sumLot = 0.0;
double num = 0.0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==false)
{
break;
}
if(OrderSymbol()!=Symbol())
{
continue;
}
int type=OrderType();
double lot=OrderLots();
if(aType==OP_BUY)
{
if(type==OP_BUY)
{
sumOrder += 1.0;
sumLot += lot;
}
}
else if(aType==OP_SELL)
{
if(type==OP_SELL)
{
sumOrder += 1.0;
sumLot += lot;
}
}
else if(aType==OP_BUYSTOP)
{
if(type==OP_BUYSTOP)
{
sumOrder += 1.0;
sumLot += lot;
}
}
else if(aType==OP_SELLSTOP)
{
if(type==OP_SELLSTOP)
{
sumOrder += 1.0;
sumLot += lot;
}
}
else if(aType==OP_OPEN)
{
if(type==OP_BUY || type==OP_SELL)
{
sumOrder += 1.0;
sumLot += lot;
}
}
else if(aType==OP_LIMIT)
{
if(type==OP_BUYLIMIT || type==OP_SELLLIMIT)
{
sumOrder += 1.0;
sumLot += lot;
}
}
else if(aType==OP_STOP)
{
if(type==OP_BUYSTOP || type==OP_SELLSTOP)
{
sumOrder += 1.0;
sumLot += lot;
}
}
else if(aType==OP_ALL)
{
sumOrder += 1.0;
sumLot += lot;
}
else
{
Print("sumOrderNumberOrLotSize: 不正な注文種別です。aType = "+(string)aType);
return(-1);
}
}
if(aKbn==SUM_ORDER_NUMBER)
{
num=sumOrder;
}else if(aKbn==SUM_LOTSIZE){
num=sumLot;
}
return(num);
}
//+------------------------------------------------------------------+
いいなと思ったら応援しよう!
記事をご覧いただきありがとうございます。
皆様のサポートが次の記事を書くモチベーションに繋がっています!
もしよろしければサポートしていただけると嬉しいです!