外汇交易辅助EA编程详解

//=============== 变量外部定义

extern int 第一目标点数 = 20;

extern int 第二目标与第一目标距离 = 20;

extern double 分批平仓手数 = 0.2;

//=======================================

extern bool 使用移动止损功能 = true;

extern int 第一次盈利点数 = 10;

extern int 第一次移止损距离开仓价点数 = 0;

extern int 第二次盈利点数 = 30;

extern int 第二次移止损距离开仓价点数 = 10;

//======================================

extern bool 使用最大允许亏损功能 = true;

extern int 最大亏损点数 = 20;

extern int Magic_Number=0;

//=============== 内部变量

int nextTP;

bool sl;

int range = 5;

int multiplier;

// 订单类型为1即卖出

//=============== 初始化函数

int init()

{

sl=0;

nextTP = 第一目标点数;

getMaxLoss();

}

//== 结束函数

//=============== 退出函数

int deinit()

{

//----

sl=0;

nextTP = 第一目标点数;

//----

return(0);

}

//== 结束函数

//========== 主函数

int sDLSM外汇tart()

{

//----

getOpenOrders();

getSpread();

//注释掉显示

//----

return(0);

}

//== 结束函数

//========== 计算订单盈亏点数

double type_order_profit(double order_openprice,int ordertype)

{

double val;

RefreshRates();

if(ordertype == 1) val=(NormalizeDouble(order_openprice,Digits) - NormalizeDouble(Ask,Digits));

else val=(NormalizeDouble(Bid,Digits) - NormalizeDouble(order_openprice,Digits));

val = val/Point;

return(val);

}

//== 结束函数

// 获取点差

int getSpread()

{

int spread=MarketInfo(Symbol(),MODE_SPREAD);

return(spread);

}

// 获取最大亏损点数

int getMaxLoss()

{

int calcMaxLoss;

calcMaxLoss = 最大亏损点数;

return(calcMaxLoss);

}

//========== 遍历订单并管理

void getOpenOrders()

{

int nsl, nsd;

string mngMagic;

int totalorders = OrdersTotal();

for(int j=0; j

{

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol()&&(Magic_Number==0 || Magic_Number == OrderMagicNumber()))

{

double order_profit=type_order_profit(OrderOpenPrice(),OrderType());

//注释掉原利润计算

if(使用最大允许亏损功能 && 最大亏损点数 > 0) killTrade(order_profit,OrderTicket());

if(使用移动止损功能) checkStops(order_profit,OrderTicket());

Close_at_Profit(order_profit,OrderTicket());

}

if(Magic_Number == 0)

mngMagic = "所有"+Symbol()+"交易。";

else

mngMagic = "带魔法编号的交易 = "+Magic_Number;

if(sl==0)

{

nsl = 第一次盈利点数;

nsd = 第一次移止损距离开仓价点数;

}

else

{

nsl = 第二次盈利点数;

nsd = 第二次移止损距离开仓价点数;

}

//刷新报价已注释

Comment("订单开仓价: ",OrderOpenPrice(),

"/n点数计算: ", order_profit,

"/n下一止损目标: ",nsl,

"/n下一止损差值: ", nsd,

"/n下一止盈: ", nextTP,

"/n止损状态: ",sl,

"/n最大亏损: ", getMaxLoss(),

"/n管理: ",mngMagic);

}

}

//========== 分批止盈函数

void Close_at_Profit(int orderprofit, int orderticket)

{

if(OrderSelect(orderticket, SELECT_BY_TICKET)==true)

{

if(orderprofit >= nextTP && orderprofit < (nextTP + 第二目标与第一目标距离))

{

if(OrderType()==1)

{

if(OrderClose(orderticket, 分批平仓手数, Ask, 3, YellowGreen))

nextTP+=第二目标与第一目标距离;

else

Print("关闭订单出错 : ",GetLastError());

}

else

{

if(OrderClose(orderticket, 分批平仓手数, Bid, 3, YellowGreen))

nextTP+=第二目标与第一目标距离;

else

Print("关闭订单出错 : ",GetLastError());

}

}

}

}

//== 结束函数

//========== 移动止损检查

void checkStops(int Orderprofit,int ticket)

{

if(sl==0 && Orderprofit < 第二次盈利点数)

{

if(Orderprofit >= 第一次盈利点数 && Orderprofit < (第二次盈利点数))

{

moveStops(ticket, 第一次移止损距离开仓价点数);

}

}

else if(sl==1 || Orderprofit >= 第二次盈利点数)

{

if(Orderprofit >= 第二次盈利点数)

{

moveStops(ticket,第二次移止损距离开仓价点数);

}

}

}

//== 结束函数

//========== 执行移动止损

void moveStops(int orderticket,int TrainingStop)

{

if(OrderSelect(orderticket, SELECT_BY_TICKET)==true)

{

Print("调用移动止损 ",orderticket, " ",TrainingStop);

if(OrderType()==1)

{

OrderModify(orderticket,OrderOpenPrice(),OrderOpenPrice()-TrainingStop*Point, OrderTakeProfit(),0,Plum);

sl=1;

}

else

{

OrderModify(orderticket,OrderOpenPrice(),OrderOpenPrice()+TrainingStop*Point, OrderTakeProfit(),0,Plum);

sl=1;

}

}

}

//== 结束函数

//========== 最大亏损平仓

void killTrade(int pips, int ticket)

{

if(OrderSelect(ticket, SELECT_BY_TICKET)==true)

{

if(pips <= -1*getMaxLoss())

{

if(OrderType()==1) OrderClose(ticket,OrderLots(),Ask,3,Red);

else OrderClose(ticket,OrderLots(),Bid,3,Red);

}

}

}