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

 

MakarFX ,这个绑定的功能是什么:它执行什么功能?


输入 int BarTrade = 5; // 我理解为这是5的跟踪期数。

int TimeBarTrade=BarTrade*Period()*60; // 我怎么理解? 为什么要乘以60?

 
Alexey Belyakov:

MakarFX ,这个绑定的功能是什么:它执行什么功能?


输入 int BarTrade = 5; // 我理解为这是5的跟踪期数。

int TimeBarTrade=BarTrade*Period()*60; //如何理解? 为什么要乘以60?

巴氏贸易*周期()*60

条数*当前时间框架*60秒

即酒吧数量转换为秒

 
MakarFX:

巴氏贸易*周期()*60

条数*当前时间框架*60秒

即转换为秒的条数

你可以这样做。

int TimeBarTrade = PeriodSeconds()*BarTrade;
 
MakarFX:

如果我们排除了与下列因素有关的错误

mode_stoplevel, mode_tradeallowed, mode_minlot, mode_lotstep, mode_maxlot

那么猫头鹰就不会打到服务器上。

Makar,非常感谢你指出需要做哪些检查,以避免困扰服务器和禁制EAJ。

像这样进行的检查

暂停的模式水平的停止

         //ПРОВЕРКА НА МОДЕ СТОП ЛЕВЕЛ- МИНИМАЛЬНЫЙ УРОВЕНЬ СТОПА 
         if(sl<MarketInfo(Symbol(),MODE_STOPLEVEL)) // ЕСЛИ СТОПОЛС МЕНЬШЕ ЧЕМ МИНИМАЛЬНО ДОПУСТИМЫЙ УРОВЕНЬ ЕГО УСТАНОВКИ ТО 
         {
          sl= MarketInfo(Symbol(),MODE_STOPLEVEL);//СТОП  ЛОССУ ПРИСВАЕВАЕМ МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ ЕГО УСТАНОВКИ
         }

修改止损位以获取利润

      // ПРОВЕРКА ТЕЙК ПРОФИТА НА МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ УСТАНОВКИ
      
  if(tp<MarketInfo(Symbol(),MODE_STOPLEVEL)) // ЕСЛИ ПРОФИТ МЕНЬШЕ ЧЕМ МИНИМАЛЬНО ДОПУСТИМЫЙ УРОВЕНЬ ЕГО УСТАНОВКИ ТО 
         {
          tp= MarketInfo(Symbol(),MODE_STOPLEVEL);// ПРОФИТУ ПРИСВАЕВАЕМ МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ ЕГО УСТАНОВКИ
         }
         


检查贸易 授权

//---- ПРОВЕРКА НА РАЗРЕШЕНИЕ ТОРГОВ ПЕРЕД ОТКРЫТИЕМ ОРДЕРОВ
   if(MarketInfo(Symbol(),MODE_TRADEALLOWED)==true)
   {// начало есл торговля разрешена
  /*
куча проверок на условия открытия и само открытие ордеров
*/
} // КОЕНЦ ПРОВЕРКИ НА РАЗРЕШЕНИЕ ТОРГОВЛИ
          
          else //ИНАЧЕ ЕСЛИ ТОРГОВЛЯ НЕ РАЗРЕШЕНА 
          
          { // НАЧАЛО ЭЛС ЕСЛИ ТОРГИ НЕ РАЗРЕШЕНЫ 
          
          Print("ТОРГИ НЕ РАЗРЕШЕНЫ- ПЫТАТЬСЯ ОТКРЫТЬ ОРДЕРА НЕ БУДЕМ");
          }  // КОЕНЦ ЭЛС ЕСЛИ ТОРГИ НЕ РАЗРЕШЕНЫ

检查最大和最小手数

首先,我在变量中得到了最大手数和最小手数的值,像这样

  double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);   // МИНИМАЛЬНЫЙ ЛОТ РАЗРЕШЁННЫЙ БРОКЕРОМ
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);     // МАКСИМАЛЬНЫЙ ЛОТ РАЗРЕШЁННЫЙ БРОКЕРОМ

然后在下面的某个地方,当我写下圣杯的时候,我检查一下

  if(lot<Min_Lot) lot=Min_Lot; //ЕСЛИ ЛОТ ПОЛУЧИЛСЯ МЕНЬШЕ ЧЕМ МИНИМАЛЬНЫЙ ЛОТ У БРОКЕРА ТО ЛОТ ПРИСВАЕМАЕМ МИНИМАЛЬНЫЙ ЛОТ У БРОКЕРА
if(lot>Max_Lot) lot=Max_Lot;  //ЕСЛИ ЛОТ ПОЛУЧИЛСЯ БОЛЬШЕ ЧЕМ МАКСИМАЛЬНЫЙ ЛОТ У БРОКЕРА ТО ОЛТ ПРИСВАЕВАЕМ МАКС ЛОТ У БРОКЕРА

这是否正确,还是我错了?

我没有检查手数的变化,因为手数是按存款的百分比计算的,这个值乘以一个点,然后归一化 - 这个检查可以省略 - 对吗,或者我还是应该这样做?如果我们还需要检查,如何写这张支票?

所有这些检查的要点是始终有正确的止损、利润和手数的数值,所以我们一般可以开始开单。如果所有这些参数都没问题,专家顾问就不会打扰服务器;我的理解是否正确?

 
DanilaMactep:

非常感谢你,Makar,告诉我应该做哪些检查以避免服务器和禁止EAJ。


//ПРОВЕРКА НА МОДЕ СТОП ЛЕВЕЛ- МИНИМАЛЬНЫЙ УРОВЕНЬ СТОПА
// ПРОВЕРКА ТЕЙК ПРОФИТА НА МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ УСТАНОВКИ

由于滑移,这里可能有一个130的误差

我想这样做

         //ПРОВЕРКА НА МОДЕ СТОП ЛЕВЕЛ- МИНИМАЛЬНЫЙ УРОВЕНЬ СТОПА 
         if(sl<MarketInfo(Symbol(),MODE_STOPLEVEL)*1.5) // ЕСЛИ СТОПОЛС МЕНЬШЕ ЧЕМ МИНИМАЛЬНО ДОПУСТИМЫЙ УРОВЕНЬ ЕГО УСТАНОВКИ ТО 
         {
          sl= MarketInfo(Symbol(),MODE_STOPLEVEL)*1.5;//СТОП  ЛОССУ ПРИСВАЕВАЕМ МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ ЕГО УСТАНОВКИ
         }
      // ПРОВЕРКА ТЕЙК ПРОФИТА НА МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ УСТАНОВКИ
      
  if(tp<MarketInfo(Symbol(),MODE_STOPLEVEL)*1.5) // ЕСЛИ ПРОФИТ МЕНЬШЕ ЧЕМ МИНИМАЛЬНО ДОПУСТИМЫЙ УРОВЕНЬ ЕГО УСТАНОВКИ ТО 
         {
          tp= MarketInfo(Symbol(),MODE_STOPLEVEL)*1.5;// ПРОФИТУ ПРИСВАЕВАЕМ МИНИМАЛЬНО ДОПУСТИМУЮ ВЕЛИЧИНУ ЕГО УСТАНОВКИ
         }
         
 

大家好,有没有人遇到过通过iHighest/iLowest 找到的图表上的悬空点的问题?

前言:我有极少的编程经验,我在用mql4写一个指标,它应该在图表上显示由if条件找到的点,并用线连接它们。从逻辑上讲,它能正确地寻找点,但画出来的时候有一个偏移,然后是2个小节,然后是3个小节。我怎样才能解决这个问题? 我也附上了带有代码的文件。


int start()
  {
   int counted_bars=IndicatorCounted(); //хранит количество посчитанных индикатором баров. Функция IndicatorCounted() возвращает количество неизмененных баров после прошлого вызова функции start().
   int n,limit;
   int val_index;
   
  if(counted_bars>0)
      counted_bars--;
   limit=Bars-counted_bars; //количество последних баров, которые нужно пересчитать.
   if(limit>barsToProcess)
      limit=barsToProcess;

   for(n=0; n<=limit; n++)
     {
      if((Close[n+1]>Open[n+1] && Open[n+2]>=Close[n+2]) || (Close[n+1]>Open[n+1] && Open[n+3]>Close[n+3]))
        {
         val_index=iLowest(NULL,0,MODE_LOW,3,n+1);
         myAZBuffer[n]=Low[val_index];
         ExtLowBuffer[n]=Low[val_index];
        }
      else
         if((Open[n+1]>Close[n+1] && Close[n+2]>=Open[n+2]) || (Close[n+1]<Open[n+1] && Close[n+3]>Open[n+3]))
          {
            val_index=iHighest(NULL,0,MODE_HIGH,3,n+1);
            myAZBuffer[n]=High[val_index];
            ExtHighBuffer[n]=High[val_index];
           }
     }
   return (0);
  }
附加的文件:
AZforum.mq4  8 kb
 
azolotta:

大家好,有没有人遇到过通过iHighest/iLowest找到的图表上的悬空点的问题?

前言:我有极少的编程经验,我在用mql4写一个指标,它应该在图表上显示由if条件找到的点,并用线连接它们。从逻辑上讲,它能正确地寻找点,但画出的点有偏移,然后是2条,然后是3条。我也附上了带有代码的文件。


点的绘制是正确的,没有偏移。

如果条件得到满足,并且iHighest/iLowest 大于或小于当前的High/Low。

它吸引了


 
MakarFX:

正确绘制点,没有偏移

如果满足条件,并且iHighest/iLowest大于或小于当前的High/Low。

然后画出


所以,我想我开始意识到我的错误了)所以,为了直观地将这些点显示在正确的位置,我需要为myAZBuffer[n]、ExtLowBuffer[n]、ExtHighBuffer[n]输入一些单独的计数器而不是n? 但如何做到这一点?
 
azolotta:
所以,我想我开始意识到我的错误了)事实证明,为了直观地将这些点显示在正确的位置,我需要为myAZBuffer[n]、ExtLowBuffer[n]、ExtHighBuffer[n]输入一些单独的计数器而不是n? 但如何做到这一点呢?

不,你的理解是正确的。

该条件使用历史上的两个或三个小节。

这就是为什么当条件得到满足时,它在2-3个小节后画出。

 
MakarFX:

不,你的理解是正确的。

该条件使用历史上的两个或三个小节。

这就是为什么当条件得到满足时,它在2-3个小节后画出。

好的,那么我如何重写代码,例如,我需要从过去3个柱子中选择最高点(满足if中的条件)并在其上放置一个点(就在这个高点上!),然后也找到低点。
原因: