来自一个 "傻瓜 "的问题 - 页 51

 

非常感谢papaklass,它起作用了,现在我将尝试理解其中的区别。

 

为什么专家顾问会挂在这段代码上。

if(Orders_Total!=0)
  {
   for(i=Orders_Total;i>=0;i--)
     {
      Alert(Orders_Total);
      if(Symbol()==PositionGetSymbol(i))
        {
         OpenPrice=PositionGetDouble(POSITION_PRICE_OPEN);
         OrderLot = PositionGetDouble(POSITION_VOLUME);
         StopLoss = PositionGetDouble(POSITION_SL);
         TakeProfit=PositionGetDouble(POSITION_TP);
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
           {
            for(i=0;i<12;i++)
              {
               if(Price[i].low<lowest)
                 {
                  lowest=Price[i].low;
                 }
              }
            Alert(lowest);
            SL=NormalizeDouble(lowest-spread-_Point,_Digits);
            if(StopLoss<SL)
              {
               request.action=TRADE_ACTION_SLTP;
               request.symbol=_Symbol;
               request.volume= OrderLot;
               request.sl=SL;
               request.tp=TakeProfit;
               request.type=ORDER_TYPE_BUY;
               OrderSend(request,result);
              }
           }
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
           {
            for(i=0;i<12;i++)
              {
               if(Price[i].high>highest)
                 {
                  highest=Price[i].high;
                 }
              }
            Alert(highest);
            SL=NormalizeDouble(highest+spread+_Point,_Digits);
            if(StopLoss>SL)
              {
               request.action=TRADE_ACTION_SLTP;
               request.symbol=_Symbol;
               request.volume= OrderLot;
               request.sl=SL;
               request.tp=TakeProfit;
               request.type=ORDER_TYPE_SELL;
               OrderSend(request,result);
              }
           }
        }
     }
  }

我插入了Orders_Total=2的警报,最低和最高值也给出了足够的值,但是专家在这个循环中挂起,给出了无限多的警报,没有给出其他错误(关于订单修改)。

请帮助一个新手了解 :)

 

对于一个外循环和两个内循环,同一个循环变量i,随着外循环的每一次新的迭代而变成12

 
stringo:

对于一个外循环和两个内循环,同一个循环变量i,随着外循环的每一次新的迭代而变成12

谢谢你!!!。
 

你能修改代码吗?我需要的是当前栏的开盘价 。预先感谢你

double Open[], val4;
ArraySetAsSeries(Open,true);
CopyOpen(Symbol_, PERIOD_M15,1,0,Open);
val4 = (Open[ArrayMinimum(Open,0,1)] );

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы - Документация по MQL5
 
abeiks:

你能修改代码吗?我需要的是当前栏的开盘价 。预先感谢你

"Symbol_"是错误的参数,下划线应该在前面。

而复制的项目数量为0。

 

如果我通过 iCustom 将一个外部指标连接到EA,我不能动态地改变输入参数。 iMA 是可以的,它可以使用固定的值,两个可互换的字符串,我把它放在OnTick(),MA周期被重新计算。

ma_handle = iCustom(_Symbol,0,"Examples\\JJMA.ex5",MA,4);
   
ma_handle = iMA(_Symbol,0, MA,0, MODE_EMA, PRICE_CLOSE); 

如果是这样,在外部的不能改变,那么为什么我需要在我的EA中嵌入代码?

对不起,它是有效的,只是需要更长的时间。

 
Karlson:

如果我通过 iCustom 将一个外部指标连接到我的EA,我不能动态地改变输入参数。 iMA 是可以的,它可以使用固定的值,两个可互换的字符串,我把它放在OnTick(),MA周期被重新计算。

如果是这样,在EA中不能改变什么,那么我们如何在EA中嵌入代码?

"......我不能动态地改变指标的 输入参数"?

指标的输入参数 复制为专家顾问的输入参数。而且,最好是在专家顾问初始化时获得一次手柄,而不是在每个新的tick上。

 
Yedelkin:

"......不能动态地改变指标 的输入参数"?

指标的输入参数 复制为专家顾问的输入参数。而且,在初始化专家顾问时获得一次手柄,比在每个新的刻度上获得手柄要好。

在EA的工作过程中,平均线的周期与ATR不同,所以平均线的句柄被放在OnTick()中。 事实上,EA的输入参数是ATR的周期,它没有变化。

int OnInit()
  {
  atr_handle = iATR(_Symbol,0, ATR);  //инициализируем хэндл ATR
  }

void OnTick()
  {
     CopyBuffer(atr_handle,0,0,5,atr);   //заполняем массив ATR
     ArraySetAsSeries(atr,true);

     MA=(int)(atr[1]*kMA);                 //рассчитываем период требуемый для средней от ATR

   //ma_handle = iCustom(_Symbol,0,"Examples\\JJMA.ex5",MA,4);  // получаем хэндл средней
   
     ma_handle = iMA(_Symbol,0, MA,0, MODE_EMA, PRICE_CLOSE);

     CopyBuffer(ma_handle,0,0,5,ma);     //заполняем массив средней
     ArraySetAsSeries(ma,true); 
  }
 
Karlson:

我有一个在EA运行时从ATR变化的平均周期,所以平均线的句柄被放在OnTick()中。事实上,EA的输入参数 是ATR周期。它没有改变。ATR在OnInit()中。

我已经大致理解了。但很难在每次新的刻度线上获得指标柄。那你怎么处理以前的手柄呢?