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コメント

  • 1000 / 1000