在锁仓账户中用单边模式计算多个订单的价格
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下載
----------------------
相关文章