[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 309

 
Zhunko非常感谢你。 一切都会以回旋镖的方式回来,好的也是如此。
 
artmedia70:
正是如此。全局变量Reason得到了一个值,但它不是在deinit()中得到的,而是在init()中得到的,这样在运行init()时,你就可以看到上次去初始化的原因,并根据这个值执行某种操作。但它并没有发挥应有的作用。

你已经被告知如何做了。在deinit()中,我们找出最后一次去初始化的原因,并通过一个全局声明的变量来传递。 在init()中,你检查变量的值,并找出最后一次去初始化的原因。它的作用!!!。

PS 显然不是每个人都意识到init()/deinit()不会改变全局声明的变量的值,除非在函数的语句中明确说明。

实际上,最好不要在init()中关闭订单。在那里,MarketInfo()常常不能像预期那样工作。

int    DeinitReason = 0; // определяем переменную на глобальном уровне
...
int init ()
{
...
      if ( DeinitReason == 3) // если смена таймфрейма
...
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   Print("DeinitReason ",DeinitReason);
//----
   return(0);
  }
 
Mislaid:
你已经被告知如何做了。在deinit()中,我们找出最后一次去初始化的原因,并通过全局声明的变量来传递。 在init()中,你检查变量的值并找出最后一次去初始化的原因。它的作用!!!。
意识到Artyom有一个问题,特别是在从TF M5转换时。那里有一个错误。我们应该检查是否是这样。也许是MT4的一个错误。
 
Zhunko:
这表明你会用这个功能做什么。像这样的功能通常是通过历史来运行的。

我甚至无法想象在一个循环中运行这个函数...
 
hoz:

我无法想象,这个函数会循环运行......

不客气。
for(i=OrdersTotal()-1;i>=0;i--){
    Print(GetOrderInfo(i,OrderMagic,.....));// вызов пользовательской функции 
}

for(i=0;i<OrdersTotal();i++){/// вызов функции "ордерс тотал" на каждой итерации

}
 
Zhunko:
我意识到,Artem在从M5 TF转换时有一个问题。那里有一个错误。我想检查一下是否是这样。也许这是MT4的一个错误。

不,这不是一个错误。这里是EA。将时间框架从M1改为H1

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int    DeinitReason = 0; // определяем переменную на глобальном уровне
int init ()
{
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   Print("DeinitReason ",DeinitReason);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+ 
19:20:02 111 CADJPY,M15: 已初始化
19:20:09 111 CADJPY,M15: DeinitReason 3
19:20:09 111 CADJPY,M15: 取消初始化
19:20:09 111 CADJPY,M15: uninit reason 3
19:20:09 Supertrend[1] CADJPY,M15: 脱离初始化状态
19:20:09 Supertrend[1] CADJPY,M15: uninit reason 3
19:20:09 HLC CADJPY,M15: 取消初始化
19:20:09 HLC CADJPY,M15: uninit reason 3
19:20:09 AMA optimized1 CADJPY,M15: 去初始化了
19:20:09 AMA optimized1 CADJPY,M15: uninit reason 3
19:20:09 AMA optimized1 CADJPY,M15: 去初始化了
19:20:09 AMA optimized1 CADJPY,M15: uninit reason 3
19:20:09 Supertrend[1] CADJPY,H1:初始化
19:20:09 HLC CADJPY,H1: 已初始化
19:20:09 AMA optimized1 CADJPY,H1: 已初始化
19:20:09 AMA optimized1 CADJPY,H1: 已初始化
19:20:09 111 CADJPY,H1:初始化
 
Mislaid:

不,这不是一个错误。这里是EA。将时间框架从M1改为H1

这很好!我也有很多关于去初始化的理由

错落有致:

实际上,最好不要在init()中关闭订单。在那里MarketInfo()常常不能像预期的那样工作。

是的,你不能。它写在帮助中。

hoz:

我甚至无法想象这个函数会在循环中运行...
这是个惯例。
 
Zhunko:

这很好!因为我也有很多与去初始化的原因相联系的东西。

是的,你不能。它写在帮助中。这是一个常见的事情。

下面是要检查的最后一个变体。前面的方法不是很成功,因为init()/deinit()有时不能和print()交朋友。

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int    DeinitReason = 0; // определяем переменную на глобальном уровне
bool firststart = true;
int init ()
{
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   firststart = true;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if ( firststart )
  {
      Print( "DeinitReason ", DeinitReason, " ", Period( ) );
      firststart = false;
  }
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

我想知道如何写一个函数。这个想法是,当N个蜡烛 向某个方向滚动时,它应该计算出蜡烛的数量。BUT。为此,有几个条件,或者更准确地说,将是一个随着时间推移的清单。

比方说,趋势是向下的,......回调就会上涨。我想,如果有5个烛台上升,而且每个烛台都是看涨的,并且,例如,每个烛台的大小都大于i_sizeOfCurrBar,以及其他一些条件,那么就输出连续看涨的烛台数量,并从函数中返回一些结果。

什么是最好的写作方法?目前我已经开始写了,我明白我应该通过一个循环按条数运行,而且我应该以某种方式限制历史深度的视图,不是按固定的条数,而是按条数,用那些参数,我们对条件感兴趣。

这是我所拥有的,得到了。

int LastCandlesType()
{
   bool up,    // Свеча направлена вверх
        dn;    // Свеча направлена вниз
   int cnt;    // Счётчик идущих друг за другом бычьих свечей
   
   for (int i=Bars-1; i>=Bars-6; i--)
   {
      if ((Close[i] - Open[i]) <= i_sizeOfCurrBar * Point)    // Пропускаем все бары, размера меньше заданного внешним параметром.
          continue;
      
      if (Close[i] > Open[i])                               // 
          up = true;

      cnt++;
   }
   if (cnt == 5)
       return (BULL_CANDLES);
}

目前,我们只是从倒数第二条杠到指数为6的杠,即连续5条杠。但我希望我的专家顾问只搜索看涨的条形图,而不是连续搜索所有的条形图。如何充分地实施它?

我已经按照尺寸进行了正确的过滤。

而当一切都已经写好后,计数器将计算出带有nht,etvsvb参数的连续条数,如果有足够的此类条数,将返回函数的一些值。

 
Mislaid:

你已经被告知如何做了。在deinit()中,我们找出最后一次去初始化的原因,并通过全局声明的变量来传递。 在init()中,你检查变量的值并找出最后一次去初始化的原因。它的作用!!!。

PS 显然不是每个人都意识到init()/deinit()不会改变全局声明的变量的值,除非在函数的语句中明确说明。

实际上,最好不要在init()中关闭订单。在那里MarketInfo()常常不能像预期的那样工作。

你在哪里看到我在init()中关闭头寸?我问了一个关于删除请求的问题,但我在哪里删除它们--我没有说,更没有问。你为什么这样认为呢?