初学者的问题 MQL4 MT4 MetaTrader 4 - 页 17

 
Babu Bonappan:

按照我的理解,OrderOpenPrice给我的正是我所需要的。但前提是存款货币 为美元,交易货币为欧元/美元。在这种情况下,就好像OrderOpenPrice存储了开单时基础货币对存款货币的汇率,知道这个汇率就可以轻松计算出存款。

但是,如果这些条件中至少有一个没有得到满足,我们如何才能获得单个订单的押金价值?我们在哪里可以找到报价的基础货币相对于存款的货币在开盘时的汇率?

是的,我们有订单开放的时间到最近的一秒。但我们能得到什么呢?最多是--所需符号的分钟蜡烛的参数。但绝不是用于计算存款的利率的确切数值。但是,AccountMargin函数却以某种方式得到了它!我非常想了解它到底是如何做到的。

你需要三个公式来计算保证金。

根据你存款的货币,你将计算出任何货币对的保证金。

有可能在计算中会出现错误。但它会比计算结果四舍五入到存款基础货币的百分之一单位时出现的要小得多,即如果是美元,那么我指的是美分。

PS

AccountMargin是当前的,也就是最后的值。

 

如果我使用MarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot 获得开单时保证金的 准确,会怎么样呢--它总是有两位小数,对吗?然后我将它乘以100,并将其保存为这个订单的MagicNumber。如果有必要,我会把它拿出来,然后除以100.0。

这是否正确?

 
Babu Bonappan:

如果我使用MarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot 获得开单时保证金的 准确,会怎么样呢--它总是有两位小数,对吗?然后我将它乘以100,并将其保存为这个订单的MagicNumber。如果有必要,我会把它拿出来,然后除以100.0。

这是否正确?

同样,这也不是MagicNumber的作用。最好是把它写进日志文件,然后再读取。

这完全取决于这种计算的目的和程序所设计的订单数量。

在我看来,这种精确的计算只对经纪人或经纪公司是必要的。

从这个角度来看,最佳解决方案是记录。

 
Vitaly Muzichenko:

你为什么要对标志的数量撒谎?不要误导人们。

哈。

你从来没有听说过高精尖账户吗?

 

推迟了。

写了一个简单的专家顾问,有一个小插曲。

平仓半手不能正常工作,订单在每个tick上都被修改。

下面是要购买的修改块

如果(CountBuy()>0) //这个函数计算买入订单的数量。
{ for (int i = OrdersTotal() -1; i>=0; i--)
{ 如果(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{ 如果(OrderMagicNumber()==Magic &&OrderType()==OP_BUY &&(Ask-OrderOpenPrice())*10000>MinMove) //如果价格已经超过指标要求的移动量
SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //这里我把Stop改为Breakeven。
if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //我尝试关闭一半的手。
Print("平仓买入一半的错误")。
if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //这里我把剩下的部分移到Breakeven。
Print("修改为购买时收支平衡的错误")。

}} }


 
Vladimir Karputov:

转载于此。

代码 粘贴到帖子中,使其可读。

 
你能不能给我一些提示,告诉我如何处理这个问题。我几乎已经用一个外部指标写了一个简单的专家顾问,但我遇到了一个麻烦。

如果区块有OrederClose--一半的地段立即被关闭,OrderModify不再起作用。

如果我们删除OrederClose,OrderModify会修改每个tick的订单

下面是要购买的修改块

   if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
   { for (int i = OrdersTotal() -1; i>=0; i--)
     { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print("Ошибка закрытия половины лота на покупку");
      if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
       Print("Ошибка модификации в безубыток на покупку");

   }    }   }
如果价格达到MinMove,我应该如何关闭一半的订单,并使另一半订单进入Breakeven状态一次?
 
Vasiliy Danilov:
能否请您给我一些如何处理这个问题的提示?我几乎已经用一个外部指标写了一个简单的专家顾问,但有一个小插曲。

如果你在块中有OrederClose,它会立即关闭一半的手,OrderModify不再起作用。

如果你删除了OrederClose,OrderModify将在每个tick上修改订单。

下面是要购买的修改块

   if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
   { for (int i = OrdersTotal() -1; i>=0; i--)
     { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print("Ошибка закрытия половины лота на покупку");
      if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
       Print("Ошибка модификации в безубыток на покупку");

   }    }   }
如果价格达到MinMove,我应该如何关闭一半的订单,并使另一半的订单达到Breakeven?

你有一个错误,关闭了一半的地段,所以它没有修改。请根据我上面的帖子进行更正。

要做到这一点,你必须将盈亏平衡点设置为一个固定的点数,并将订单获利的检查条件添加到符合这个数字的事实中。

而当价格通过订单修改块中的这样一个条件时,一半的订单应该被关闭。

 
Alexey Kozitsyn:
不,试着了解你在做什么。你所写的只是一个函数的原型(也就是说,只是对它的作用的描述)。所以你就把它从文件中扯出来。你需要使用它。所以你必须用你自己的价值观来代替论据。而该函数将返回结果。那么这个结果必须被处理。

谢谢你的答复...我搜索了半个互联网,很少有使用StringFind 函数的例子,从我找到的资料中,我得出结论,参数必须是

intStringFind(

stringcomment =OrderComment()// 我们正在寻找的字符串
字符串OrderStopLoss, OrderTakeProfit//我们正在寻找的东西
intstart_pos=0//在哪个位置开始搜索

);

...如果我说错了,请纠正我 ...

 
Vitaly Muzichenko:

你为什么要对标志的数量撒谎?不要误导人们。

每个经纪人的观点 都是不同的
原因: