新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1257

 
为什么在ObjectCreate 中,时间和价格点2到30是可用的?尝试添加到图表中,只有第一个点被显示
ObjectCreate(0,"name",OBJ_ARROW_LEFT_PRICE,0,TimeCurrent()-600,1.29400,TimeCurrent()-1200,1.29500);   
 
Valerius:

你不需要在OnInit中写这段代码,而是在OnTick()中。

我试过了,根本不起作用。
1个警告
 
Igor Makanu:

不,你不能。

我无法解释.... 模板是如何工作的是这样的--在你调用这样一个函数之前,编译器对它的存在一无所知(通常,如果没有调用,甚至不会出现编译器错误)。

然后,你调用这样一个模板函数,编译器就会填入所需的类型,然后才检查一切是否正常。

然后你再调用不同类型的参数的模板--编译器会创建一个新的函数,也就是多一个,也就是说,就像你写了两个函数,做同样的事情,但参数类型不同。


呜呼,这就是它的工作原理 ))))



UPD。

你可以,但如果模板中的类型匹配,这里有一个例子,它可以正常工作。

谢谢,比文档中更清楚)原来在模板中预先 定义的变量不允许不指定它们。我需要它来打印成一个文件。日志没有给我分割记录的选项。我希望有5本日志)。因此,模板给出了一个选项,不把变量的类型带到所需的类型,它可以在模板函数内完成,但变量的数量必须全部指定。一个带有所需类型的预定义变量的简单函数提供了一个在调用时指定较少变量的机会,但变量的类型必须被带到正确的位置。当然,这可以在通话时进行,但记录会太长。

 
Valerius:

大家下午好!

我做了一个函数来修改止损。但当它工作时,却出现了EURUSD,H1: OrderModify错误130。

而且价格离应该设置止损的地方很远。

这里有一个函数。


....
    err=OrderModify(OrderTicket(), OrderOpenPrice(),New_Stop( NormalizeDouble(OrderOpenPrice()+spred*point, 
digits)), OrderProfit(), 0, clrNONE);// Цена открытия плюс спред может быть в зоне заморозки.
.....
.....
double New_Stop(double Parametr) // Проверка стоп-прик.
  {
   double Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if(Parametr<Min_Dist) // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      Alert("Increased the distance of a stop order or the opening price of pending orders.");
     }
   return(Parametr);                            // Возврат значения
  }
 
Valerius:

这样试试吧。


谢谢你,它成功了!

但还有两个细微差别。

1.什么条件下可以添加不平仓的订单,在本周周五开仓的订单,和在前几周的周五,分别被平仓?

2.如何纠正代码 - OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE) 。

移除" 由于类型转换可能 导致的数据丢失"的警告?似乎是关于"...MarketInfo(nameSym,MODE_DIGITS)..."。

 
晚上好。选择最近关闭的订单的代码应该是什么样子?是否像这样:"OrderSelect(OrdersHistoryTotal, SELECT_BY_POS, MODE_HISTORY"?
 
GetAmountLotFromOpenPos函数返回-1717986918如何解决?
 

请告知。

在测试器中,GetAmountLotFromOpenPos手数相加函数的返回值为-1717986918。

 
Valeriy Yastremskiy:

我找到了原因。我应该把OrderTakeProfit()放在OrderModify中,而不是OrderProft()。我已经看了一下。

无论如何,感谢你的帮助。

 
Yerkin Sagandykov:

谢谢你,它成功了!

但还有两个细微差别。

1、在本周周五开仓的订单,和前几周周五开仓的订单,分别添加什么条件不关闭?

2.如何纠正代码 - OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE) 。

移除" 由于类型转换可能 导致的数据丢失"的警告?它必须是关于"...MarketInfo(nameSym,MODE_DIGITS)..."。

对于第一个问题,你需要制作这个函数。


for(int is=OrdersTotal()-1; is>=0; is--)
{
如果(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))
{//关闭已在非本周的周五开出的订单。在这种情况下,我们不会在本周的周五关闭订单。
if(OrderMagicNumber()==Magic &&TimeDayOfWeek(TimeCurrent())==5 &&TimeDayOfWeek(OrderOpenTime())==5 &&TimeDayOfYear(OrderOpenTime())<TimeDayOfYear(TimeCurrent() )
{
如果(OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID), MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE)。
如果(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK), MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE)
if(!result) {error=GetLastError(); Print("LastError = ",error, ",Symbol()); }
else {error=0;}
否则
{Print("NoMagic",OrderMagicNumber();} // for Debug
否则

{Print("Error when order select", GetLastError();}。


对于第二个问题,应该有以下条目。

OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(MarketInfo(nameSym,MODE_ASK)), 3, clrNONE)。

好运。

原因: