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

 

我开始为开仓和修改订单的函数写一个封装器(我认为它可以解决我在这些操作符的返回值 方面的问题),但还是有同样的问题。

解释一下问题所在(无论我怎么写,从OrderSend、OrderSelex和ModifyOrder返回的值总是有问题)。

包裹代码.

int start()

{

如果(信号==1)

{

OrderSendX(Symbol(),OP_BUY,0.1,Ask,0,500,500,"123",123,0,Red);

}

return(0);

}

//-----------------------------------------------

int OrderSendX (string symbol,int cmd, double volume,double price,int slippage,double stoploss,double takeprofit,string comment,

int magic,datetime expiration,color arrow_color)

{

int err=GetLastError()。

err = 0。

bool exit_loop = false。

int ticket = -1;

int Retry = 10;

int cnt = 0。

如果(cmd == OP_BUY || cmd == OP_SELL) //检查要开的订单类型。

{

while(!exit_loop)

{

ticket = OrderSend(symbol,cmd,volume,price,slipage,stoploss,takeprofit,comment,magic,expiration,arrow_color);

err = GetLastError()。

switch(err)

{

case ERR_NO_ERROR:

exit_loop = true。

突破。

{ case ERR_SERVER_BUSY:

case ERR_NO_CONNECTION:

case ERR_INVALID_PRICE:

case ERR_BROKER_BUSY:

case ERR_TRADE_CONTEXT_BUSY:

cnt++。

突破。

case ERR_PRICE_CHANGED:

case ERR_OFF_QUOTES:

case ERR_REQUOTE:

RefreshRates()。

继续。

默认情况下。

exit_loop = true。

突破。

}

如果(cnt>Retry)

exit_loop = true。

if(!exit_loop)

{

睡眠(1000)。

RefreshRates()。

}

否则

{

如果(err !=ERR_NO_ERROR)

{

Print("Error : " + err);

}

}

如果(err ==ERR_NO_ERROR)

{

OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)。

return(ticket)。

}

Print("Error opening order after" + cnt + "attempts");

返回(-1)。

}

}

}

 
Leanid Aladzyeu:

我开始为开仓和修改订单的函数写一个封装器(我认为它可以解决我在这些操作符的返回值 方面的问题),但还是有同样的问题。

向我解释一下问题所在(无论我写了什么,我在从OrderSend、OrderSelex和ModifyOrder返回值时总是有问题)。

https://docs.mql4.com/ru/trading/ordermodify

bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
            if(!res)
               Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
            else
               Print("Цена Stop Loss ордера успешно модифицирована.");

OrderModify()返回yes , no

OrderModify - Документация на MQL4
  • docs.mql4.com
OrderModify - Документация на MQL4
 

没有人可以解释。

让我们尝试另一个例子,而不是把帮助复制100次给我。

我将用一个例子来理解改正。

{

SL=NormalizeDouble(Bid-TrailingStop*Point,Digits)。

如果(OrderStopLoss()!=SL)

OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0)。

}

请勿插入

""票据""=OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0); 每次都正确吗?

 

并感谢每一位试图解释的人。

不幸的是,我不明白如何将一个变量指定给一个预定义为函数的变量。

 
Leanid Aladzyeu:

并感谢每一位试图解释的人。

不幸的是,我不明白如何将一个变量指定给一个预定义为函数的变量。

亲爱的Leanid。 学会阅读帮助,并与错误和警告一起工作。如果你不学习如何做,你甚至不会正确编程。这些是基本的。你有没有试着翻译警告中写的内容?你理解 "需要检查 "的功能的含义吗?帮助描述了一个处理这些功能的正确例子。例如,OrderModify()。看一下帮助。

返回值

如果函数成功完成,它将返回 "true",如果出现错误,则返回 "false"。要获得错误信息,你需要调用GetLastError()函数

然后跟随一个例子。

bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
if(!res)
   Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
   Print("Цена Stop Loss ордера успешно модифицирована.");

正如你所看到的,函数的返回值是在if-else操作符中处理的。需要res变量的原因是 "为了美"。它是执行交易功能 的结果! 你的钱所依赖的功能!相应地,为了正确处理所有可能的变体(本例中的处理没有提供),我们需要res变量和GetLastError()函数返回的错误代码。开发人员特意加入了警告,以提醒人们不要忘记有 "重要 "的函数要注意处理值!还要注意,如果没有检查值,就不会有错误!如果没有检查值,就不会有错误。也就是说,在这种情况下,该功能将照常工作,但如果发生异常情况,将不被处理。非标准情况的列表是GetLastError()函数的返回代码。

我希望这样会更清楚。

Коды возврата торгового сервера - Документация на MQL4
  • docs.mql4.com
Коды возврата торгового сервера - Документация на MQL4
 
Leanid Aladzyeu:

开始为订单打开和修改函数写一个包装器(以为这样可以解决我从这些运算符返回数值 的问题),但还是有同样的问题。

而且在这种情况下,你不需要写一个包装器。它不会解决关于检查返回值的警告问题!请看这些函数的例子,并做同样的事情!
 
Tapochun:
而在这种情况下,我们不需要写一个包装器。它不会解决关于检查返回值的警告问题!请看一下这些函数的例子,并做同样的事情吧!

正如参考文献中指出的那样,给出了一个错误。

我这样写的,很好

如果(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))

{

Print("Modification was successful.");

}

else Print("修改 订单错误。")。

 
在帖子中正确插入代码:在论坛中正确插入代码
 
Karputov Vladimir:
在帖子中正确插入代码:在论坛中正确插入代码
在这里,你去...
 
Leanid Aladzyeu:

为什么 "拖网 "对销售不起作用? 它对购买起作用!?

没有错误或警告,在基因编译中。

以下是代码。

void Trailing()
  {
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
                     if(OrderStopLoss()!=SL)
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))
                          {
                           Print("Модификация прошла успешно.");
                          }
                     else Print("Ошибка модификации ордера.");
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()-Ask>TrailingStop*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
                     if(OrderStopLoss()!=SL)
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))
                          {
                           Print("Модификация прошла успешно.");
                          }
                     else Print("Ошибка модификации ордера.");
                    }
                 }
              }
           }
        }
     }
  }