在锁仓账户中用单边模式计算多个订单的价格

jayMetaTrader 4 脚本4年前 (2021-07-04)385
MT4账户一般是双边模式,但如果你采用加仓的话,价格分布在不同位置,就不好知道当前的平均开单价,本脚本采用MT5的单边账户模型显示了一些相应的价格(平均开单价,保本价,中价),并可以计算到达某个价格下的利润。 - 在MQL5代码库免费下载 MetaTrader 4的'在锁仓账户中用单边模式计算多个订单的价格' ('meridian28...

输入的时候,‘计算价格利润’选项填当前交易的商品目标价,0代表不计算。如图:

首先选择当前图表货币的订单,并累计价格,找到最大最小价格,数订单的数量和仓位等。

 int total=OrdersTotal(); int num = 0; double diffs[][2]; ArrayResize(diffs,total); ArrayInitialize(diffs,0.0);//------ for(int i = total - 1; i >= 0; i--) {if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==_Symbol) {double price=OrderOpenPrice();if(OrderType() == OP_BUY){ if(calcoutprice>0 && OrderProfit())calc_profit_sum+=OrderSwap()+OrderProfit()*(calcoutprice-price)/(Bid - price); if(calcswap) {diffs[num][0] = OrderProfit() ? OrderSwap() * (Bid - price) /OrderProfit() : Ask - Bid;diffs[num][1] = (int)(now-OrderOpenTime())/PeriodSeconds(PERIOD_D1);//iBarShift(_Symbol,PERIOD_D1,(datetime)OrderOpenTime()); } buy_lots +=OrderLots(); value_sum +=OrderLots()*(price-diffs[num][0]);}if(OrderType() == OP_SELL){ if(calcoutprice>0 && OrderProfit())calc_profit_sum+=OrderSwap()+OrderProfit()*(calcoutprice-price)/(Ask - price); if(calcswap) {diffs[num][0]= OrderProfit() ? OrderSwap() * (Ask - price) /OrderProfit() :Bid-Ask;diffs[num][1] = (int)(now-OrderOpenTime())/PeriodSeconds(PERIOD_D1); } sell_lots +=OrderLots(); value_sum -=OrderLots()*(price-diffs[num][0]);}if(OrderType()<2 && price!=0){ max = MathMax(max,price); min = MathMin(min,price); price_sum += price; comiss_sum += OrderCommission(); num++;} } } for(int i=num-1; i>=0; i--)printf("[%d],%.0f,%f",i,diffs[i][1],diffs[i][0]/_Point);

然后在图表上创建价格对象,用横线显示:

 string name_0=_Symbol+"_weight"; string name_1=_Symbol+"_avgp"; string name_2=_Symbol+"_mean"; if(buy_lots!=sell_lots) {double quantity=buy_lots-sell_lots;double avgp=NormalizeDouble(value_sum /quantity,_Digits);// total_lotsprintf("1:%f,%f,%f",quantity,avgp,comiss_sum/(buy_lots+sell_lots));if(ObjectFind(0,name_0)<0){ ObjectCreate(0,name_0,OBJ_HLINE,0,0,avgp); ObjectSetInteger(0,name_0,OBJPROP_COLOR,clrGold); ObjectSetInteger(0,name_0,OBJPROP_STYLE,DRAW_SECTION);}else ObjectMove(name_0,0,0,avgp); } elseObjectDelete(0,name_0); if(calc_profit_sum!=0)printf("price %f %s's profit:%f",calcoutprice,_Symbol,calc_profit_sum);

上面(订单量和价格累积)需要考虑到并非完全锁仓的情况,即(buy_lots!=sell_lots)。

一般当价格在这条线上(空单在下)你当前交易的货币就是盈利了。

当前原油的保本价格就是黄色的那条虚线,并考虑到了仓息(由于我只开了一单,这里没显示其他订单),显示如下:

“calc_profit_sum ”这个通过当前订单的利润和价差来累加到目标价的利润或者亏损。

信息打印在"EA"选项中,如下图:

首先显示的是:1:综合仓位,累积仓位的平均价格(保本价格),平均的手续费。(RETAIL_NETTING_MONEY WTI,M5: 1:0.100000,21.620000,0.000000)

然后显示了当价格在25时,当前symbol的盈利。(RETAIL_NETTING_MONEY WTI,M5: price 25.000000 WTI's profit:338.000000)

当然你也可以在‘计算价格利润’填15,显示那时的亏损。

最后显示的是:2:订单数,价格平均值,价格中值。( RETAIL_NETTING_MONEY WTI,M5: 2:1,21.580000,21.580000)

然后创建开单价格中值和平均值对象,分别显示绿线和白线:

if(num > 0) {double avgp=NormalizeDouble(price_sum / num,_Digits);double mean=NormalizeDouble((max + min) / 2.0,_Digits);printf("2:%d,%f,%f,",num,avgp,mean);if(ObjectFind(0,name_1)<0){ ObjectCreate(0,name_1,OBJ_HLINE,0,0,avgp); ObjectSetInteger(0,name_1,OBJPROP_COLOR,clrLime); ObjectSetInteger(0,name_1,OBJPROP_STYLE,DRAW_SECTION);}else ObjectMove(name_1,0,0,avgp);if(ObjectFind(0,name_2)<0){ ObjectCreate(0,name_2,OBJ_HLINE,0,0,mean); ObjectSetInteger(0,name_2,OBJPROP_COLOR,clrSnow); ObjectSetInteger(0,name_2,OBJPROP_STYLE,DRAW_SECTION);}else ObjectMove(name_2,0,0,mean); } else {ObjectDelete(0,name_1);ObjectDelete(0,name_2); }

----------------------

打包下載:ZIP下載

----------------------

扫描二维码推送至手机访问。

本文转载自互联网,如有侵权,联系删除。

本文链接:https://www.fxajax.com/MT4scripts/125074.html

您暂未设置收款码

请在主题配置——文章设置里上传

扫描二维码手机访问