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

 
Denis Diakonov:

而不是,例如,先传案例1,再传案例2,等等。

这些案例执行了一个开盘指令

该订单在一个以上的地方打开。你必须完全按照你在这个代码中的思维方式来思考,这很难。

 
如果EA的OnTick里面有一个循环,需要相当长的时间,它是否会完全执行,还是新的tick的到来会打断这一切?
 
Alexey Viktorov:

有不止一个开口。在这样的代码中,你必须准确地思考你的想法,而这很难。

      case 2 : // кейс для открытия Sell по AUD/USD
               if(TimeServer() == true)                                     
               {
                  if(Symbol() == AUDUSD)
                  {
                  RefreshRates();
                  Open_Order = OrderSend("AUDUSD",OP_SELL,lot,Bid,0,0,0); 
                  Alert("Тикет открытого ордера ", Open_Order, GetLastError());
//-------------------------------------------------------------------------------------------------------------
// другая функция
//-------------------------------------------------------------------------------------------------------------

int AUDUSD_Analizing()
{    
   if(AUDUSD_Prices_new > AUDUSD_Prices_old)
   {
      s1 = AUDUSD_Prices1;
      s2 = AUDUSD_Prices2;
      s3 = s1 - s2;    
      if(raznica > s5)
      {
         Alert("--- ВРЕМЯ ОТКРЫВАТЬ ОРДЕР НА ПОКУПКУ ---");
вот в этом месте мне необходимо обратиться к case 2 - вызвать его запуск на исполнение, затем
отсюда же необходимо обратиться к case 5 (к примеру), case 9, case 16 и т.д.

и только потом завершить исполнение данной функции и вернуться в старт
 
Yevhenii Levchenko:
如果在EA的OnTick里面有一个循环,需要相当长的时间,它是否会被完全执行,还是新的tick的到来会打断所有这些?

我也不明白,在我的例子中,循环被打开了,但不是所有的订单都被打开了,有些被打开了两次,有些被跳过了,我明白,一个新的tick触发了开始,代码暂停执行并重新开始工作。

 
Denis Diakonov:

我知道,一个新的刻度线同时触发了一个开始,代码暂停执行并重新开始执行。

不要编造这个。

阅读帮助,那里清楚地写着,如果在EA中有复杂的计算,新的tick将被跳过。

在关于事件处理功能 的文章中的某个地方,或者在交易操作中,或者在RefreshRates中。

在你的代码中寻找逻辑错误


HH: switch() - case不用于复杂的逻辑条件,更好的组合if() else - 所以你会得到更明确的逻辑分支

 
Igor Makanu:

不要编造它。

阅读帮助,它清楚地指出,如果在EA中存在复杂的计算,新的刻度将被跳过。

在关于事件处理功能 的文章中的某个地方,或者在交易操作中,或者在RefreshRates中。

在你的代码中寻找逻辑错误


SZY: switch() - case不用于复杂的逻辑条件,更好的组合if() else - 所以得到更明确的逻辑分支

是的,谢谢,我已经决定用if-else来写所有的东西。

 
Denis Diakonov:

你为什么要在这里添加开关?把交易的方向 和所需的开口数量输入函数,并在循环中按指定的数量开口,这样做比较容易。

这就是为什么我说,理解你的逻辑超出了我的想象。为什么如此混乱?

 
Alexey Viktorov:

你为什么要在这里添加开关?把交易的方向 和所需的开口数量输入函数,并在循环中按指定的数量开口,这样做比较容易。

这就是为什么我说,理解你的逻辑超出了我的想象。为什么如此混乱?

好吧,我的代码刚刚增加了尺寸,我想这将会更容易。

实际上,如果我们有机会在一个函数的执行过程中随意调用case,会更简单、更紧凑。

我不需要在一个循环中打开类似的交易,在发生信号时,它们会同时为不同的符号打开(尽可能地)。

案例1 - Audusd购买

案例5 - 英镑兑美元买入

案例9 - 买入欧元区

等。

在第一种情况下,我有一张表是案例,第二张表是分析,如果它们相互作用,就会有500行。

第二种变体意味着在有分析的函数中规定一个特定的顺序开放,总行数将达到1200行以上,这将最终影响程序的执行速度。

 

你能帮助我吗,请!?专家顾问使用动态计算偏差的包络指标。但当它显示在图表上时,它显示了所有以前的条形图上的指标偏差的动态。

动态包络

1.有什么方法可以使指标正确地绘制吗?也就是说,它将只在自己的条形图上画出带有偏差的指标。

2.如何在专家顾问中禁止绘制指标,只留下其计算结果?我想在专家设置中启用或禁用指标的绘制 )

 
Denis Diakonov:

好吧,最后我的代码只是增大了尺寸,而我以为会更简单。

总之,如果在一个函数的执行过程中可以随意调用case,那会更容易,代码也会更紧凑。

我不需要在一个循环中打开类似的交易,在发生信号时,它们会同时为不同的符号打开(尽可能地)。

案例1 - Audusd购买

案例5 - 英镑兑美元买入

案例9 - 买入欧元区

等。

在第一种情况下,我有一张表是案例,第二张表是分析,如果它们相互作用,就会有500行。

第二种变体意味着在函数中规定了一个特定的分析顺序,这将被拉伸成一个尿布,总行数将达到1200行以上,这将最终影响程序的执行速度。

你用什么打入这么多行的代码?这是我最后的一个EA,它与FORTS上的一组证券一起工作。

sinput  string            Symbols           = "GAZP,LKOH,CHMF,MVID";  //  Символы для торговли через запятую

有多少证券将被上市,就有多少证券将被交易。而这个EA控制了两个交易时间段,带有追踪功能,当然还有分析功能,只有326行。

如果你想使用开关,你不必在每个变体中添加位置开口。只需指定符号名称、交易操作的类型

string symb;
ENUM_ORDER_TYPE ordType;
switch(???)
{
 case 1
  symb = "audusd";
  ordType = OP_BUY;
 break;
 case 5
  symb = "gbpusd";
  ordType = OP_BUY;
 break;
 case 9
  symb = "eurusd";
  ordType = OP_BUY;
 break;
}
// И дальше получение цен, определение СЛ и ТП с последующем открытием ордера.

但在我看来,最好是将其全部包裹在一个用户定义的函数中。

void openOrder(string symb, ENUM_ORDER_TYPE ordType)
 {
  // Символ и тип ордера передаётся при вызове функции. Здесь достаточно получить соответствующие цены и открыть ордер.
 }
原因: