Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1148

 
Por que as citações são de 5 dígitos, mas o indicador dá valores de 4 dígitos? Não há arredondamento nem nada
 
Roman Sharanov:
Por que as citações são de 5 dígitos, mas o indicador dá valores de 4 dígitos? Não há arredondamento nem nada
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
 
Artyom Trishkin:

obrigado

 

Por que a função ...

PositionsTotal()

... ...às vezes retorna 0 quando há realmente uma posição aberta? MQL5


A lógica de seu funcionamento depende disso

if(trade_p && PositionsTotal() == 0 && trade_o && OrdersTotal() > 0)
     {
      if(Order_Close()) ExpertRemove();
     }

... aqui está a prova


 
Boa tarde, você poderia me dizer como desativar a rolagem automática de gráficos no andróide? ( Meta Treder 4)
 
Olá.

Estou passando por um momento difícil. Não posso definir na lógica do indicador a regra Bolingeer Bunds para traçar linhas a partir do fechamento do dia anterior.

A função iClose("USDCHF",PERÍODO_D1,0) parece ser adequada, mas não totalmente. Ao recalcular o ciclo na tabela horária, tudo se quebra imediatamente.

//+------------------------------------------------------------------+
//|                                                       Клюква.mq4 |
//|                                              Алексей Корольков . |
//|                            https://www.mql5.com/ru/users/alekkar |
//+------------------------------------------------------------------+
#property copyright   "2020 Алексей Корольков ."
#property link        "https://www.mql5.com/ru/users/alekkar"
#property description "Клюква"
#property strict

#include <MovingAverages.mqh>

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 LightSeaGreen
#property indicator_color2 LightSeaGreen
#property indicator_color3 LightSeaGreen
//--- indicator parameters
input int    InpBandsPeriod=20;      // Bands Period
input int    InpBandsShift=0;        // Bands Shift
input double InpBandsDeviations=2.0; // Bands Deviations
input string SimbolUSD="USDIDX..";
//--- buffers
double ExtMovingBuffer[];
double ExtUpperBuffer[];
double ExtLowerBuffer[];
double ExtStdDevBuffer[];
double Drv,DrvIn,min,max,minIn,maxIn,xx,xIn,natr,natrIn,ma1,ma2,bid1,bid2,R1,R2,R01,R02;
int tm,mn;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- 1 additional buffer used for counting.
   IndicatorBuffers(4);
   IndicatorDigits(Digits);
//--- middle line
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMovingBuffer);
   SetIndexShift(0,InpBandsShift);
   SetIndexLabel(0,"Bands SMA");
//--- upper band
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtUpperBuffer);
   SetIndexShift(1,InpBandsShift);
   SetIndexLabel(1,"Bands Upper");
//--- lower band
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtLowerBuffer);
   SetIndexShift(2,InpBandsShift);
   SetIndexLabel(2,"Bands Lower");
//--- work buffer
   SetIndexBuffer(3,ExtStdDevBuffer);
//--- check for input parameter
   if(InpBandsPeriod<=0)
     {
      Print("Wrong input parameter Bands Period=",InpBandsPeriod);
      return(INIT_FAILED);
     }
//---
   SetIndexDrawBegin(0,InpBandsPeriod+InpBandsShift);
   SetIndexDrawBegin(1,InpBandsPeriod+InpBandsShift);
   SetIndexDrawBegin(2,InpBandsPeriod+InpBandsShift);
//--- initialization done
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Bollinger Bands                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,pos;
//---
   if(rates_total<=InpBandsPeriod || InpBandsPeriod<=0)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtMovingBuffer,false);
   ArraySetAsSeries(ExtUpperBuffer,false);
   ArraySetAsSeries(ExtLowerBuffer,false);
   ArraySetAsSeries(ExtStdDevBuffer,false);
   ArraySetAsSeries(close,false);
//--- initial zero
   if(prev_calculated<1)
     {
      for(i=0; i<InpBandsPeriod; i++)
        {
         ExtMovingBuffer[i]=EMPTY_VALUE;
         ExtUpperBuffer[i]=EMPTY_VALUE;
         ExtLowerBuffer[i]=EMPTY_VALUE;
         
        }
     }
//--- определение АТР  
for(i=InpBandsPeriod-1; i>=0; i--)
        {
         xx=High[i]-Low[i];
         Drv+=xx;
         if(min>xx) min=xx;
         if(max<xx) max=xx;
         xIn=iHigh(SimbolUSD,NULL,i)-iLow(SimbolUSD,NULL,i);
         DrvIn+=xIn;
         if(minIn>xIn) minIn=xIn;
         if(maxIn<xIn) maxIn=xIn; 
        }   
 Drv/=InpBandsPeriod;
 DrvIn/=InpBandsPeriod;
 natr=((Drv-min)/(max-min))*100; //тут определяем пройденное значение атр инструментом на графике
 natrIn=((DrvIn-minIn)/(maxIn-minIn))*100; //тут определяем пройденное значение атр инструментом на индексе доллара
 //средние АТР
 ma1=iMA(NULL,0,InpBandsPeriod,0,2,1,0);
 ma2=iMA(SimbolUSD,0,InpBandsPeriod,0,2,1,0); 
 //определяем знак АТР
 bid1=MarketInfo(NULL,MODE_BID);
 bid2=MarketInfo(SimbolUSD,MODE_BID);
 if (bid1-ma1<0) Drv=Drv*(-1); // если цена падает значит минус
 if (bid2-ma2<0) DrvIn=DrvIn*(-1); // если цена падает значит минус
 
 // а теперь сама она родная 
 //где Drv инструмент графика,а DrvIn индекс доллара
 //расчёт индекса волатильности для инструмента
 R01 = (1-(1+Drv)/(1+max))*100;//используем для движения вверх
 R02 = (1-(1-Drv)/(1+max))*100;//используем для движения вниз
 //расчёт индекса волатильности для доллара
 R1 = (1-(1+DrvIn)/(1+maxIn))*100;// 
 R2 = (1-(1-DrvIn)/(1+maxIn))*100;//используем для движения вниз 
 // далее сам расчёт
 
 
         
     
//--- начальный расчет
   if(prev_calculated>1)
      pos=prev_calculated-1;
   else
      pos=0;
//--- главный цикл
   for(i=pos; i<rates_total && !IsStopped(); i++)
     { 
      //--- средняя линия
      ExtMovingBuffer[i]=SimpleMA(i,InpBandsPeriod,close);
      //--- рассчитайте и запишите со стандартным отклонением
      ExtStdDevBuffer[i]=StdDev_Func(i,close,ExtMovingBuffer,InpBandsPeriod); // тут наверно смогу разместить код 
      //--- верхняя линия указывает зону перекупленности
     // -- тут хотел параметр ExtMovingBuffer[i] заменить на  iClose("USDCHF",PERIOD_D1,0)
      ExtUpperBuffer[i]=ExtMovingBuffer[i]+(max)*(R01+R2)/2; //Print("Drv ",Drv,",DrvIn",DrvIn,", R1", R1,", R2 ", R2);
      //--- нижняя линия указывает зону перепроданности
      ExtLowerBuffer[i]=ExtMovingBuffer[i]+(-max)*(R02+R1)/2; 
      //---
     }
//---- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Calculate Standard Deviation                                     |
//+------------------------------------------------------------------+
double StdDev_Func(int position,const double &price[],const double &MAprice[],int period)
  {
//--- variables
   double StdDev_dTmp=0.0;
//--- check for position
   if(position>=period)
     {
      //--- calcualte StdDev
      for(int i=0; i<period; i++)
         StdDev_dTmp+=MathPow(price[position-i]-MAprice[position],2);
      StdDev_dTmp=MathSqrt(StdDev_dTmp/period);
     }
//--- return calculated value
   return(StdDev_dTmp);
  }
//+------------------------------------------------------------------+




Obrigado pela ajuda

Aliaksei Karalkou
Aliaksei Karalkou
  • www.mql5.com
Опубликовал MetaTrader 4 сигнал Выставил продукт Советник DSvoltage  использует индикатор MACD. Торговый объём зависит от результата предыдущих сделок, фиксированного лота, и размера показателя Автолота. Советник DCvoltage хеджирует размер позиции и направление в зависимости от ситуации на рынке за счёт перекрытых ордеров. В советнике...
 

Boa tarde.

Há uma pergunta sobre arquivos binários: existe alguma maneira de aparar a cauda deles?

 
Yurij Kozhevnikov:

Boa tarde.

Eis uma pergunta sobre arquivos binários: existe alguma forma de aparar a cauda deles?

filename = "эта@с_хвостом.bin";

filename = "a_et@tailless";

)))

Ou qual cauda você quis dizer?

 
Сергей Таболин:

filename = "эта@с_хвостом.bin";

filename = "a_ta@no_tail";

)))

Ou a qual cauda você estava se referindo?

Você pode mover o ponteiro ao redor dos arquivos binários, ler e escrever de qualquer lugar. Existe alguma maneira de apagar, limpar, desde o ponto atual até o final do arquivo? É possível escrever um sinal do final do arquivo? Pode ser reduzido? Sem sobrescrever.

 
Yurij Kozhevnikov:

Boa tarde.

Existe tal pergunta nos arquivos binários: é possível de alguma forma aparar sua cauda?

você não pode

Procure por um tópico na seção 4. Houve tal pergunta há cerca de uma semana e alguém sugeriu uma solução com a chamada WinAPI (.dll)

Razão: