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

 
Babu Bonappan:

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

这是否正确?

你想给每个订单分配一个神奇的数字吗?
 
Babu Bonappan:

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

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

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

OrderOpenPrice - 订单的开盘价,它(价格)是一种货币对另一种货币的比率。

AccountMargin - 给出所有未结订单的账户总保证金。

 
Vladimir Karputov:

推迟了。

Vasiliy Danilov, 2016.12.02 07:18

你能告诉我该怎么做吗?我几乎用一个外部指标写了一个简单的专家顾问,有一个小插曲。

一半手的平仓不能正常工作,每一个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("修改为购买时收支平衡的错误")。

}} }


If SL !=OrderStopLoss()) modify .... 那么只有在SL与当前OrderStopLoss 不同的情况下才会修改订单。

而要了解关闭时出了什么问题,可以使用GetLastError();一般来说,检查OrderClose会比较好 bool testOrCls

testOrCls=OrderClose ......

if(!testOrCls) Print (GetLastError())。

也就是说,如果有错误,我们就要求提供错误代码;如果没有错误,我们就不要求提供错误代码。


 
bablusut:

谢谢你的答复...我搜索了半个互联网,很少有使用StringFind 函数的例子,从我发现的情况来看,我的结论是参数必须是。

intStringFind(

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

);

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

它并不是这样的。这个函数的参数是:1)你想搜索的字符串;2)你想找到的字符组合;3)搜索的开始(默认情况下,根据步骤1从字符串的空字符开始)。

它返回所寻找的子串在字符串中开始的位置数,如果没有找到子串,则返回-1。

换句话说,像这样写。

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}
 
Renat Akhtyamov:

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

如果你只想做一次,你应该用一个固定的点数来指定盈亏平衡点,并在它与这个数字对应的事实上增加检查订单的获利条件。

而当在订单修改块中通过这样的条件时,一半的订单被关闭。

瓦西里-达尼洛夫(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时关闭?

顺便说一下,我刚刚注意到OrderSelect by position SELECT_BY_POS,但票选在哪里?

订单关闭(OrderTicket()

 
Babu Bonappan:

请告知如何使用MQL4来获取终端中每个未结头寸的保证金值?

我以前是这样做的。

margin = MarketInfo(Symbol(),MODE_LOTSIZE) * OrderOpenPrice() / AccountLeverage() * OrderLots();

在交易欧元/美元时,这种结构运行良好,我确信其逻辑是正确的。

但现在我想对欧元/日元(或欧元/瑞士法郎)得到同样的结果。很明显,我需要将标准手的价值乘以基础货币与入金货币 的汇率(在我的例子中,乘以欧元/美元),而不是OrderOpenPrice()。但这个比率是多少呢?是开仓时的汇率,还是我们现在的汇率(在我们想知道这个仓位的存款额时)?

没有 MODE_MARGINMAINTENANCE?

 
A1exPit:

顺便说一下,我刚刚注意到SELECT_BY_POS位置上的OrderSelect,但选择票在哪里?

订单关闭(OrderTicket()

在这一主题中,你难道一点都不知道吗?

如果订单被选中,那么OrderTicket()就会返回所选订单的 票据。而且,如何选择订单并不重要--按索引或按票据。

在按票选择的情况下,有一个微妙的问题-- 不被考虑,我们必须检查从哪个列表中选择订单,检查其关闭的时间。

 
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,我应该如何关闭?

当部分关闭票据的变化。首先是收支平衡,然后是关闭。

要么改变逻辑。

 
Artyom Trishkin:

A1exPit

顺便说一下,我刚刚注意到OrderSelect by SELECT_BY_POS ,但选择票在哪里?

订单关闭(OrderTicket()

在这一主题中,你难道一点都不知道吗?

如果选择了一个订单,那么OrderTicket()就会返回所选订单的 票据。而且,如何选择订单并不重要--按索引或按票据。

按票据选择时有一个细微的差别--池子 不被考虑在内,你需要通过检查订单关闭的时间来检查从哪个列表中选择。

如果我们看一下写这段评论的代码?那里不是那么直接的...

{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
 
Vitalie Postolache:

如果你看一下写这段评论的代码?那里并不那么明确...

{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
嗯...是啊...我没有仔细看。只是一瞥。由于某种原因,我对这个主题不感兴趣