MT5のEA自作するときのテンプレート
//+------------------------------------------------------------------+
//| ProjectName |
//| Copyright 2020, CompanyName |
//| http://www.companyname.net |
//+------------------------------------------------------------------+
int MagicNumber = 111;
int Slippage = 10;
double input_lot_size = 0.1;
void OnTick()
{
}
void position_entry(int side)
{
if(side == 0){
iTrade.Buy(input_lot_size,NULL,0,0,0,"");
}
if(side== 1){
iTrade.Sell(input_lot_size,NULL,0,0,0,"");
}
}
void position_close(int side)
{
for(int i=PositionsTotal()-1; i>=0; i--)
{
if("" != PositionGetSymbol(i))
{
if(PositionGetInteger(POSITION_TYPE)==side)
{
if(Symbol()==PositionGetString(POSITION_SYMBOL))
{
if(PositionGetInteger(POSITION_MAGIC)==MagicNumber)
{
iTrade.PositionClose(PositionGetTicket(i));
}
}
}
}
}
}
int position_count(int side)
{
int count =0;
for(int i=PositionsTotal()-1; i>=0; i--)
{
if("" != PositionGetSymbol(i))
{
if(PositionGetInteger(POSITION_TYPE)==side)
{
if(Symbol()==PositionGetString(POSITION_SYMBOL))
{
if(PositionGetInteger(POSITION_MAGIC)==MagicNumber)
{
count++;
}
}
}
}
}
return count ;
}
int order_count()
{
int count =0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if("" != OrderGetString(ORDER_SYMBOL))
{
if(Symbol()==OrderGetString(ORDER_SYMBOL))
{
if(OrderGetInteger(ORDER_MAGIC)==MagicNumber)
{
count++;
}
}
}
}
return count ;
}
#include <Trade\Trade.mqh>
CTrade iTrade;
void InitTrade()
{
iTrade.SetDeviationInPoints(Slippage);
iTrade.SetExpertMagicNumber(MagicNumber);
iTrade.SetTypeFillingBySymbol(Symbol());
}
int OnInit()
{
InitTrade();
return(INIT_SUCCEEDED);
}
このコードは、MetaTrader 5(MT4)のカスタムエキスパートアドバイザー(EA)スクリプトの例です。以下に、コードの主な機能と動作の説明を示します。
ヘッダーコメント(Header Comment): コードの最初の部分には、プロジェクト名、著作権情報、会社のウェブサイトのリンクなどが記載されています。
変数の定義: MagicNumber、Slippage、input_lot_sizeなどの変数が定義されています。これらの変数は、トレード操作やパラメーター設定に使用されます。
OnTick関数: メインのトレードロジックは、OnTick関数内に実装されます。この関数は、価格が更新されるたびに呼び出されます。
position_entry関数: この関数は、指定されたサイド(0=買い、1=売り)でポジションを開くために使用されます。iTrade.BuyまたはiTrade.Sell関数を使用して、指定された数量(input_lot_size)で取引を行います。
position_close関数: この関数は、指定されたサイドのポジションをクローズするために使用されます。PositionGetSymbol、PositionGetInteger、PositionGetString、PositionGetTicketなどの関数を使用して、ポジションの情報を取得し、PositionClose関数を呼び出してポジションをクローズします。
position_count関数: この関数は、指定されたサイドのポジションの数を返すために使用されます。PositionsTotal、PositionGetSymbol、PositionGetInteger、PositionGetString、PositionGetTicketなどの関数を使用して、ポジションの情報を取得し、カウントを行います。
order_count関数: この関数は、MagicNumberで識別される指定されたシンボルの注文の数を返すために使用されます。OrdersTotal、OrderGetString、OrderGetIntegerなどの関数を使用して、注文の情報を取得し、カウントを行います。
InitTrade関数: この関数は、トレードに関する設定を行います。Slippage(許容スリッページ)やMagicNumber(注文の識別番号)などのパラメーターを設定し、トレード操作に関連する設定を行います。
OnInit関数: この関数は、EAの初期化時に呼び出されます。InitTrade関数を呼び出してトレードの初期化を行い、初期化が成功したことを示すINIT_SUCCEEDEDを返します。
このコードは、トレードロジックを実装するための基本的なフレームワークを提供しています。EAの詳細なロジックやトレード戦略は、OnTick関数内に記述する必要があります。また、Trade.mqhという外部ライブラリを使用してトレード操作を行っています。このライブラリには、注文の実行やポジションの管理に関連する機能が含まれています。
平均取得単価計算
double position_heikin_syutoku_tanka(int side)
{
double price_sum = 0;
double lots_sum = 0;
double heikin = 0;
for(int i=PositionsTotal()-1; i>=0; i--)
{
if("" != PositionGetSymbol(i))
{
if(PositionGetInteger(POSITION_TYPE)==side)
{
if(Symbol()==PositionGetString(POSITION_SYMBOL))
{
if(PositionGetInteger(POSITION_MAGIC)==MagicNumber)
{
price_sum+=PositionGetDouble(POSITION_PRICE_OPEN) * PositionGetDouble(POSITION_VOLUME);
lots_sum+=PositionGetDouble(POSITION_VOLUME);
}
}
}
}
}
if(price_sum!=0)
{
heikin = price_sum/lots_sum;
}
return heikin ;
}
ポジションの最大ロットサイズ
double get_position_info_max_lots(int side){
double max = 0;
for(int i=PositionsTotal()-1; i>=0; i--)
{
if("" != PositionGetSymbol(i))
{
if(PositionGetInteger(POSITION_TYPE)==side)
{
if(Symbol()==PositionGetString(POSITION_SYMBOL))
{
if(PositionGetInteger(POSITION_MAGIC)==MagicNumber)
{
if(max < PositionGetDouble(POSITION_VOLUME)){max= PositionGetDouble(POSITION_VOLUME);}
}
}
}
}
}
return max ;
}
ナンピンマーチンの最後のロットの取得価格
double get_position_info_last_lots_price(int side)
{
double price = side==1?0:99999999;
for(int i=PositionsTotal()-1; i>=0; i--)
{
if("" != PositionGetSymbol(i))
{
if(PositionGetInteger(POSITION_TYPE)==side)
{
if(Symbol()==PositionGetString(POSITION_SYMBOL))
{
if(PositionGetInteger(POSITION_MAGIC)==MagicNumber)
{
if(side==1)
if(price < PositionGetDouble(POSITION_PRICE_OPEN))
{
price= PositionGetDouble(POSITION_PRICE_OPEN);
}
}
if(side==0)
if(price > PositionGetDouble(POSITION_PRICE_OPEN))
{
price= PositionGetDouble(POSITION_PRICE_OPEN);
}
}
}
}
}
return price ;
}
Discussion