TotalBreakEven()为多个同向订单设置整体保本,常用于马丁EA
函数名称void TotalBreakEven(string SymbolX,int OrderTypeX,int MagicX,int BreakevenStartX,int BreakevenX)
函数介绍
为同方向的订单设置一个整体保本止损。不同与我发布的BreakEven()函数,BreakEven()是为单独的每个订单设置保本损,不同订单的保本损位置是不同的。
而TotalBreakEven()是为同向订单设置一个整体的保本损,比例为马丁EA,设置一个整体保本损。那所有的订单的止损价格是相同的。
TotalBreakEven()函数在使用时,需要依赖其他函数,我一并放到了下面的函数定义中。你们使用的时候把函数定义中的,多个函数定义均放到你代码的最下方即可。
//举例:为所有的多单设置一个10微点的总体保本损
TotalBreakEven(Symbol(),OP_BUY,MAGIC,500,10);
参数介绍
SymbolX:需要设置保本的品种,一般设置当前品种即可。也就是Symbol();
OrderTypeX:订单的方向,0代表多单,1代表空单
MagicX:订单的魔术码,你的EA的魔术码是多少,这里填上即可。
BreakevenStartX:开启保本的盈利点数(pips),当该方向订单总体盈利多少点时设定保本。
BreakevenX:保本的点数,一般设置0即可。如果你想多保本一些点数,可以设置一个大于0的整数数值。
函数定义
注意:本人发布的函数均为实战开发所用,低价或免费发布并不赚钱,仅限懂编程的朋友使用,不提供指导,因为人工成本巨贵,感谢朋友们海涵。void TotalBreakEven(string SymbolX,int OrderTypeX,int MagicX,int BreakevenStartX,int BreakevenX)
{
if(OrderTypeX==OP_BUY||OrderTypeX==-1)
if(MarketInfo(SymbolX,MODE_BID)>CostPrice(SymbolX,OP_BUY,MagicX)+BreakevenStartX*MarketInfo(SymbolX,MODE_POINT) && CostPrice(SymbolX,OP_BUY,MagicX)!=0)
{
//Print("大于点数");
if(LastStoploss(SymbolX,OP_BUY,MagicX)<CostPrice(SymbolX,OP_BUY,MagicX)+BreakevenX*MarketInfo(SymbolX,MODE_POINT))
ModifyByPrice(SymbolX,OP_BUY,CostPrice(SymbolX,OP_BUY,MagicX)+BreakevenX*MarketInfo(SymbolX,MODE_POINT),0,MagicX);
}
if(OrderTypeX==OP_SELL||OrderTypeX==-1)
if(MarketInfo(SymbolX,MODE_ASK)<CostPrice(SymbolX,OP_SELL,MagicX)-BreakevenStartX*MarketInfo(SymbolX,MODE_POINT))
{
//Print("大于点数");
if(LastStoploss(SymbolX,OP_SELL,MagicX)>CostPrice(SymbolX,OP_SELL,MagicX)-BreakevenX*MarketInfo(SymbolX,MODE_POINT))
ModifyByPrice(SymbolX,OP_SELL,CostPrice(SymbolX,OP_SELL,MagicX)-BreakevenX*MarketInfo(SymbolX,MODE_POINT),0,MagicX);
}
}
double CostPrice(string SymbolX,int OrderTypeX,int MagicX)
{
double PriceSum=0;
double OrderSum=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS))
if((OrderSymbol()==SymbolX ||SymbolX=="-1")&& (OrderMagicNumber()==MagicX || MagicX==-1)&&(OrderType()==OrderTypeX || OrderTypeX==-1))
{
PriceSum+=OrderOpenPrice()*OrderLots();
OrderSum+=OrderLots();
}
}
if(PriceSum!=0)
return(NormalizeDouble(PriceSum/OrderSum,MarketInfo(SymbolX,MODE_DIGITS)));
else
return(0);
}
double LastStoploss(string SymbolX,int OrderTypeX,int MagicX)
{
double LastStoploss=0;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i, SELECT_BY_POS))
if((OrderSymbol()==SymbolX|| SymbolX=="-1")&&(OrderMagicNumber()==MagicX||MagicX==-1)&&(OrderType()==OrderTypeX||OrderTypeX==-1))
{
LastStoploss=OrderStopLoss();
break;
}
return(LastStoploss);
}
void ModifyByPrice(string SymbolX,int OrderTypeX,double StopLossX,double TakeProfitX,int MagicX)
{
if(StopLossX>=0)
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS))
if((OrderSymbol()==SymbolX|| SymbolX=="-1")&&(OrderMagicNumber()==MagicX||MagicX==-1)&&(OrderType()==OrderTypeX||OrderTypeX==-1))
if(NormalizeDouble(StopLossX,(int)MarketInfo(OrderSymbol(),MODE_DIGITS))!=OrderStopLoss())
if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(StopLossX,(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),OrderTakeProfit(),0,Yellow))
Print(GetLastError());
}
if(TakeProfitX>=0)
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS))
if((OrderSymbol()==SymbolX|| SymbolX=="-1")&&(OrderMagicNumber()==MagicX||MagicX==-1)&&(OrderType()==OrderTypeX||OrderTypeX==-1))
if(OrderTakeProfit()!=NormalizeDouble(TakeProfitX,(int)MarketInfo(OrderSymbol(),MODE_DIGITS)))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(TakeProfitX,(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),0,Yellow))
Print(GetLastError());
}
页:
[1]