您需要 登录 才可以下载或查看,没有帐号?注册
本帖最后由 hwq597 于 2017-7-3 07:51 编辑
如何把固定的下单量改成下面用公式表示的下单量(只用到小数点后2位,附合下单要求)
下单量=(资金*10/100)/(市场价格/500)
extern double 下单量=0.1;
extern int 止损点数=0;
extern int 止盈点数=0;
extern int 移动止损点数=500;
extern int magic=52142;
datetime buytime=0;
datetime selltime=0;
int onInit()
{
return(INIT_SUCCEEDED);
}
void onDeinit(const int reason)
{
}
void onTick()
{
double k0=iCustom(Symbol(),0, KD ,0,0);
double d0=iCustom(Symbol(),0, KD ,1,0);
double k1=iCustom(Symbol(),0, KD ,0,1);
double d1=iCustom(Symbol(),0, KD ,1,1);
if(k0 d0 k1 d1)//buy
{
closesell(Symbol()+ sell ,magic);
if(buytime!=Time[0])
{
if(buy(下单量,止损点数,止盈点数,Symbol()+ buy ,magic) 0)
{
buytime=Time[0];
}
}
}
if(k0 d0 k1 d1)//sell
{
closebuy(Symbol()+ buy ,magic);
if(selltime!=Time[0])
{
if(sell(下单量,止损点数,止盈点数,Symbol()+ sell ,magic) 0)
{
selltime=Time[0];
}
}
}
yidong();
}
void yidong()
{
for(int i=0;i OrdersTotal();i++)//移动止损通用代码,次代码会自动检测buy和sell单并对其移动止损
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderType()==0 OrderSymbol()==Symbol() OrderMagicNumber()==magic)
{
if((Bid-OrderOpenPrice()) =Point*移动止损点数)
{
if(OrderStopLoss() (Bid-Point*移动止损点数) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*移动止损点数,OrderTakeProfit(),0,Green);
}
}
}
if(OrderType()==1 OrderSymbol()==Symbol() OrderMagicNumber()==magic)
{
if((OrderOpenPrice()-Ask) =(Point*移动止损点数))
{
if((OrderStopLoss() (Ask+Point*移动止损点数)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*移动止损点数,OrderTakeProfit(),0,Green);
}
}
}
}
}
}
void closebuy(string com,int magic)
{
int t=OrdersTotal();
for(int i=t-1;i i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol() OrderType()==OP_BUY OrderComment()==com OrderMagicNumber()==magic)
{
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),300,Green);
}
}
}
}
void closesell(string com,int magic)
{
int t=OrdersTotal();
for(int i=t-1;i i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol() OrderType()==OP_SELL OrderComment()==com OrderMagicNumber()==magic)
{
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),300,Green);
}
}
}
}
int buy(double lots,double sl,double tp,string com,int buymagic)
{
int a=0;
bool zhaodan=false;
for(int i=0;i OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
string zhushi=OrderComment();
int ma=OrderMagicNumber();
if(OrderSymbol()==Symbol() OrderType()==OP_BUY zhushi==com ma==buymagic)
{
zhaodan=true;
break;
}
}
}
if(zhaodan==false)
{
if(sl!=0 tp==0)
{
a=OrderSend(Symbol(),OP_BUY,lots,Ask,50,Ask-sl*Point,0,com,buymagic,0,White);
}
if(sl==0 tp!=0)
{
a=OrderSend(Symbol(),OP_BUY,lots,Ask,50,0,Ask+tp*Point,com,buymagic,0,White);
}
if(sl==0 tp==0)
{
a=OrderSend(Symbol(),OP_BUY,lots,Ask,50,0,0,com,buymagic,0,White);
}
if(sl!=0 tp!=0)
{
a=OrderSend(Symbol(),OP_BUY,lots,Ask,50,Ask-sl*Point,Ask+tp*Point,com,buymagic,0,White);
}
}
return(a);
}
int sell(double lots,double sl,double tp,string com,int sellmagic)
{
int a=0;
bool zhaodan=false;
for(int i=0;i OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
string zhushi=OrderComment();
int ma=OrderMagicNumber();
if(OrderSymbol()==Symbol() OrderType()==OP_SELL zhushi==com ma==sellmagic)
{
zhaodan=true;
break;
}
}
}
if(zhaodan==false)
{
if(sl==0 tp!=0)
{
a=OrderSend(Symbol(),OP_SELL,lots,Bid,50,0,Bid-tp*Point,com,sellmagic,0,Red);
}
if(sl!=0 tp==0)
{
a=OrderSend(Symbol(),OP_SELL,lots,Bid,50,Bid+sl*Point,0,com,sellmagic,0,Red);
}
if(sl==0 tp==0)
{
a=OrderSend(Symbol(),OP_SELL,lots,Bid,50,0,0,com,sellmagic,0,Red);
}
if(sl!=0 tp!=0)
{
a=OrderSend(Symbol(),OP_SELL,lots,Bid,50,Bid+sl*Point,Bid-tp*Point,com,sellmagic,0,Red);
}
}
return(a);
}
这个EA你可以参看下
MT4智能交易系统EA顺势加仓的写法:2个月37000倍的EA
//-------自动加仓(对所有单有效)
void TrailPositions11()
{
int cnt = OrdersTotal();
for (int i=0; i i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
int type = OrderType();
if (type == OP_SELL )
{
if(CalculateSellOrders() 1 CalculateSell() 10 CalculateBuy() 1 Close[0] PJ1)
{
OrderSend(Symbol(),OP_SELLSTOP,LotSize() ,Bid-15*Point,3,Bid+15*Point,Bid-360*Point, 顺向挂STOP卖单 ,MAGICMA33,expire2,Green);
}
else
return (0);
}
}
}
//-------自动加仓(对所有单有效)
void TrailPositions011()
{
int cnt = OrdersTotal();
for (int i=0; i i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
int type = OrderType();
if (type == OP_BUY )
{if (CalculateBuyOrders() 1 CalculateBuy() 10 CalculateSell() 1 Close[0] PJ1)
{
OrderSend(Symbol(),OP_BUYSTOP,LotSize(),Ask+15*Point,3,Ask-15*Point,Ask+360*Point, 顺向挂STOP买单 ,MAGICMA33,expire2,Red);
}
else
return (0);
}
}
}
其中还有子函数限制开仓数:CalculateBuyOrders()买单挂仓单数,CalculateSellOrders()卖单挂仓单数;CalculateBuy()买单数,CalculateSell()卖单数;PJ1是一分钟平均线60;LotSize()按资金量开仓控制;
1、CalculateBuyOrders()买单挂仓单数:
int CalculateBuyOrders()//计算STOP多挂单的张数
{
int buys=0,sells=0;
for(int i=0;i OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderType()==OP_BUYSTOP OrderSymbol()==Symbol() ) buys++;
}
return(buys);
}
2、CalculateSellOrders()卖单挂仓单数;
int CalculateSellOrders()// 算STOP空挂单的张数
{
int buys=0,sells=0;
for(int i=0;i OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderType()==OP_SELLSTOP OrderSymbol()==Symbol() ) sells++;
}
return(sells);
}
3、CalculateBuy()买单数;
int CalculateBuy()//计算多单的张数
{
int buys=0,sells=0;
for(int i=0;i OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderType()==OP_BUY OrderSymbol()==Symbol() ) buys++;
}
return(buys);
}
4、CalculateSell()卖单数;
int CalculateSell()// 算空单的张数
{
int buys=0,sells=0;
for(int i=0;i OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderType()==OP_SELL OrderSymbol()==Symbol() ) sells++;
}
return(sells);
}
5、LotSize()按资金量开仓控制;
double LotSize() // 下单数量
{ double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//MarketInfo(Symbol(),MODE_MINLOT); 相关信息
//MarketInfo(Symbol(),MODE_MAXLOT);
//MarketInfo(Symbol(),MODE_LOTSTEP);
lot= AccountEquity()/2000; //开仓量计算
if(lot 0.05) lot=0.01;
if(lot =0.05 lot 0.07) lot=0.06;
if(lot =0.07 lot 0.09) lot=0.08;
if(lot =0.09 lot 0.2) lot=0.1;
if(lot =0.2 lot 0.3) lot=0.2;
if(lot =0.3 lot 0.5) lot=0.4;
if(lot =0.5 lot 0.7) lot=0.6;
if(lot =0.7 lot 0.9) lot=0.8;
if(lot =0.9 lot 2) lot=1;
if(lot =2 lot 3) lot=2;
if(lot =3 lot 5) lot=4;
if(lot =5 lot 7) lot=6;
if(lot =7 lot 9) lot=8;
if(lot =9 ) lot=10;
return(lot);
}复制代码
if(MoneyManagement==true){ //资金管理开关
double Lot=NormalizeDouble(AccountEquity()*Point/10/100,1);
// 最大允许开仓比例占资金总量10%,只允许持有一张单,当持有一张单子时,不允许再开新单
???????????????????????????????????????????????????????????????????????????????????????????????????????????
外汇交易有很大的风险性,本站所有资源均来自网络,请选择使用,如若出现亏损,本站不承担任何责任!