EA实现功能:
1、自动止盈止损
2、挂单有效期自动设定
//+------------------------------------------------------------------+
//| 自动设置止损.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
//--- input parameters
input int Input1=30;
extern int Kperiod=5;
extern int Dperiod=3;
extern int Slowing=3;
input int yksd=300;//盈亏深度,300美元
extern int gyxq_v=60*60*36;//有效期36小时
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Symbol()=="XAGUSD")
{
//double v_ms=Point*MarketInfo(Symbol(),MODE_LOTSIZE);//1
//MarketInfo("XAGUSD",MODE_LOTSIZE)为每手合约大小,例如:易信的XAGUSD的每手合约为1000
//XAGUSD的Point,小数最后一位每波动1对应的基础货币(XAGUSD的基础货币为USD)价值,XAGUSD的Point=0.0001
//那么,1手的XAGUSD对应的报价,该报价每波动一个最小值,价值为0.0001*1000=0.1USD
//Print("Point:",Point);
//Print("v_ms:",v_ms);
//如果容忍1手止盈止损300美元,即0.1手30美元的范围,则该报价需要波动多少个最小单位呢
//double v_bd=300/v_ms;
//Print("v_bd:",v_bd);
}
//int len_symbol=StringLen("China50");
//string str_symbol_right3=StringSubstr("China50",len_symbol-3,3);//len_symbol的值=7,返回字符串"a50"
//string str_symbol_left3=StringSubstr("China50",0,3);//返回字符串"Chi"
//
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
//光标移动至关键字(mt4系统保留字、函数),单击——按F1,MT4系统弹出对应的帮助内容。
//for (buys=0,sells=1;)
//-----------------------设置止盈止损
for (int i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderStopLoss()==0 || OrderTakeProfit()==0) && Symbol()==OrderSymbol())
{
//逻辑:交易品种损益计算模式分为:1、外汇(货币对,金、银);2、差价合约(指数,金银以外的金属、其他实物)
//yksd=yksd*Point;
//if(若交易品种的外汇,基础货币==美元 && 利润货币!=美元) 则{yksd=yksd*Ask*Point;}
double aa=MarketInfo(OrderSymbol(),MODE_TICKSIZE)*yksd;
string currency_base=SymbolInfoString(OrderSymbol(),SYMBOL_CURRENCY_BASE);
//currency_base返回交易品种基础货币,例1:EURJPY,值=EUR;例2:China50,值=USD;例3:Corn,值=USD
string currency_profit=SymbolInfoString(OrderSymbol(),SYMBOL_CURRENCY_PROFIT);
//currency_profit返回交易品种利润货币,例21:EURJPY,值=JPY;例22:China50,值=USD;例23:Corn,值=USD
string currency_margin=SymbolInfoString(OrderSymbol(),SYMBOL_CURRENCY_MARGIN);
// currency_margin返交易品种预付款货币,currency_margin=currency_base例31:EURJPY,值=EUR(即,基础货币);例32:China50,值=USD;例33:Corn,值=USD
//--------
//交易品种,例:XAGUSD\XAUUSD\China50\EURUSD\USDJPY\Corn,
//Point的值以利润货币计量。
if (currency_base=="USD" && currency_base!=currency_profit) {aa=yksd*Ask/(MarketInfo(OrderSymbol(),MODE_LOTSIZE));}
//例USDJPY、USDCHF
if (currency_profit=="USD" && currency_base!=currency_profit) {aa=yksd/(MarketInfo(OrderSymbol(),MODE_LOTSIZE));} //例:XAGUSD、XAUUSD、EURUSD
//若交易品种为外汇,则左侧货币为基础货币,右侧货币为利润货币(报价货币),Point的值以利润货币计量。例:USDJPY的Point=0.001日元。 EURUSD的Point=0.00001美元。
if (currency_base=="USD" && currency_base==currency_profit) {aa=yksd/MarketInfo(OrderSymbol(),MODE_LOTSIZE);} //例:China50、Corn
//若交易品种为指数\金属(除金、银交易品种属性为外汇外)等差价合约品种,则SYMBOL_CURRENCY_BASE、SYMBOL_CURRENCY_PROFIT、SYMBOL_CURRENCY_MARGIN均为USD。
if (currency_base !="USD" && currency_base!=currency_profit && currency_profit!="USD") {aa=yksd*MarketInfo(OrderSymbol(),MODE_TICKSIZE);};
//不含美元的外汇交易品种。例:EURJPY,EURJPY的Point=0.001日元。这种品种较多,难以明确,如自动止损不合格,需手动处理。
//Print(aa,Symbol(),Point,currency_base,currency_profit,currency_margin);
Sleep(5);
if (OrderType()==OP_SELL && Symbol()==OrderSymbol() )
{
bool res1=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid+aa,Digits),NormalizeDouble(Bid-aa,Digits),0,CLR_NONE );
if(!res1)
Print("Error in OrderModify. Error code=",GetLastError());
}
if (OrderType()==OP_SELLLIMIT && Symbol()==OrderSymbol())
{
bool res3=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+aa,Digits),NormalizeDouble(OrderOpenPrice()-aa,Digits),TimeCurrent()+gyxq_v,Blue);
if(!res3)
Print("Error in OrderModify. Error code=",GetLastError());
}
if (OrderType()==OP_SELLSTOP && Symbol()==OrderSymbol())
{
bool res5=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+aa,Digits),NormalizeDouble(OrderOpenPrice()-aa,Digits),TimeCurrent()+gyxq_v,CLR_NONE );
if(!res5)
Print("Error in OrderModify. Error code=",GetLastError());
}
//--------------------------------------------------------------------------------------
if (OrderType()==OP_BUY && Symbol()==OrderSymbol() )
{
bool res0=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask-aa,Digits),NormalizeDouble(Ask+aa,Digits),0,CLR_NONE );
if(!res0)
Print("Error in OrderModify. Error code=",GetLastError());
}
if (OrderType()==OP_BUYLIMIT && Symbol()==OrderSymbol())
{
bool res3=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-aa,Digits),NormalizeDouble(OrderOpenPrice()+aa,Digits),TimeCurrent()+gyxq_v,Blue);
if(!res3)
Print("Error in OrderModify. Error code=",GetLastError());
}
if (OrderType()==OP_BUYSTOP && Symbol()==OrderSymbol())
{
bool res5=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-aa,Digits),NormalizeDouble(OrderOpenPrice()+aa,Digits),TimeCurrent()+gyxq_v,CLR_NONE );
if(!res5)
Print("Error in OrderModify. Error code=",GetLastError());
}
}
//-----------------------设定订单有效期-----------------
if (OrderType()>1 && OrderExpiration()==0 && Symbol()==OrderSymbol())
{
bool res99=(OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit(),TimeCurrent()+gyxq_v,clrNONE));
if (!res99)
Print("Error in OrderModify. Error code=",GetLastError());
}
}
}