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

 
Добрый день. Прошу помощи. Уже пару недель безуспешно пытаюсь заставить индикатор круглых уровней заставить (см.код) передавать их для использования в эксперте через iCustom. Прошу помочь поправить код.




#property indicator_chart_window

extern string H                     = " --- Mode_Settings ---";
extern bool   Show_00_50_Levels     = true;
extern bool   Show_20_80_Levels     = true;
extern color  Level_00_Color        = Lime;
extern color  Level_50_Color        = Gray;
extern color  Level_20_Color        = Red;
extern color  Level_80_Color        = Green;

double dXPoint = 1;
double Div = 0;
double i = 0;
double HighPrice = 0;
double LowPrice = 0;
int iDigits;
  
int start() 
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
  
  if(Show_00_50_Levels)
  {
   for (i = LowPrice; i <= HighPrice; i++) 
   {
      if (MathMod(i, 5) == 0.0) {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
            if(MathMod(i, 10) == 0.0)
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_00_Color);
            }
            else
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_50_Color);
            }
         }
      }
   }
   
  }
  
  if(Show_20_80_Levels)
  {
  
   for (i = LowPrice; i <= HighPrice; i++) 
   {
         
        if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="20") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT); 
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_20_Color);
            
            }
         }
        
         
         if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="80") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
           
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_80_Color);
            }
         }
         
   }
   
  }
  
   return (0);
}

int init() 
{
   iDigits = Digits;
   if(Digits==5 || Digits==3)dXPoint=10;
   if(Digits==3)  iDigits=2;
   if(Digits==5)  iDigits=4;
   
   Div = 0.1 / (Point*dXPoint);
   return (0);
}

int deinit()
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
   for (i = LowPrice; i <= HighPrice; i++) ObjectDelete("RoundPrice " + DoubleToStr(i, 0));
   return (0);
 
Aleksey Mavrin:
Se você diz que é praticamente zero na programação, então por que você assume tais tarefas não-padronizadas, talvez comece com tarefas simples? Ou melhorar seu conhecimento do básico? É mais fácil fazer isso para você, sim.

Eu não escrevi: "Faça-me um indicador". Eu pedi ajuda. Eu não estou tentando dominar o mql4 completamente. Estou apenas verificando as idéias. Eu já tive o suficiente de excelência).

 
Oleg Bondarev:

Eu o avisei que eu era um "hacker")

Eis como eu o fiz.

Agora ele desenha uma tabela de carrapatos, mas há algumas quebras de linha.

Eu faço isso em 4.

Linhas quebradas significam que não há valores no Label1Buffer[ХХХ].

e a segunda, escrevi acima, mais uma vez - o buffer indicador (Label1Buffer) é controlado pelo terminal, se uma nova barra aparecer, então todos os valores mudarão automaticamente - execute o código em M1 e observe

ZS: não um hacker, mas alguém que está tentando aprender por conta própria! ))))

 
Igor Makanu:

linhas quebradas significa que não há valores no Label1Buffer[XXX].

e a segunda, escrevi acima, mais uma vez - o buffer indicador (Label1Buffer) é controlado pelo terminal, se uma nova barra aparecer, então todos os valores mudarão automaticamente - execute o código em M1 e observe

ZS: não um hacker, mas alguém que está tentando aprender por conta própria! ))))

Label1Buffer[XXX] - significa 3 números compostos?


 
Oleg Bondarev:

Label1Buffer[XXX] - este é um número com 3 componentes?


Não, eu escrevi as primeiras cartas que me lembrei.

esse é o número do item.

olhe seu código, você escreveu seu código de forma semelhante ao meu laço, onde você desloca o buffer de indicadores Label1Buffer por um elemento - observe cada chamada de indicador (cada tique)

e depois de mudar o conteúdo do Label1Buffer, atribua onovo valor ao Label1Buffer[0].

e que valores estarão em outros elementos? no primeiro lançamento eles terão "valor vazio" (EMPTY_VALUE), depois você os muda uma vez e atribui um novo valor a.... e então o próprio terminal irá mudar TODOS os valoresdo Label1Buffer quando uma nova barra aparecer


Em geral, há uma pequena mudança em seu conhecimento, mas tente simplesmente desenhar o preço de fechamento da barra com o indicador, aqui está o código

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot line1
#property indicator_label1  "line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=10;
//--- indicator buffers
double         line1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,line1Buffer);
   IndicatorDigits(Digits);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if(prev_calculated==0){
      limit=rates_total-1;
   }else
      limit=rates_total-prev_calculated+1; // или limit=rates_total-prev_calculated ; чтобы не перерисовывать бар №1
//--- Основной цикл расчета
//Print("limit = ",limit);
   for(i=limit; i>=0; i--){
      line1Buffer[i]=close[i];
    }
//---
  return(rates_total);

  }
//+------------------------------------------------------------------+
 
Eu ouço você. Vou ter que pensar sobre isso. Obrigado!
 

Como registrar dados no Excel? - MQL5.

O formato do arquivo Excel é xlsx, mas a função FileOpen cria e trabalha com arquivos txt e csv.


Após testar no OnTester, preciso descarregar os dados dos buffers que contêm o histórico de diferentes dados no momento da abertura de cada tick e emitir os dados de todos os negócios em um único gráfico.
Como você entende que os dados serão muito mesmo para uma profissão, para não mencionar todas elas - é por isso que a opção "transferência manual" não é adequada


O que você recomenda?

 
Alexandr Sokolov:

Como importar dados para o Excel? - MQL5.

O formato do arquivo Excel é xlsx e a função FileOpen cria e trabalha com arquivos txt e csv.


Preciso, após testar no OnTester, descarregar os dados dos buffers que contêm histórico de dados diferentes no momento em que a posição foi aberta em cada tick e, em seguida, exibir todos os dados comerciais em um gráfico
Como você entende que os dados serão muito mesmo para uma profissão, para não mencionar todas elas - portanto, a opção de "transferência manual" não é adequada.


O que você recomenda?

Bem, o resultado final é simples - você não pode escrever diretamente no Excel usando MQL5, mas pode importar dados de um arquivo de texto no Excel na aba "data" >>> "from text".

 
Olá, recebo um erro sobre os objetos mal sucedidos após completar um teste explorador, e criei absolutamente todos os objetos, até onde entendi, na pilha, ou seja, sem novos. Por favor, explique esta questão.
 
Alexandr Sokolov:

O que você recomenda?

Escrever em .csv e abrir em Excel

Razão: