初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1282

 
Vladimir Karputov:

问题出在EA上。顺便说一下,共享主机的规则禁止dlls。

它过去工作得很好。我应该在免费主机 上试一试。总之给了methaquotes 15英镑 )))

谢谢你的答复

 

EA打开市场订单,然后修改它们,设置TP和SL。在测试器中检查。使用所需的参数对第一阶进行修改。第二单的开仓方向与第一单相同,但第一单根据第二单的参数进行修改,第二单的SL和TP仍然为零。在这种情况下,条件是:如果SL == 0和TP == 0,另一个订单被修改,因为它有非零参数。为什么?将搜索从第一个改为最后一个并没有改变什么。

还有一件事。在测试器中,利润栏显示有两个未结订单的订单,但反之亦然:第二个订单的利润显示在第一个未结订单中,反之亦然。为什么?

还有更多。我们需要在两个极点之后画一条趋势线。线条已经画好,但它是一个从酒吧到酒吧的存根。这不是一条趋势线,而只是一段,而我们希望看到的是一条线。

void PositionModifiSell()
{
   int    i;
   double sl    = 0; 
   double tp    = 0;  
   int    total = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {
               if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)
               {
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);                
                                    
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  
                  if(!m_trade.PositionModify(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кода: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
               }
            }
         }
      }
   }
}
 
Youri Lazurenko:

EA打开市场订单,然后修改它们,设置TP和SL。在测试器中检查。使用所需的参数对第一阶进行修改。第二单的开仓方向与第一单相同,但第一单根据第二单的参数进行修改,第二单的SL和TP仍然为零。在这种情况下,条件是:如果SL == 0和TP == 0,另一个订单被修改,因为它有非零参数。为什么?将搜索从第一个改为最后一个并没有改变什么。

还有一件事。在测试器中,如果有两个订单被打开,订单利润显示在利润栏中,即第二个订单的利润显示在第一个打开的订单中,反之亦然。为什么?

还有更多。我们需要在两个极点之后画一条趋势线。线条已经画好,但它是一个从酒吧到酒吧的存根。这不是一条趋势线,只是一段,而我们希望看到的是一条线。

1.不是命令,而是位置。

2.提出你的问题--到目前为止,我看到的是一种叙述,我还没有看到一个问题或 "人们希望它如何工作 "的算法。

 
Vladimir Karputov:

1.不是订货人,而是职位

2.拟定你的问题--到目前为止,我看到的是一个叙述,我还没有看到问题和算法 "你希望它如何运作"。

你知道它的位置,因为它是在mql5 中。而在代码中,有一个位置。问题是为什么第一个位置被修改,而不是最后一个位置,尽管条件中指定了这个位置。

if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)
 
Youri Lazurenko:

很明显,这些位置是存在的,因为它在mql5 中。而在代码中,它是位置。问题是,为什么第一个位置被修改,而不是最后一个,尽管条件中指定了这个位置。

问题是在哪里。描述算法 "我希望算法是这样的......"。

 
Vladimir Karputov:

问题是在哪里?描述算法 "我希望算法是这样的......"。

当趋势线被突破,并且条形图收于其上方/下方时,我们以零SL和TP开立头寸。开盘后,立即设置必要的TP和SL(位置被修改)。为什么呢,被修改的不是最后的位置,而是之前的位置,同时违反了条件。

if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)

现在清楚了吗?即使我们把开仓时间 引入条件中,也没有任何变化。职位的数量没有限制。

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Свойства позиций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

当趋势线被突破,并且条形图收于其上方/下方时,就会建立一个零SL和TP的头寸。开盘后,立即设置必要的TP和SL(位置被修改)。为什么呢,被修改的不是最后的位置,而是之前的位置,同时违反了条件。

现在清楚了吗?即使我们把开仓时间 引入条件中,也没有任何变化。职位的数量没有限制。

你确定在修改的时候,已经有一个新的职位存在了吗?(发送交易指令并不保证头寸的存在)。

当进入条件(SL == 0.0和TP == 0.0)时,打印位置票。

 
Vladimir Karputov:

你确定在修改时,新的职位已经可以使用了吗?(发送交易指令并不保证存在头寸)。

当你输入条件(SL == 0.0和TP == 0.0)时,打印仓单。

是的,第二个位置已经在那里了。我正在看日志。卖出方法是成功的,代码为10009。(3号票)。然后是修改,只修改2号票的位置,这也是成功执行的(修改,虽然我强调,根据条件不应该发生,SL不再是0了!)。

已经写过了,按开票时间 和按票数都试过了,没有成功,修改了以前的位置。比如说。

void PositionModifiSell()
{
   int      i;
   datetime Time;
   double   sl    = 0; 
   double   tp    = 0;  
   datetime time  = 0;
   int      total = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {
               Time = m_position.Time();
               
               if(Time > time)
               {
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);
                  
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  
                  if(!m_trade.PositionModify(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кода: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
                  time = Time;
               }
            }
         }
      }
   }
}
//------------ или
void PositionModifiSell()
{
   int      i;
   ulong  Ticket;
   double sl     = 0; 
   double tp     = 0;  
   ulong  ticket = 0;
   int    total  = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {
               Tiсket = m_position.Ticket();
               
               if(ticket != Ticket)
               {
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);
                  
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  
                  if(!m_trade.PositionModify(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кодa: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
                  ticket = Ticket;
               }
            }
         }
      }
   }
}
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Свойства позиций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

是的,第二个位置已经在那里了。我正在看日志。卖出方法是成功的,代码为10009。(3号票)。然后再进行修改,只有与2号票的位置,也顺利完成。

已经写过了,按开票时间 和按票数都试过了,没办法,修改了以前的位置。比如说。


也就是说:你不检查位置的结果,你甚至不想打印票据。如果是这种情况,请附上完整的代码(使用按钮附上文件 )。

 
Vladimir Karputov:

也就是说:你不检查职位的结果,你甚至不想打印票据。在这种情况下,请附加完整的代码(使用按钮附加)。

你甚至不愿意打印票据--我不明白。这里是日志摘录。

2021.02.01 12:54:55.338 2018.01.02 17:00:00 市场卖出 0.01 EURUSD (1.20384 / 1.20402)

2021.02.01 12:54:55.338 2018.01.02 17:00:00 交易#2在1.20384卖出0.01欧元兑美元完成(基于订单#2)。

2021.02.01 12:54:55.338 2018.01.02 17:00:00 交易完成 [#2在1.20384卖出0.01欧元兑美元]

2021.02.01 12:54:55.338 2018.01.02 17:00:00 执行的订单在1.20384卖出0.01 [#2在1.20384卖出0.01欧元兑美元]

2021.02.01 12:54:55.344 2018.01.02 17:00:00 CTrade::OrderSend: market sell 0.01 EURUSD [在1.20384完成]

2021.02.01 12:54:55.344 2018.01.02 17:00:00 Sell() 方法成功完成。返回代码=10009(在1.20384完成)。

2021.02.01 12:54:55.344 2018.01.02 17:00:00 仓位修改 [#2 卖出 0.01 EURUSD 1.20384 sl: 1.20813 tp: 1.20013]

2021.02.01 12:54:55.346 2018.01.02 17:00:00 CTrade::OrderSend: 修改仓位#2 EURUSD (sl: 1.20813, tp: 1.20013) [完成]

2021.02.01 12:54:55.346 2018.01.02 17:00:00 PositionModify() 方法执行成功。返回代码=10009(完成)。

============================================================================================================== разделил, появление второй позиции

2021.02.01 12:55:48.819 2018.01.03 09:00:00 市场卖出 0.01 EURUSD (1.20442 / 1.20460)

2021.02.01 12:55:48.819 2018.01.03 09:00:00 交易#3在1.20442卖出0.01欧元兑美元完成(基于订单#3)。

2021.02.01 12:55:48.819 2018.01.03 09:00:00 交易完成 [#3在1卖出0.01欧元兑美元。20442]

2021.02.01 12:55:48.819 2018.01.03 09:00:00订单执行,在1.20442卖出0.01 [#3在1.20442卖出0.01 EURUSD]

2021.02.01 12:55:48.821 2018.01.03 09:00:00 CTrade::OrderSend: market sell 0.01 EURUSD [在1.20442完成]

2021.02.01 12:55:48.821 2018.01.03 09:00:00 Sell() 方法成功执行。返回代码=10009(在1.20442完成)。

====================================================================================================================== 成功开仓后,修改,但之前的订单

2021.02.01 12:55:48.821 2018.01.03 09:00:00 仓位修改 [#2 卖出 0.01 EURUSD 1.20384 sl: 1.20663 tp: 1.20154]

2021.02.01 12:55:48.823 2018.01.03 09:00:00 CTrade::OrderSend: 修改仓位#2 EURUSD (sl: 1.20663, tp: 1.20154) [完成]

2021.02.01 12:55:48.823 2018.01.03 09:00:00 PositionModify() 方法执行成功。返回代码=10009(完成)。


我已经在Sell上发布了完整的位置修改 代码,并附有选项。

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...