[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 825

 
eugggy:
我大致明白了,但如果(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))break是什么意思;如果没有选择这样的订单,那么中止还是什么?


OrderSelect(见https://docs.mql4.com/ru/trading/OrderSelect) 在函数失败时返回FALSE。请参阅https://docs.mql4.com/ru/basis/operators/break,了解断裂操作员。

这可以简化为

OrderSelect(i,SELECT_BY_POS,MODE_TRADES)。

最主要的是要选好顺序。

 
eugggy:


而对我来说,这看起来是绝对不同的事情。你能不能在你的代码中插入以下内容:如果(Tip==OP_BUYSTOP||Tip==OP_SELLSTOP&&Minute()<59&&Minute()>57) OrderDelete(Ticket)。

如果是的话,是哪一部分?


在没有看到你的代码的情况下,我可以假设,而不是(这完全取决于你的算法)。

如果(OrderType()==OP_BUYSTOP) OrderDelete(OrderTicket())。
如果(OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket())。
如果(OrderType()==OP_BUYLIMIT) OrderDelete(OrderTicket())。
如果(OrderType()==OP_SELLLIMIT) OrderDelete(OrderTicket())。

只有你需要把变量的顺序和条件中的括号用||和&&的方式改正。

Minute()<59&&Minute()>57 条件可以简化为Minute()==58 或者使用>=<=

在设置挂单时,为了在某一时期结束时或在某一时间强制关闭挂单,你可以指定到期日 参数--见https://docs.mql4.com/ru/trading/OrderSend。 在这种情况下,你不需要为其关闭编程而烦恼。而且该订单将无条件关闭,不对缺乏联系的情况进行任何纠正。

 
eugggy:

是的,有很多有用的东西。我本可以不收赠品,但这是一本写得很复杂的教科书。
你看...我在讨论 "他们现在怎么说话 "的问题 :)

赠品,伙计们!哟所有的人都来吧!!!。

我想如果SC的教科书是这样写的,那就是6分以上。

对不起,离题了...

 
eugggy:

不,我们不需要它,我们还需要它。 我看了图表:有时价格没有走出高低通道,挂单仍然存在。如果它们没有走出高-低通道,它们仍然存在。 你唯一需要做的是在新的交易出现之前关闭待定的交易。至于1986年的书,你是认真的吗?我自己也是古代人,但我认为这太过分了。


此外,你还必须编写额外的类似代码。在我看来,你的代码似乎有点乱了。

关于1986年的书,我并不是在开玩笑。同样,如果你想学习编程的基础知识,你需要在不被现代语言结构堵塞脑袋的情况下学习它们。你需要基本的东西。高中的计算机科学教科书,尤其是第一本,是为 "哑巴 "们有条不紊地编排的。现代教科书如何编写、由谁编写、为谁编写、为什么编写是一个独立的话题。

 

日期时间地段价格

26 2010.01.05 12:24 卖出 12 0.10 1.44026 1.44907 1.43526 0.00 3200.09
28 2010.01.05 13:21 买入 13 0.26 1.44326 1.43445 1.44826 0.00 3200.09
30 2010.01.05 15:34 卖出 14 0.43 1。44026 1.44907 1.43526 0.00 3200.09
32 2010.01.05 16:27 买入 15 0.72 1.44326 1.43445 1.44826 0.00 3200.09
34 2010.01.05 17:18 出售 16 1.19 1.44026 1.44907 1.43526 0.00 3200.09

在这里,我们在相应的方向上有5个开放的订单。

如何计算所有未平仓订单的总保证金?

对:EURODOLLAR,合约100,000,杠杆100。

 
ikatsko:

日期时间地段价格

26 2010.01.05 12:24 卖12 0.10 1.44026 1.44907 1.43526 0.00 3200.09
28 2010.01.05 13:21 买13 0.26 1.44326 1.43445 1.44826 0.00 3200.09
30 2010.01.05 15:34 卖14 0.43 1.44026 1.44907 1.43526 0.00 3200.09
32 2010.01.05 16:27 买15 0.72 1.44326 1.43445 1.44826 0.00 3200.09
34 2010.01.05 17:18 卖16 1.19 1.44026 1.44907 1.43526 0.00 3200.09

这里有5个各自方向的未结订单。

我如何计算所有未平仓订单的总保证金?

交易对:EUROLLAR,合约100000,杠杆100。

MarketInfo(Symbol(),MODE_MARGINREQUIRED);

返回买入订单中打开1手所需的自由资金量,好吧,看看其他的,取决于你的需求。

你可能也会发现这很有用。

double AccountFreeMarginCheck(string symbol,int cmd,double volume)

返回在当前账户上以当前价格开立指定头寸后剩余的自由资金数额。如果没有足够的可用资金,将产生错误 134(ERR_NOT_ENOUGH_MONEY)。
 
谢谢你的快速回复,但我想在这些头寸开仓前计算出保证金!该策略是雪崩,我需要知道在相应的仓位打开后是否会有止损?所有即将到来的地段的尺寸都是事先知道的。我想知道:可以开多少个订单(事先已知增量手)?
 
ikatsko:
谢谢你的快速回复,但我想在这些头寸开仓之前计算出保证金!该策略是雪崩,我需要知道在相应的仓位打开后是否会有止损?所有即将到来的地段的尺寸都是事先知道的。我想知道:可以开多少个订单(提前知道增量手)?
// ==========================================================================
// ------------ Функция рассчёта величины лота для открытия позиции ---------
// Если лот превышает возможный для открытия позы, то он корректируется 
// ==========================================================================

double CorrectLots(double lt)
{
   double ltcorr;
   double pnt =      MarketInfo(Symbol(),MODE_POINT);
   double mspr =     MarketInfo(Symbol(),MODE_SPREAD);
   double dig =      MarketInfo(Symbol(),MODE_DIGITS);
   double MaxLot =   MarketInfo(Symbol(),MODE_MAXLOT);
   double MinLot =   MarketInfo(Symbol(),MODE_MINLOT);
   double StpLot =   MarketInfo(Symbol(),MODE_LOTSTEP);
   double OneLot =   MarketInfo(Symbol(),MODE_MARGINREQUIRED);
   double TradeMrg = NormalizeDouble(AccountFreeMargin()/4.0,dig);    // Свободные средства, разрешенные к торговле
   
   lt=MathAbs(lt);
   ltcorr=lt;                       // Зададим начальное значением ltcorr равным значению lt
   
   if (lt>MaxLot) ltcorr=MaxLot;   // Проверим превышение допустимых ...
   if (lt<MinLot) ltcorr=MinLot;   // ... значений лота
   
   double Money=ltcorr*OneLot+mspr*pnt;    // Вычисляем стоимость открываемой позы

   if (Money<TradeMrg)              // Если свободных средств больше, чем цена позиции - 
      {
         return(ltcorr);                                                            // ... возвращаем неизменённый лот
      }
   else if (Money>=TradeMrg)        // Если цена позиции равна или больше, чем есть свободных средств, то ...
      {
         ltcorr=MathAbs(MathFloor(TradeMrg/OneLot/StpLot)*StpLot);               // ... рассчитаем допустимый лот
         double MoneyCorr=ltcorr*OneLot+mspr*pnt;                      
         Print("Func CorrectLots: лот ",lt," скорректирован до ",ltcorr,
               " Стоимость позы до корректировки = ",Money,
               " Стоимость позы после корректировки = ",MoneyCorr
               ); 
         return(ltcorr);                                                         // ... и вернём его значение
      }
   Print("Func CorrectLots: лот вернули без изменений");
   if (lt>MaxLot) ltcorr=MaxLot;   // Проверим превышение допустимых ...
   if (lt<MinLot) ltcorr=MinLot;   // ... значений лота
   return(ltcorr);                            // Возврат изначального лота в непредусмотренных случаях с сообщением
}

试着看看你自己能发现什么......:)

而且,再次强调。

double AccountFreeMarginCheck(string symbol,int cmd, double volume)

我在一个定制的EA中使用了这个功能,该EA也使用了裸露的马丁格尔。
我不得不在打开任何位置之前写上一行,以使其更加稳定。

double lt;                           // Лот
// --------------------------------- +

lt=CorrectLots(lt*2);                // Умножаем лот на 2 с проверкой и коррекцией под допустимый размер лота

// ------- Открытие позы ----------- +
 
Artem,我需要自己计算保证金,也就是说,我需要知道计算公式。我不需要终端对当前可能性的回答。我确实知道这个公式,但有一些关于计算重叠头寸的保证金的问题!我不知道。而且我甚至不知道什么是重叠的位置!?我特别举了一个例子,你可以看到每一个连续的仓位都是以与前一个相反的方向开仓。如果你通过加总所有手数来计算未结头寸 的保证金(并将该金额粘贴到公式中),那么当DC应用止损时,它与DC的实际反应不一致。我想按照DC的计算方式来计算它
 
ikatsko:
Artem,我需要自己计算保证金,也就是说,我需要知道计算公式。我不需要终端对当前可能性的回答。我确实知道计算公式,但重叠头寸的保证金计算有某种特殊性!!。 而且我甚至不知道什么是重叠的位置!? 我特别举了一个例子,你可以看到每一个连续的仓位都是以与前一个相反的方向开仓。如果你通过加总所有手数来计算未结头寸的保证金(并将该金额粘贴到公式中),那么当DC应用止损时,它与DC的实际反应不一致。我想按照DC的计算方式来计算

重叠的位置不等于锁定的位置吗?这 是维持两个数量相等但方向相反的未平仓头寸所需的保证金。它通常是维持一个与两个锁定头寸中的一个相同数量的敞口头寸所需保证金的一半。

我马上就注意到了,但我认为这不会使你感到困惑......。

对于同一个EA,我是这样计算保证金的,我现在不知道了,也许是错的?:

// ======================================================================
// -------------------------- Рассчёт свободной маржи -------------------
// ======================================================================
bool LastFreeMargin(string sy, int op, double lot)
{
   if (sy=="0" || sy=="") sy=Symbol();
   double FreeEqu  = AccountFreeMargin();                         // Вся маржа
   double FreeEqu4 = NormalizeDouble(Equ_Start/4.0, 2);           // Делим маржу на 4 (Средства для торговли)
   double CheckEqu = AccountFreeMarginCheck(sy, op, lot);         // Остаток всех средств после открытия позы 
   double EquTrade = FreeEqu-CheckEqu;                            // Средства, требуемые для открытия следующей
   
   if (FreeEqu4-EquTrade>0) return(true);
   else return(false);
}   

这就是DC返回给你的全部内容。

mode_margininit 29 1手的初始保证金要求
模式_marginmaintenance 30 支持每1手未平仓合约所需的保证金金额
模式_保证金对冲 31 每1手重叠头寸收取的保证金
mode_marginrequired 32 打开1手买入所需的自由资金数额
原因: