EA作成サンプルコード(複数ロジック)
こんにちは
今日は普段EAを作成している時に使用しているサンプルコードを貼っておきます。
//+------------------------------------------------------------------+
//| samplecode.mq4 |
//| Copyright 2021, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
extern string Note01="Main";
input int MagicNumber=134679;
input int MagicNumber2=546455;
input int MagicNumber3=45685216;
input int MaxSpread=20;
input double slippage=3;
static int TicketNumber;//チケットナンバー
extern string Note02="Logic1";
input bool Logic1=true;
input int Logic1Position=1;
input double Logic1Lots=0.01;
input int Logic1TP=25;
input int Logic1SL=58;
extern string Note3="Logic2";
input bool Logic2=false;
input int Logic2Position=3;
input double Logic2Lots=0.01;
input int Logic2TP=25;
input int Logic2SL=30;
extern string Note04="Logic3";
input bool Logic3=false;
input int Logic3Position=1;
input double Logic3Lots=0.01;
input int Logic3TP=50;
input int Logic3SL=50;
extern string Note4="ExitMode";
input string NoEntryStartTime="00:00";
input string NoEntryEndTime="05:00";
input bool TrailingStop=true;
extern int Trailing_Stop = 20;
extern int Minimum_Profit =15;
input bool BreakEven=false;
extern double Break_Even=20;
input bool allclose=true;
input int TotalProfit=15;
double Use_Point=0;
double Pips = 0;
extern string Note05 = "MM";
input bool MM = false;
input double Risk = 1.0;
double g_point;
//--------------------------------------------------------------------
double AdjustPoint(string Currency)//ポイント調整
{
int Symbol_Digits=(int)MarketInfo(Currency,MODE_DIGITS);
double Calculated_Point=0;
if (Symbol_Digits==2 || Symbol_Digits==3)
{
Calculated_Point=0.01;
}
else if (Symbol_Digits==4 || Symbol_Digits==5)
{
Calculated_Point=0.0001;
}
else if (Symbol_Digits==1)
{
Calculated_Point=0.1;
}
else if (Symbol_Digits==0)
{
Calculated_Point=1;
}
return(Calculated_Point);
}
//MM
double LotSize()
{
int magnification;//倍率
string currency = AccountCurrency(); //口座の通貨タイプ
if(currency == "JPY")//円口座の場合
{
magnification = 10000;//1万円を対象
}
else//ドル口座の場合
{
magnification = 100;//$100を対象
}
//複利計算
double lotMM = MathCeil(AccountFreeMargin()*Risk/magnification)/100;
lotMM = lotMM - 0.01;
if(lotMM < 0.01) lotMM = 0.01;//最小ロット
if(lotMM > 1.0) lotMM = MathCeil(lotMM);
if(lotMM > 100) lotMM = 100;//最大ロット
return (lotMM);
}
//トレーリングストップ_利益確保型
void TrailingStop()
{
if(TrailingStop==true)
{
double new_sl;
int res;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY && OrderOpenPrice()+Trailing_Stop*AdjustPoint(Symbol())<Bid && OrderStopLoss()<Bid)
{
new_sl = Bid-((Trailing_Stop-Minimum_Profit)*AdjustPoint(Symbol()));
if( new_sl > OrderStopLoss()+0.005*AdjustPoint(Symbol()))
{
res=OrderModify(OrderTicket(),OrderOpenPrice(),new_sl,OrderTakeProfit(),0,clrNONE);
}
}
else if(OrderType()==OP_SELL && OrderOpenPrice()-Trailing_Stop*AdjustPoint(Symbol())>Ask && (OrderStopLoss()>Ask || OrderStopLoss()==0) )
{
new_sl = Ask+((Trailing_Stop-Minimum_Profit)*AdjustPoint(Symbol()));
if( new_sl < OrderStopLoss()-0.005*AdjustPoint(Symbol()) || OrderStopLoss()==0 )
{
res=OrderModify(OrderTicket(),OrderOpenPrice(),new_sl,OrderTakeProfit(),0,clrNONE);
}
}
}
}
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber2)
{
if(OrderType()==OP_BUY && OrderOpenPrice()+Trailing_Stop*AdjustPoint(Symbol())<Bid && OrderStopLoss()<Bid)
{
new_sl = Bid-((Trailing_Stop-Minimum_Profit)*AdjustPoint(Symbol()));
if( new_sl > OrderStopLoss()+0.005*AdjustPoint(Symbol()))
{
res=OrderModify(OrderTicket(),OrderOpenPrice(),new_sl,OrderTakeProfit(),0,clrNONE);
}
}
else if(OrderType()==OP_SELL && OrderOpenPrice()-Trailing_Stop*AdjustPoint(Symbol())>Ask && (OrderStopLoss()>Ask || OrderStopLoss()==0) )
{
new_sl = Ask+((Trailing_Stop-Minimum_Profit)*AdjustPoint(Symbol()));
if( new_sl < OrderStopLoss()-0.005*AdjustPoint(Symbol()) || OrderStopLoss()==0 )
{
res=OrderModify(OrderTicket(),OrderOpenPrice(),new_sl,OrderTakeProfit(),0,clrNONE);
}
}
}
}
}
}
//ブレークイーブンストップ関数
void BreakEvenStop()
{
if(BreakEven==true)
{
int res;
double Pips_Profit;
double Min_Profit;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY)
{
Pips_Profit=Bid-OrderOpenPrice();
Min_Profit=Break_Even*AdjustPoint(Symbol());
if (Pips_Profit>=Min_Profit && OrderOpenPrice()!=OrderStopLoss())
{
res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Orange);
}
}
else if(OrderType()==OP_SELL)
{
Pips_Profit=OrderOpenPrice()-Ask;
Min_Profit=Break_Even*AdjustPoint(Symbol());
if (Pips_Profit>=Min_Profit && OrderOpenPrice()!=OrderStopLoss())
{
res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Orange);
}
}
}
}
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber2)
{
if(OrderType()==OP_BUY)
{
Pips_Profit=Bid-OrderOpenPrice();
Min_Profit=Break_Even*AdjustPoint(Symbol());
if (Pips_Profit>=Min_Profit && OrderOpenPrice()!=OrderStopLoss())
{
res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Orange);
}
}
else if(OrderType()==OP_SELL)
{
Pips_Profit=OrderOpenPrice()-Ask;
Min_Profit=Break_Even*AdjustPoint(Symbol());
if (Pips_Profit>=Min_Profit && OrderOpenPrice()!=OrderStopLoss())
{
res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Orange);
}
}
}
}
}
}
//すべて決済する関数
void allClose(color clr)
{
int TotalNum;
int i;
double profit=0;
double totalProfit=0;
for(i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
continue;
if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
continue;
if(OrderType()==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),Bid,NormalizeDouble(slippage,0),clr);
if(OrderType()==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),Ask,NormalizeDouble(slippage,0),clr);
}
for(i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
continue;
if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber2)
continue;
if(OrderType()==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),Bid,NormalizeDouble(slippage,0),clr);
if(OrderType()==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),Ask,NormalizeDouble(slippage,0),clr);
}
for(i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
continue;
if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber3)
continue;
if(OrderType()==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),Bid,NormalizeDouble(slippage,0),clr);
if(OrderType()==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),Ask,NormalizeDouble(slippage,0),clr);
}
}
int LongPosition()//ロングポジション数を取得
{
int buys=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY) buys++;
}
}
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber2)
{
if(OrderType()==OP_BUY) buys++;
}
}
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber3)
{
if(OrderType()==OP_BUY) buys++;
}
}
return(buys);
}
int ShortPosition()//ショートポジション数を取得
{
int sells=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_SELL) sells++;
}
}
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber2)
{
if(OrderType()==OP_SELL) sells++;
}
}
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber3)
{
if(OrderType()==OP_SELL) sells++;
}
}
return(sells);
}
//ポジションクローズ関数
void CloseOrder(int ClosePosition)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
int res;
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
{
if(OrderType()==OP_SELL && (ClosePosition==-1 || ClosePosition==0 )) //売りポジションのクローズ
{
res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,Silver);
}
else if(OrderType()==OP_BUY && (ClosePosition==1 || ClosePosition==0 ) ) //買いポジションのクローズ
{
res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,Silver);
}
}
}
}
for(int i=OrdersTotal()-1;i>=0;i--)
{
int res;
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderMagicNumber()==MagicNumber2 && OrderSymbol()==Symbol())
{
if(OrderType()==OP_SELL && (ClosePosition==-1 || ClosePosition==0 )) //売りポジションのクローズ
{
res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,Silver);
}
else if(OrderType()==OP_BUY && (ClosePosition==1 || ClosePosition==0 ) ) //買いポジションのクローズ
{
res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,Silver);
}
}
}
}
for(int i=OrdersTotal()-1;i>=0;i--)
{
int res;
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderMagicNumber()==MagicNumber3 && OrderSymbol()==Symbol())
{
if(OrderType()==OP_SELL && (ClosePosition==-1 || ClosePosition==0 )) //売りポジションのクローズ
{
res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,Silver);
}
else if(OrderType()==OP_BUY && (ClosePosition==1 || ClosePosition==0 ) ) //買いポジションのクローズ
{
res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,Silver);
}
}
}
}
}
void LineNotify(string Token,string Massage)
{
string headers;//ヘッダー
char data[], result[];//データ、結果
headers="Authorization: Bearer "+Token+" application/x-www-form-urlencoded ";
ArrayResize(data,StringToCharArray("message="+Massage,data,0,WHOLE_ARRAY,CP_UTF8)-1);
int res = WebRequest("POST", "https://notify-api.line.me/api/notify", headers, 0, data, data, headers);
if(res==-1) //エラーの場合
{
Print("Error in WebRequest. Error code =",GetLastError());
MessageBox("Add the address 'https://notify-api.line.me' in the list of allowed URLs on tab 'Expert Advisors'","Error",MB_ICONINFORMATION);
}
}
//エントリー禁止時間帯チェック
bool EntryTimeCheck(string stime,string etime){
string StartDate=TimeToStr(TimeCurrent(),TIME_DATE); //現在の年月日を取得
datetime StartTime=StrToTime(StartDate+" "+stime); //年月日と時分を連結
datetime EndTime=StrToTime(StartDate+" "+etime); //年月日と時分を連結
if(StartTime<EndTime){
if(StartTime<=TimeCurrent() && TimeCurrent()<EndTime)return(true); //現在時刻が禁止時間内の場合
else return(false);
}else{
if(EndTime<=TimeCurrent() && TimeCurrent()<StartTime)return(false); //現在時刻が禁止時間外の場合
else return(true);
}
return(false);
}
void viewMessage(string msg)
{
string objectName = "message";
//すべてのオブジェクトをクリア
//オブジェクトを作成
ObjectCreate(objectName,OBJ_LABEL,0,0,0);
//x座標設定
ObjectSet(objectName,OBJPROP_XDISTANCE,5);
//y座標設定
ObjectSet(objectName,OBJPROP_YDISTANCE,18);
//文字列設定
ObjectSetText(objectName,msg,26,NULL,clrPink);
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Use_Point = AdjustPoint(Symbol());
Pips = AdjustPoint(Symbol());
//---
g_point = Point;
if (Digits % 2 == 1)
{
g_point *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
//利益確保型トレーリングストップ
static bool checkDone;
int sec = TimeSeconds(TimeGMT());
if(sec == 0 || sec == 10 || sec == 20|| sec == 30|| sec == 40|| sec == 50 )
{
if(checkDone==false)
{
TrailingStop();
BreakEvenStop();
checkDone = true;
}
}
else
{
checkDone = false;
}
// ニューバーの発生直後以外は取引しない
static datetime bartime=Time[0];
if (Time[0]==bartime) return;
bartime=Time[0];
checkDone = false;
double profit;//損益
//Position
int LongNum=LongPosition();
int ShortNum=ShortPosition();
int TotalNum=ShortNum+LongNum;
double Max_Stop_Loss;
double Current_Stop;
double Pips_Profit;
double Min_Profit;
//----------------------------indicater-------------------------------+
//-------------------------------------------------------------------+
if() sign = 1;
if() sign = -1;
//-------------------------------------------------------------------+
if(Logic1==true)
{
if(MM==true)//複利がONの場合
{
if(!EntryTimeCheck(NoEntryStartTime,NoEntryEndTime)&&TotalNum<Logic1Position && MarketInfo(Symbol(),MODE_SPREAD)< MaxSpread && sign==1)
{
TicketNumber=OrderSend(Symbol(),OP_BUY,LotSize(),Ask,slippage,Ask-Logic1SL*Point*10,Ask+Logic1TP*Point*10,"Logic1",MagicNumber,0,Red);
}
if(!EntryTimeCheck(NoEntryStartTime,NoEntryEndTime)&&TotalNum<Logic1Position && MarketInfo(Symbol(),MODE_SPREAD)< MaxSpread)
{
TicketNumber=OrderSend(Symbol(),OP_SELL,LotSize(),Bid,slippage,Bid+Logic1SL*Point*10,Bid-Logic1TP*Point*10,"Logic1",MagicNumber,0,Blue);
}
}
else
{
if(!EntryTimeCheck(NoEntryStartTime,NoEntryEndTime)&&TotalNum<Logic1Position && MarketInfo(Symbol(),MODE_SPREAD)< MaxSpread && sign==-1)
{
TicketNumber=OrderSend(Symbol(),OP_BUY,Logic1Lots,Ask,slippage,Ask-Logic1SL*Point*10,Ask+Logic1TP*Point*10,"Logic1",MagicNumber,0,Red);
}
if(!EntryTimeCheck(NoEntryStartTime,NoEntryEndTime)&&TotalNum<Logic1Position && MarketInfo(Symbol(),MODE_SPREAD)< MaxSpread)
{
TicketNumber=OrderSend(Symbol(),OP_SELL,Logic1Lots,Bid,slippage,Bid+Logic1SL*Point*10,Bid-Logic1TP*Point*10,"Logic1",MagicNumber,0,Blue);
}
}
}
if(Logic2==true)
{
if(MM==true)//複利がONの場合
{
if(!EntryTimeCheck(NoEntryStartTime,NoEntryEndTime)&&TotalNum<Logic2Position && MarketInfo(Symbol(),MODE_SPREAD)< MaxSpread && sign==1)
{
TicketNumber=OrderSend(Symbol(),OP_BUY,LotSize(),Ask,slippage,Ask-Logic2SL*Point*10,Ask+Logic2TP*Point*10,"Logic2",MagicNumber2,0,Red);
}
if(!EntryTimeCheck(NoEntryStartTime,NoEntryEndTime)&&TotalNum<Logic2Position && MarketInfo(Symbol(),MODE_SPREAD)< MaxSpread && sign==-1)
{
TicketNumber=OrderSend(Symbol(),OP_SELL,LotSize(),Bid,slippage,Bid+Logic2SL*Point*10,Bid-Logic2TP*Point*10,"Logic2",MagicNumber2,0,Blue);
}
}
else
{
if(!EntryTimeCheck(NoEntryStartTime,NoEntryEndTime)&&TotalNum<Logic3Position && MarketInfo(Symbol(),MODE_SPREAD)< MaxSpread)
{
TicketNumber=OrderSend(Symbol(),OP_BUY,Logic2Lots,Ask,slippage,Ask-Logic2SL*Point*10,Ask+Logic2TP*Point*10,"Logic2",MagicNumber2,0,Red);
}
if(!EntryTimeCheck(NoEntryStartTime,NoEntryEndTime)&&TotalNum<Logic2Position && MarketInfo(Symbol(),MODE_SPREAD)< MaxSpread)
{
TicketNumber=OrderSend(Symbol(),OP_SELL,Logic2Lots,Bid,slippage,Bid+Logic2SL*Point*10,Bid-Logic2TP*Point*10,"Logic2",MagicNumber2,0,Blue);
}
}
}
if(Logic3==true)
{
{
if(!EntryTimeCheck(NoEntryStartTime,NoEntryEndTime)&&TotalNum<Logic3Position && MarketInfo(Symbol(),MODE_SPREAD)< MaxSpread)
{
TicketNumber=OrderSend(Symbol(),OP_BUY,Logic3Lots,Ask,slippage,Ask-Logic3SL*Point*10,Ask+Logic3TP*Point*10,"Logic3",MagicNumber3,0,Red);
}
if(!EntryTimeCheck(NoEntryStartTime,NoEntryEndTime)&&TotalNum<Logic3Position && MarketInfo(Symbol(),MODE_SPREAD)< MaxSpread)
{
TicketNumber=OrderSend(Symbol(),OP_SELL,Logic3Lots,Bid,slippage,Bid+Logic3SL*Point*10,Bid-Logic3TP*Point*10,"Logic3",MagicNumber3,0,Blue);
}
}
}
//ナンピンクローズ
double Total_Profit=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
{
double Or;
if (OrderType()==OP_BUY)
{
Or=OrderLots();
Total_Profit=Total_Profit+((Bid-OrderOpenPrice())*(Or/Logic1Lots));
}
if (OrderType()==OP_SELL)
{
Or=OrderLots();
Total_Profit=Total_Profit+((OrderOpenPrice()-Ask)*(Or/Logic1Lots));
}
}
}
}
if(allclose==true)
{
if(Total_Profit>TotalProfit*AdjustPoint(Symbol()) )
{
CloseOrder(TotalNum<Logic1Position);
}
}
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderMagicNumber()==MagicNumber2 && OrderSymbol()==Symbol())
{
double Or;
if (OrderType()==OP_BUY)
{
Or=OrderLots();
Total_Profit=Total_Profit+((Bid-OrderOpenPrice())*(Or/Logic2Lots));
}
if (OrderType()==OP_SELL)
{
Or=OrderLots();
Total_Profit=Total_Profit+((OrderOpenPrice()-Ask)*(Or/Logic2Lots));
}
}
}
}
if(allclose==true)
{
if(Total_Profit>TotalProfit*AdjustPoint(Symbol()) )
{
CloseOrder(TotalNum<Logic2Position);
}
}
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderMagicNumber()==MagicNumber3 && OrderSymbol()==Symbol())
{
double Or;
if (OrderType()==OP_BUY)
{
Or=OrderLots();
Total_Profit=Total_Profit+((Bid-OrderOpenPrice())*(Or/Logic3Lots));
}
if (OrderType()==OP_SELL)
{
Or=OrderLots();
Total_Profit=Total_Profit+((OrderOpenPrice()-Ask)*(Or/Logic3Lots));
}
}
}
}
if(Total_Profit>20*AdjustPoint(Symbol()) )
{
CloseOrder(TotalNum<Logic3Position);
}
}
0コメント