double LotsOptimized() //开仓量计算函数(根据要求计算出订单交易量,小数型)
{
double lot=Lots; // 定义局部变量los 小数型
int orders=HistoryTotal(); // history orders total 历史平仓单数(已平仓)
int losses=0; // number of losses orders without a break-亏损单
//---- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//计算 开仓下单量=帐户可用资金*最大风险系数(=2%)/1000.0,并将结果保留小数点1位
(通过风险系数的计算获得当前入场单应该采用的交易量,除以1000是因为大多货币对汇价都在这个附近。)
//---- calcuulate number of losses orders without a break-计算亏损单数目
if(DecreaseFactor>0) // 如果 下跌因子(=3)>0
{
for(int i=orders-1;i>=0;i--) // 计次循环(i=历史平仓单数-1,到i=0, 递减1)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Error in history!");
break;
}
// 如果 没有本系统交易记录,输出“无交易历史!”
//+------------------------------------------------------------------+
//| Check for open order conditions |
//| 自定义函数(无返回值) 开仓策略 |
//+------------------------------------------------------------------+
void CheckForOpen() // 开仓检查(判断开仓条件及其处理)
{
double ma; // 定义局部变量ma为小数型
int res; // 定义局部变量res为整数型
//---- go trading only for first tiks of new bar ---- 只有在新K线的首次报价时执行
if(Volume[0]>1) return;
// 如果当前K线的成交价次数大于1时,返回
(不是K线的开盘时间点,即当前k线还没收盘确定,则直接返回;否则,如果是K线第一个成交价,则向下继续运行)
// ---- get Moving Average – 获取均线数值
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
// 获取当前以收盘价为基准计算出的均线数值
iMA(NULL,0,12,6,MOD_SMA,PRICE_CLOSE,0)
// ---- sell conditions-卖出条件
if(Open[1]>ma && Close[1]<ma) // 如果前1根K线下穿均线(即K线的开盘价大于均线值、收盘价小于均线值)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
// 发送仓单(当前货币对,卖出方向,开仓量计算(),买价,滑点=3,无止损,无止赢,订单编号,标上红色箭头)
return; // 返回
}
// ---- buy conditions - 买入条件
if(Open[1]<ma && Close[1]>ma) // 如果前1根K线上穿均线(即K线的开盘价小于均线值、收盘价大于均线值)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
// 发送仓单(当前货币对,买入方向,开仓量计算(),卖价,滑点=3,无止损,无止赢,订单编号,标上蓝色箭头)
return; // 返回
}
//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//| 自定义函数(无返回值) 平仓策略 |
//+------------------------------------------------------------------+