[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 501

 
你能告诉我如何计算期货保证金吗?
 
Roman.:

"我想这样做是为了不在不同的f函数中得到相同的数据 在我看来,在2个或更多的f函数中计算相同的掩码是不合理的。计算一次就可以了,这比较容易。为什么要在这上面浪费额外的资源?

按照文件中的规定去做,不要重新发明轮子。

这个周期与什么有关系呢?

 for(int i=1;i<=Bars;i++)
   {
      double i_maFast1 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i);      // Вычисляем быстрые скользящие..
      double i_maFast2 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i+1);    //..средние
      double i_maSlow1 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i);      // Вычисляем медленные скользящие..
      double i_maSlow2 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i+1);    //..средние
      double stochD1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i);     // Вычисляем значения сигнальной линии..
      double stochD2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i+1);   //..стохастика
      double stochK1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i);     // Вычисляем значения главной линии..
      double stochK2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i+1);   //..стохастика
   }

自己去看看这些步骤,当你退出时,会发生什么,接下来你会怎么做? 这是无稽之谈。

像教程中那样--所有的交易信号 在这个交易标准的定义中--串联起来(你可以把它们包裹在不同的函数中,在检查这些交易标准是否起作用时与它们一起工作),然后你得到它们工作的条件。

关于周期,这是因为我将检查指标参数的交集。这里都是初级的。我读了它,它是按照我的想法写的。

一般的教科书https://book.mql4.com/ru/build/conditions,都是捆绑式的。我已经把MACD和随机指数放在一个函数中,我不需要它。

事实上,链接中的所有指标值都应该被转移到相应的函数中。为什么不呢?这是符合逻辑的。

 
TarasBY:
你所说的和你所 "画 "的--两个巨大的区别!!! :))

我已经有点糊涂了。这里有3个函数,每个函数都接收一个特定指标的特定信号。

//+---------------------------------------------------------------------------------------+
//| Проверка пересечения скользящих средних                                               |
//+---------------------------------------------------------------------------------------+
int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)
{
      if ((i_maFast2<i_maSlow2) && (i_maFast1>i_maSlow1))             // Если быстрая скользящая пересекла медленную снизу вверх..
      return(CROSSINGTOUP);                                           //.. значит, - пересечение вверх
                                                 
      if ((i_maFast2>i_maSlow2) && (i_maFast1<i_maSlow1))             // Если быстрая скользящая средняя пересекла медленную сверху вниз..
      return(CROSSINGTODOWN);                                         //..значит, - пересечение вниз
 
   return(CROSSINGWAIT);                                              // Ожидаем пересечения
}

//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Стохастика                                                       |
//+---------------------------------------------------------------------------------------+
int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)
{
      if((stochD2<stochK2) && (stochD1>stochK1))                     // Если сигнальная линия пересекла главную снизу вверх..
      return(CROSSINGTOUP);                                          //..значит, - пересечение вверх
      if((stochD2>stochK2) && (stochD1<stochK1))                     // Если сигнальная линия пересекла главную сверху вниз..
      return(CROSSINGTODOWN);                                        // ..значит, - пересечение вниз
   return(CROSSINGWAIT);                                             // Ожидаем пересечения
}

//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Моментума                                                        |
//+---------------------------------------------------------------------------------------+
void GetMomentumSignal()
{
   double momentum = iMomentum(Symbol(),i_TF,i_momPeriod,0,0);
}

这个功能接收来自所有指数的一般信号,并做出买入卖出 的决定。

//+---------------------------------------------------------------------------------------+
//| Получение общего сигнала для входа в рынок                                            |
//+---------------------------------------------------------------------------------------+
int GetSignal()
{
   for(int i=1;i<=Bars;i++)
   {
      double i_maFast1 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i);      // Вычисляем быстрые скользящие..
      double i_maFast2 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i+1);    //..средние
      double i_maSlow1 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i);      // Вычисляем медленные скользящие..
      double i_maSlow2 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i+1);    //..средние
      double stochD1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i);     // Вычисляем значения сигнальной линии..
      double stochD2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i+1);   //..стохастика
      double stochK1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i);     // Вычисляем значения главной линии..
      double stochK2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i+1);   //..стохастика
   }
      if( GetCrossingMa(i_maFast1, i_maFast2, i_maSlow1, i_maSlow2)==CROSSINGTOUP || i_maFast1>i_maSlow1 )
      return(SIGNAL_BUY);
}

这是接收一般信号的主函数;在这里,我们通过循环获得指数值,当然是要通过所有的条形图。而后将获得的值通过引用传递给需要这些值的适当的函数,也就是传递给函数。

int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)

int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)

void GetMomentumSignal() ,原则上也可以放在这里。

因此,所有指数的计算都将在一个主要功能中得到信号。这里的一切都很有逻辑性。

 

在附加到图表之后,程序立即启动init()函数。附属顾问或自定义指标 init()函数 客户终端启动和加载 (只涉及顾问,不涉及指标历史数据 后,在改变符号和/或图表周期后,在MetaEditor中重新编译程序后,在改变EA或自定义指标设置窗口中的输入参数后立即 启动。专家顾问在更换账户后也会被初始化。

你能解释一下它是如何工作的吗?在后台,或者可以以某种方式追踪到这一点?或者指标中的init函数,当我在长时间空闲后启动终端时,根本不会启动?

 
fore-x:

在附加到图表之后,程序立即启动init()函数。附属顾问或自定义指标的 init()函数 客户终端启动和加载 (只涉及顾问,不涉及指标历史数据 后,在改变符号和/或图表周期后,在MetaEditor中重新编译程序后,在改变EA或自定义指标设置窗口中的输入参数后立即 启动。专家顾问在更换账户后也会被初始化。

你能解释一下它是如何工作的吗?在后台,或者可以以某种方式追踪到这一点?或者终端开始时指示器中的init功能在长时间闲置后不会启动?

init 函数是用来存储在整个EA运行过程中不会被改变的数据。这可以是一些数据,在程序加载后只计算一次,不需要再重新计算。我是这样理解的。

如果变量的值需要重新计算,例如,每到一个新条形 的到来,那么我们就不应该在init 函数中声明这些变量,因为它们不会在那里被重新计算。

为了更容易理解,这就是可以和应该在init 中声明的内容。

   Tick = MarketInfo(Symbol(), MODE_TICKSIZE);                         // минимальный тик    
   Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point);                 // текущий спрэд
   StopLevel = ND(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point);  // текущий уровень стопов
   MinLot = MarketInfo(Symbol(), MODE_MINLOT);    // минимальный разрешенный объем сделки
   MaxLot = MarketInfo(Symbol(), MODE_MAXLOT);   // максимальный разрешенный объем сделки
   LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);          // шаг приращения объема сделки

这是从市场上收集的数据,而这些数据是不会改变的。虽然这是一个关于Spread 变量的问题......如果spread不是固定的,最好把它放在单独的函数中。

 
hoz:

init 函数用于存储在整个EA期间不会被改变的数据。

你的回答又一次偏离了主题--init()函数加载历史数据 启动(这只适用于Expert Advisors,不适用于指标)--你怎么理解(我想感受一下)?


过牌时吃卒子--我知道有这样一条规则,但我不知道如何应用它(它更清楚)?

 
我在上面回答了我的理解。我并没有真正理解你的观点。也许其他人会。
 

大家好!请帮助,我有一个蜡烛图的组合,我想让它们在不同的时间尺度上工作。举例来说

如果(iHigh("EURUSD",PERIOD_M5,1)>iLow("EURUSD",PERIOD_M5,1)+8*kio*Point)

{

go_s=true。

}

我想我可以用iHigh, iLow, iOpen等来绑定我的组合。但当在M5上测试时,它显示了一个结果,但在其他时间段却显示了另一个结果。请帮助我做错了什么。谢谢你!

 
hoz:

...

教科书https://book.mql4.com/ru/build/conditions,都是束之高阁。它把MACD和随机指数放在一个功能中,而我不需要这种方式。

而事实上,所有的指标值都应该由链接传递给相应的函数。为什么不呢?这是符合逻辑的。

因此,事实证明, 所有的指数计算都将在一个获取信号的主f函数中 进行。 这一切都很有意义。

对不起,但看起来你仍然处于食物链的最开始,那正是 "一切都符合逻辑 "的地方。:-)

让它像STUDY BOOK和DOCI一样,然后用独立的函数包裹它,在结果中得到一个交易标准。

在教程中--所有的东西都是一次性注册在结果中的,你可以注册你的f-i-tions--单独的,而结果是像教程中那样画出来的!在这里不需要通过引用来进行循环或参数值的转移。

P.S. 一般来说,首先要拆解代码公开--所有在教程中的代码和一些在kodobase中的代码--只是一切都落到实处。

 
fore-x:

在附加到图表之后,程序立即启动init()函数。附属顾问或自定义指标的 init()函数 客户终端启动和加载 (只涉及顾问,不涉及指标历史数据 后,在改变符号和/或图表周期后,在MetaEditor中重新编译程序后,在改变EA或自定义指标设置窗口中的输入参数后立即启动。专家顾问在更换账户后也会被初始化。

你能解释一下它是如何工作的吗?在后台,或者可以以某种方式追踪到这一点?或者指标中的init功能,当你在长时间闲置后启动终端时,它根本不会启动?

我不知道你想要什么。在你对init()的描述中,有一些不太正确的 "点 "用红色标出。例如,客户终端的启动伴随着历史数据的加载,突出 "加载 "一词是不正确的--它不是启动初始化的过程。

而生活中并非所有的东西都能被触及:最多是--沉思。:)))) 你想修复初始化过程,即启动init()函数--在这个函数里面打印一个通知行。