Perguntas de um "boneco" - página 51

 

Muito obrigado Papaklass, funcionou, agora vou tentar compreender a diferença.

 

Porque é que o Expert Advisor se pendura neste pedaço de código:

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);
              }
           }
        }
     }
  }

Inseri alertas Ordens_Total=2 mais baixo e mais alto também dão valores adequados, no entanto, o perito pendura neste laço, dando um número infinito de alertas, não são dados outros erros (relativos à modificação de ordens).

Por favor, ajude um novato a compreender :)

 

Para um ciclo externo e dois ciclos internos, a mesma variável de ciclo i, que se torna 12 com cada nova iteração do ciclo externo

 
stringo:

Para um ciclo externo e dois ciclos internos, a mesma variável de ciclo i, que se torna 12 com cada nova iteração do ciclo externo

Obrigado!!!
 

Pode corrigir o código? Preciso do preço de abertura do bar actual. Obrigado de antemão.

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:

Pode corrigir o código? Preciso do preço de abertura do bar actual. Obrigado de antemão.

O "Símbolo_ " é o parâmetro errado, o sublinhado deve estar na frente

E o número de itens copiados é 0.

 

Se eu ligar um indicador externo a um EA através de iCustom, não posso alterar dinamicamente os parâmetros de entrada. iMA está ok, funciona com valores fixos, duas cordas intercambiáveis, coloco-o em OnTick(), o período MA é recalculado.

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

Se for este o caso, o que não pode ser alterado nas externas, então porque é que preciso de inserir o código na minha EA?

Desculpe, funciona, apenas demora muito mais tempo.

 
Karlson:

Se eu ligar um indicador externo à minha EA através do iCustom, não posso alterar dinamicamente os parâmetros de entrada. O iMA está ok, funciona com valores fixos, duas cadeias intercambiáveis, coloco-o em OnTick(), o período MA é recalculado.

Se for este o caso, o que não pode ser alterado na EA, então como podemos incorporar o código na EA?

"...não posso alterar dinamicamente os parâmetros de entrada" do indicador?

Reproduzir os parâmetros de entrada do indicador como parâmetros de entrada do Expert Advisor. E é melhor ter o cabo uma vez na inicialização do Expert Advisor do que em cada novo tick.

 
Yedelkin:

"...não pode alterar dinamicamente os parâmetros de entrada" do indicador?

Reproduzir os parâmetros de entrada do indicador como parâmetros de entrada do Expert Advisor. E é melhor obter a pega uma vez ao iniciar o Expert Advisor do que em cada novo tick.

Eu tenho um período da média varia de ATR durante o trabalho da EA, por isso o cabo da média é colocado em OnTick() . De facto, o parâmetro de entrada para a EA é o período da ATR, não muda.

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:

Tenho um período médio que muda de ATR enquanto a EA está a decorrer, por isso o cabo da média é colocado em OnTick(). De facto o parâmetro de entrada para a EA é o período ATR. Não muda.ATR em OnInit().

Compreendi-o aproximadamente. Mas é difícil obter o manípulo indicador de cada vez com um novo tick. E o que se faz com a pega anterior?