Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 481

 
Olá!

Alguém tem um exemplo de código que desenha alguns ícones, por exemplo setas no gráfico indicador, quando as linhas se cruzam, se há duas, ou quando a linha "0" é cruzada, ou qualquer outro critério? De preferência na parte superior e inferior da janela do indicador de auto-escala.
 
Sergei Vladimirov:
Prima "Load". Apenas as últimas 2048 barras são automaticamente carregadas, o resto tem de ser chutado.
Foi assim que saiu depois de "Carregar" ...
 
Mike:
Foi assim que saiu depois de "Carregar" ...
Apagar à força a pasta do arquivo histórico e executar o terminal - depois carregar todas as aspas.
 
Leo59:
Olá!

Talvez alguém tenha um código de exemplo que desenha alguns ícones, tais como setas no gráfico indicador, ao atravessar as linhas, se houver duas, ou ao atravessar a linha "0", ou qualquer outro critério? De preferência na parte superior e inferior da janela do indicador de auto-escala.

Aqui está um dos meus perus, talvez ajude. O código é para MT4, tal como é para MT4. Também funciona com troncos.

void PlotArrowUP(int i)
{
    string sup = "\xE9"; //233
    datetime dt = iTime(NULL, 0, i); 
    double dprice = (WindowPriceMax()-WindowPriceMin())/(100.0/ArrowOffsetInPercentOfScreen); //настроить масштаб под свои нужды
    ObjectCreate("arr1"+ArrowIdx, OBJ_TEXT, 0, dt, FastBuffer[i]-dprice);   
    ObjectSetText("arr1"+ArrowIdx, sup, ArrowFontSize, "Wingdings", ColorArrowUp);
    ArrowIdx++;
    if(EnableLogFile)
    {
        string dts = TimeToStr(TimeCurrent(), TIME_DATE | TIME_MINUTES | TIME_SECONDS);
        FileWrite(LogFile1, dts, "  call PlotArrowUp(i) i=", i, "  FastBuffer[i]=", FastBuffer[i]);
    }
}

void PlotArrowDown(int i)
{
    string sup = "\xEA"; //234
    datetime dt = iTime(NULL, 0, i); 
    double dprice = (WindowPriceMax()-WindowPriceMin())/(100.0/ArrowOffsetInPercentOfScreen);
    dprice*= 2.0;
    ObjectCreate("arr0"+ArrowIdx, OBJ_TEXT, 0, dt, FastBuffer[i]+dprice);   
    ObjectSetText("arr0"+ArrowIdx, sup, ArrowFontSize, "Wingdings", ColorArrowDown);
    ArrowIdx++;
    if(EnableLogFile)
    {
        string dts = TimeToStr(TimeCurrent(), TIME_DATE | TIME_MINUTES | TIME_SECONDS);
        FileWrite(LogFile1, dts, "  call PlotArrowDown(i) i=", i, "  FastBuffer[i]=", FastBuffer[i]);
    }
}
 
Alexey Volchanskiy:

Вот из моего индюка, может, поможет. Код для МТ4, выкладываю, как есть. Там еще работа с логами.

Obrigado Alexey pelo seu feedback!

No seu exemplo, é através de objectos. Será possível fazê-lo através de matrizes, para que quando mudo de escala, elas estejam sempre nos limites superior e inferior da janela?
 
Leo59:
Alexey Volchanskiy:
Obrigado Alexey pelo seu feedback!

No seu exemplo, é através de objectos. Será que é possível fazê-lo através de matrizes, para que quando mudo de escala, elas estejam sempre no topo e no fundo da janela?

Não compreendo sobre as matrizes. Ver comentários, acrescentei

ObjectCreate("arr0"+ArrowIdx, OBJ_TEXT, 0, dt, FastBuffer[i]+dprice);
// "arr0"+ArrowIdx - формируем уникальное имя стрелки
// FastBuffer[i]+dprice - тут формируется цена, на которой будет рисоваться стрелка
   
ObjectSetText("arr0"+ArrowIdx, sup, ArrowFontSize, "Wingdings", ColorArrowDown);
ArrowIdx++; // для каждой стрелки нужно уникальное имя

Além disso, se precisar de desenhar na borda superior, faça o seguinte

ObjectCreate("arr0"+ArrowIdx, OBJ_TEXT, 0, dt, ChartGetDouble(0,CHART_PRICE_MAX,0); 

Leia a ajuda do editor; é descrita aqui em detalhes com exemplos

MQL4 Referência / Constantes, enumerações e estruturas padrão / Constantes do gráfico / Exemplos de trabalho com gráficos

 
Alexey Volchanskiy:

Não compreendo sobre as matrizes. Ver comentários, acrescentei

Além disso, se precisar de desenhar na borda superior, faça o seguinte

E deve ler a ajuda do editor; é descrita aqui em detalhes com exemplos

MQL4 Referência / Constantes, enumerações e estruturas padrão / Constantes do gráfico / Exemplos de trabalho com gráficos

Mudança

WindowPriceMax() и WindowPriceMin()

Os objectos devem ser redesenhados à força a uma determinada distância das margens da janela

 
Leo59:

Com a mudança

os objectos terão de ser forçados a ser redesenhados a uma determinada distância das margens da janela

Os objectos antigos permanecerão nos seus lugares - aos preços antigos. Se precisar de os deslocar para os limites, terá de os redesenhar manualmente. Não conheço completamente o seu problema.

Pode usar o OnChartEvent para acompanhar as mudanças de janela.

 
Alexey Volchanskiy:

Os objectos antigos permanecerão nos seus lugares - aos preços antigos. Se tiver de os deslocar para os limites, terá de os redesenhar à mão. Só não conheço completamente a sua tarefa.

Pode usar o OnChartEvent para acompanhar as mudanças de janela.

À primeira vista, parece ser uma tarefa simples. MAS! ....
Há uma linha de qualquer oscilador na janela indicadora, que está a mover-se relativamente "0" com amplitude diferente.
O verdadeiro problema é:
- Na passagem "0" de baixo para cima, desenhar uma seta na borda inferior da janela indicadora,
- Na passagem "0" de cima para baixo, para desenhar uma seta perto da borda superior da janela indicadora,
- à auto-escala do gráfico oscilador na janela indicadora, as setas devem permanecer automaticamente nos seus limites da janela indicadora.
Ou seja, percorrendo o gráfico para trás e para a frente através da história ou alterando a sua escala horizontal, as setas permanecem sempre nos limites da janela indicadora.
 
Leo59:
À primeira vista, a tarefa parece tão simples como três kopecks. MAS! ....
Há uma linha de qualquer oscilador na janela indicadora, que gira relativamente "0" com amplitude diferente.
O verdadeiro problema é:
- Na passagem "0" de baixo para cima, desenhar uma seta na borda inferior da janela indicadora,
- Na passagem "0" de cima para baixo, para desenhar uma seta perto da borda superior da janela indicadora,
- à auto-escala do gráfico oscilador na janela indicadora, as setas devem permanecer automaticamente nos seus limites da janela indicadora.
Ou seja, percorrendo o gráfico para trás e para a frente através da história ou alterando a sua escala horizontal, as setas permanecem sempre nos limites da janela indicadora.

A tarefa é e é bastante simples.

Quando a janela é mudada ou rolada,OnChartEvent é chamado, passa um evento sem parâmetros:

CHARTEVENT_CHART_CHART_CHANGEevento de mudança de gráfico

Se este evento ocorrer, determinamos a barra visível à esquerda e à direita e dentro destes limites encontramos todas as setas na janela indicadora. Se for encontrado, deslocamo-lo para o limite necessário. Ao criar setas, dar-lhes nomes como UpArrow***** e DownArrow***** para evitar problemas relacionados com a análise. Depois, por via das dúvidas, ligue para ChartRedraw.