A ociosidade é o estímulo do progresso ou como trabalhar com gráficos de maneira interativa
Introdução
Em um fórum de falantes de inglês, encontrei uma descrição interessante da interpretação dos níveis Fibo. A ideia principal é a correção do impulso em movimento que se aproxima da região entre 38,2 и 61,8 %. Como assisti ao vídeo carregado lá e tentei desenhar os níveis Fibo nos gráficos sozinho, comecei a usar essa ferramenta em minha prática.
Não falarei das vantagens e desvantagens do sistema. Quero contar outra coisa aqui. Como sou preguiçoso por natureza (e creio não estar sozinho) e todos aqueles desenhos sem fim e outros desenhos de fibrilações para pesquisa que revertem a zona em um gráfico me entediaram, decidi colocar uma parte do trabalho no MQL4.
O principal problema que preciso resolver é a exibição automática das zonas com as mesmas cores no gráfico de preço das fibrilações desenhadas a mão. Não é segredo que a exibição de cor dos objetos melhora sua percepção vívida. Concordo, é muito mais fácil perceber um objeto em um gráfico que analisar uma variedade de linhas com os números especificados neles o tempo todo.
Processamento de coordenadas de objetos gráfico
Eu acho mesmo que a interatividade deve ser proporcionada durante o trabalho com um gráfico. Precisamos obter o desenho dos ícones do programa ou mesmo os desenhos gráficos adicionais para os desenhos feitos por um trader, e também precisamos de sons de acompanhamento no caso do cruzamento de linhas, por exemplo.
É necessário observar as vantagens do desenho manual.
- Isso permite que o trader atribua ele mesmo um ponto de referência de desenho de objetos no gráfico.
- Entradas de código suficientes são salvas, então o processador do computador carrega também.
- Não é necessário programar uma lógica inicial de desenho de um objeto em um gráfico. A propósito, não é fácil atingir a lógica necessária programaticamente. Observe a quantidade de indicadores "ZigZag", por exemplo.
Aqui, eu gostaria de mostrar como implementar um indicador de intersecção de uma linha de tendência desenhada a mão.
Antes de tudo, vamos desenhar uma linha de tendência em um gráfico. Depois, encontrei essa linha na lista de objetos. Ela é chamada, por exemplo, então: Trendline 29344. Trendline é a descrição da própria linha, e 29344 é o número que é atribuído a ela pelo terminal do cliente MetaTrader 4.
Vamos renomear a Trendline no TrDup, ela será a linha da tendência superior.
Depois, repetimos as mesmas etapas de criação de outra linha de tendência e criamos a linha de tendência TrDdown usando o que mostraremos na tendência inferior.
(o indicador 1_01_Tr_Alert é ajustado em cooperação com essas linhas exatamente, os mesmos nomes são usados no indicador de linhas de tendência Demark desenhando TL_by_Demark_v6)
Agora, precisamos ler o número de objetos no gráfico usando MQL4.
int obj_total=ObjectsTotal();
Conseguimos o número de objetos no gráfico na variável obj_total.
Agora, temos o número de objetos e resta escolher o objeto necessário para continuar o processamento adicional do algoritmo. Para fazer isso, usamos o operador típico do ciclo e encontramos os objetos "TrDup" e "TrDdown".
// Determine the Trend line object int obj_total=ObjectsTotal(); string index; for(int i=0;i<obj_total;i++) { index=ObjectName(i); string substrTL_down = StringSubstr (index, 0, 7); if (substrTL_down == "TrDdown") string TrDLine_down=index; string substrTL_up = StringSubstr (index, 0, 5); if (substrTL_up == "TrDup") string TrDLine_up=index; }
Depois, atribuímos seus nomes às variáveis de string TrDLine_down e TrDLine_up.
Agora, temos as linhas de tendência identificadas que desenhamos manualmente no gráfico. A partir de agora, o indicador fisga as coordenadas das linhas e pode executar algumas ações com elas pelo algoritmo necessário.
Precisamos conseguir um sinal para o Close da primeira barra no candelabro abaixo do Close da segunda barra, fornecido pela linha de tendência entre os Closes das duas barras. Assim, recebemos um sinal de cruzamento da linha de tendência pelo preço.
if ((Close[1]>ObjectGetValueByShift(TrDLine, 1)) && (Close[2]<ObjectGetValueByShift(TrDLine, 2)))
Agora, precisamos apenas executar o Alerta e o arquivo de desenho ou de mídia de som, por exemplo, uma seta no gráfico próxima da barra do cruzamento da linha de tendência.
Esse método permite organizar facilmente a cooperação interativa com quaisquer objetos adicionados manualmente a um gráfico. Níveis Fibo, canais etc.
O indicador de exibição das zonas coloridas dos níveis Fibo publicado no fórum Onix pode servir de exemplo: http://www.onix-trade.net/forum/index.php?act=attach&type=post&id=27033&setlanguage=1&langid=ru.
E o complemento do nen indicador ZigZag para o desenho automático dos níveis Fibo pela última onda está aqui: http://www.onix-trade.net/forum/index.php?act=attach&type=post&id=27175&setlanguage=1&langid=ru.
Abaixo, forneço o código de indicador para a exibição complexa das zonas Fibo, indicação do cruzamento da linha de tendência e exibição do preço atual no gráfico usando o objeto "etiqueta de preço" colocado no gráfico.
//+------------------------------------------------------------------+ //| 1.012_InfoFibo.mq4 | //| | //| b2w@narod.ru | //+------------------------------------------------------------------+ #property copyright "http://www.fibook.ru" #property link "b2w@narod.ru" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Lime #property indicator_color2 Red //---- input parameters extern bool Auto_Correct_Line = false;// Autocorrection of the last Fibo point extern bool ClearRectangle = true;//Deleting of the squares while redrawing of the Fibo levels extern bool TargetZone = true;//Drawing of the target zones extern int count_Alert=3; //the number of iterations of Alert double fibs[] = {-0.618, -0.382, -0.237, 0.0, 0.145, 0.382, 0.618, 0.855, 1.0, 1.237, 1.382, 1.618}; color fibsColor[] = {Maroon, Green, ForestGreen, Teal, SteelBlue, , SteelBlue, Teal, ForestGreen, Green, Maroon}; double Old_Price; color FontColor=Black; string TextAlert[7]; int y=0,count_a=0; double ftime; double win_idx; string NameFibs; double Spread; double ExtMapBufferUP[]; double ExtMapBufferDN[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { Spread=(Ask-Bid); //---- indicators SetIndexStyle(0,DRAW_ARROW,0,1); SetIndexArrow(0,233); SetIndexBuffer(0,ExtMapBufferUP); SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_ARROW,0,1); SetIndexArrow(1,234); SetIndexBuffer(1,ExtMapBufferDN); SetIndexEmptyValue(1,0.0); return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { if(ftime!=Time[0]) count_a=0; // int counted_bars=IndicatorCounted(); //---- // Determine if there are the Fibo levels or not int obj_total=ObjectsTotal(); string index; for(int i=0;i<obj_total;i++) { index=ObjectName(i); string substr = StringSubstr(index, 0, 4); if (substr == "Fibo") NameFibs=index; string substrTL = StringSubstr (index, 0, 9); if (substrTL == "Trendline") string TrDLine=index; string substrPR = StringSubstr (index, 0, 5); if (substrPR == "Arrow") string PR=index; } // Paramaters of the trend line if (StringLen(TrDLine)>1) { if (ObjectGet(TrDLine, OBJPROP_PRICE1)>ObjectGet(TrDLine, OBJPROP_PRICE2)) { if ((Close[1]>ObjectGetValueByShift(TrDLine, 1)) && (Close[2]<ObjectGetValueByShift(TrDLine, 2))) { ExtMapBufferUP[1]=(Low[1]-5*Point); /*Alert (Symbol()," Trend UP enter");*/ c_alert(1); } } else if (ObjectGet(TrDLine, OBJPROP_PRICE1)<ObjectGet(TrDLine, OBJPROP_PRICE2)) { if ((Close[1]<ObjectGetValueByShift(TrDLine, 1)) && (Close[2]>ObjectGetValueByShift(TrDLine, 2))) { ExtMapBufferDN[1]=(High[1]+5*Point);/*Alert (Symbol()," Trend DN enter");*/ c_alert(1); } } } // The end of calculation of the trend line if (StringLen(NameFibs) <1) return(-1);// If there are no Fibo levels, then we exit // Determine where the Fibo levels are drawn double pr1=ObjectGet(NameFibs, OBJPROP_PRICE1);// first price High double pr1vrem=ObjectGet(NameFibs, OBJPROP_TIME1);// first time of the price double pr2=ObjectGet(NameFibs,OBJPROP_PRICE2);// second price Low double pr2vrem=ObjectGet(NameFibs, OBJPROP_TIME2);// second time of the price double fibprop=(pr1-pr2);// The difference between HIGH and LOW double Timeend=(Time[0]+(Period()*360)); // The right side by the time // to display the objects on the chart double TimeNachalo=(Time[0]+Period()*60);// The right side by the time // to display the objects on the chart //+++ ObjectMove(PR, 0,Time[0], Bid);// The icon of the current price //+++ // Parameters of the rectangle of the reverse zone.. double verx=(pr1-fibprop*0.382); double niz=(pr2+fibprop*0.382); string UP=DoubleToStr(verx+Spread,Digits); string DN=DoubleToStr(niz-Spread,Digits); if (Auto_Correct_Line==true) { if (High[0]>pr1) ObjectMove(NameFibs, 0,Time[0], High[0]); if (Low[0]<pr2) ObjectMove(NameFibs, 1,Time[0], Low[0]); } if (ClearRectangle == true) ObjectsDeleteAll(0,OBJ_RECTANGLE);// Delete the RECTANGLES objects // Draw the rectangles in the cycle for( y=0;y<11;y++) { ObjectCreate(("Kvadrat"+y), OBJ_RECTANGLE, 0, TimeNachalo,(pr2+fibprop*fibs[y]), Timeend,(pr2+fibprop*fibs[y+1]) ); ObjectSet(("Kvadrat"+y),OBJPROP_COLOR,fibsColor[y]); } // The end of drawing /* Drawing of the rectangle of the ZONE */ ObjectCreate("Kvadrat", OBJ_RECTANGLE, 0, TimeNachalo, verx , Timeend , niz); ObjectSet("Kvadrat",OBJPROP_BACK,false); // The array of text data TextAlert[0] = "Attention two targets "; TextAlert[1] = ("Order up * "+UP); TextAlert[2] = ("Order down * "+DN); TextAlert[3] = ("TARGET up 2 * "+(DoubleToStr(pr1+fibprop*0.618,Digits))); TextAlert[4] = ("TARGET up 1 * "+(DoubleToStr(pr1+fibprop*0.382,Digits))); TextAlert[5] = ("TARGET down 1 * "+(DoubleToStr(pr2-fibprop*0.382,Digits))); TextAlert[6] = ("TARGET down 2 * "+(DoubleToStr(pr2-fibprop*0.618,Digits))); double YDist[] = {20, 55, 80, 120, 150, 180, 210}; color TextAlertClr[] = {Yellow, Green, Red, Green, Green, Red, Red}; // Output to the screen the message about orders entering for(y=0;y<7;y++) ObjectDelete("TextAlerts"+y); if (TargetZone == true) { if (Bid > niz && Bid < verx) for(y=0;y<7;y++) { ObjectCreate(("TextAlerts"+y), OBJ_LABEL, 0, 0, 0); ObjectSetText(("TextAlerts"+y),TextAlert[y], 12, "Times New Roman",TextAlertClr[y]); ObjectSet(("TextAlerts"+y), OBJPROP_CORNER, 0); ObjectSet(("TextAlerts"+y), OBJPROP_XDISTANCE, 10); ObjectSet(("TextAlerts"+y), OBJPROP_YDISTANCE, YDist[y]); } } // The informer of the price and the currency name ObjectDelete("Market_Price_Label101"); ObjectCreate("Market_Text_Label101", OBJ_LABEL, 0, 0, 0); ObjectSetText("Market_Text_Label101", (Symbol()+" "+Period()), 16, "Times New Roman", Yellow); ObjectSet("Market_Text_Label101", OBJPROP_CORNER, 2); ObjectSet("Market_Text_Label101", OBJPROP_XDISTANCE, 5); ObjectSet("Market_Text_Label101", OBJPROP_YDISTANCE, 5); return(0); } //+------------------------------------------------------------------+ void c_alert(int w) { ftime=Time[0]; if(count_a<count_Alert) {count_a+=1; PlaySound("ku_ku.wav"); } } return;
O cruzamento da linha de tendência no gráfico por hora GBPUSD é exibido na próxima figura.
Conclusão
A aplicação dessa abordagem de processamento dos dados recebidos é uma boa ajuda no trabalho do trader. Aliviar os olhos de alguém e libertá-lo da espera contínua pelo momento necessário para ativar ou fechar uma posição proporciona não só a diminuição de estresse emocional, mas também aumenta as chances de não perder os momentos necessários na negociação.
E para fazer tudo mais fácil para você, anexei o modelo do gráfico GBP que deve ser colocado na pasta \templates\.
O indicador deve ser colocado na pasta \experts\indicators\.
E o arquivo de som deve ser colocado na pasta \sounds\.
Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/1546
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso