Como codificar? - página 291

 

último detalhe da vela

Hi,

precisam de um indicador para mostrar o valor alto, baixo, aberto e fechado da última vela.

 
mladen:
Por que não usar uma parada móvel então? Quer dizer, ela faria quase 100% (quase) do que sua idéia original é e é muito, muito mais fácil de codificar

A questão é que (não creio que tenha formulado corretamente ou não estava 100% correto) as paradas (por enquanto, de qualquer forma) permanecerão as mesmas durante todo o comércio. Que tal uma abordagem como esta, quando duas negociações estão abertas, um código pode verificar o número de ordens abertas, se estiver acima de 1 (basicamente 2) então ambas as negociações têm seus lucros modificados para uma certa quantia que era maior do que antes. Essencialmente, algum tipo de hedging ocorre aqui.

Obrigado,

madmax3

 

[langtitle=pl]Proszę o pomoc w napisaniu EA działającego n[/langtitle]

[lang=pl]Witam czy bugł by ktoś mi to dopracować był rym wdzięczny : Chciałbym rzeby kupywał LevelRSIbuy=20; a sprzeawał jak dojdzie LevelRSIsell=80; i żeby dało się ustawiać pozostałe żeczy kt�re są pod extern int MagicNumber

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

#propriedade copyright "Expert Advisor Builder"

#link da propriedade "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/"

número interno externo MagicNumber = 0;

sinal externo boolMail = Falso;

bool externo EachTickMode = Verdadeiro;

double Lots externo = 0,1;

Externo int Slippage = 1;

bool externo UseStopLoss = Verdadeiro;

stopLoss int externo = 10;

extern bool UseTakeProfit = Verdadeiro;

extern int TakeProfit = 5;

bool UseTrailingStop = Falso;

Exterior int TrailingStop = 30;

extern int LevelRSIbuy=20;

Exterior int LevelRSIsell=80;

int BarCount;

int Corrente;

bool TickCheck = Falso;

//+------------------------------------------------------------------+

//| função de iniciação de especialista |

//+------------------------------------------------------------------+

int init() {

BarCount = Barras;

se (CadaTickMode) Corrente = 0; caso contrário Corrente = 1;

retorno(0);

}

//+------------------------------------------------------------------+

//| função de desinicialização especializada |

//+------------------------------------------------------------------+

int deinit() {

retorno(0);

}

//+------------------------------------------------------------------+

//| função de início especializado |

//+------------------------------------------------------------------+

int start() {

int Ordem = SIGNAL_NONE;

int Total, Bilhete;

nível duplo StopLossLevel, TakeProfitLevel;

if (CadaTickMode && Bars != BarCount) TickCheck = False;

Total = EncomendasTotal();

Order = SIGNAL_NONE;

//+------------------------------------------------------------------+

//| Início variável |

//+------------------------------------------------------------------+

duplo Var1 = iRSI("EURUSD", PERÍODO_M1, 14, PREÇO_OPEN, Atual + 0);

duplo Comprar1_1 = iRSI("EURUSD", PERÍODO_M1, 14, PREÇO_OPEN, Atual + 0);

duplo Venda1_1 = iRSI("EURUSD", PERÍODO_M1, 14, PREÇO_OPEN, Atual + 0);

//+------------------------------------------------------------------+

//| Fim variável |

//+------------------------------------------------------------------+

//Cheque posição

bool IsTrade = Falso;

para (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {

IsTrade = Verdadeiro;

if(OrderType() == OP_BUY) {

//Close

//+------------------------------------------------------------------+

//| Início do Sinal (Compra de Saída) |

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//| Fim do sinal (Compra de Saída) |

//+------------------------------------------------------------------+

if (Order === SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");

se (!EachTickMode) BarCount = Bars;

IsTrade = Falso;

continuar;

}

// Parada de trilha

if(UseTrailingStop && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Ponto * TrailingStop) {

if(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

se (!EachTickMode) BarCount = Bars;

continuar;

}

}

}

{} else {

//Close

//+------------------------------------------------------------------+

//| Início do Sinal (Sair de Venda) |

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//| Fim do sinal (Sair de Venda) |

//+------------------------------------------------------------------+

if (Order === SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");

se (!EachTickMode) BarCount = Bars;

IsTrade = Falso;

continuar;

}

// Parada de trilha

if(UseTrailingStop && TrailingStop > 0) {

if((OrderOpenPrice() - Ask) > (Ponto * TrailingStop)) {

if((OrderStopLoss() > (Pergunte + Ponto * TrailingStop)) ||| (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

se (!EachTickMode) BarCount = Bars;

continuar;

}

}

}

}

}

}

//+------------------------------------------------------------------+

//| Início do sinal (Entrada) |

//+------------------------------------------------------------------+

se (Falso) Ordem = SIGNAL_BUY;

se (Falsa) Ordem = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| Fim do sinal |

//+------------------------------------------------------------------+

//Compra

if (Order === SIGNAL_BUY && ((EachTickMode && !TickCheck) ||| (!EachTickMode && (Bars != BarCount)))) {

if(!IsTrade) {

//Cheque margem livre

if (AccountFreeMargin() < (1000 * Lotes)) {

Imprimir("Nós não temos dinheiro. Margem Livre = ", AccountFreeMargin());

devolução(0);

}

se (UseStopLoss) StopLossLevel = Perguntar - StopLoss * Ponto; caso contrário, StopLossLevel = 0,0;

if (UseTakeProfitLevel) TakeProfitLevel = Ask + TakeProfitLevel * Ponto; caso contrário TakeProfitLevel = 0,0;

Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if(Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

Imprimir("Pedido de compra aberto : ", Preço Aberto());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");

} else {

Imprimir("Erro na abertura do pedido de compra : ", GetLastError());

}

}

se (EachTickMode) TickCheck = Verdadeiro;

se (!EachTickMode) BarCount = Bars;

return(0);

}

}

//vender

if (Order === SIGNAL_SELL && ((EachTickMode && !TickCheck) ||| (!EachTickMode && (Bars != BarCount)))) {

if(!IsTrade) {

//Cheque margem livre

if (AccountFreeMargin() < (1000 * Lotes)) {

Imprimir("Nós não temos dinheiro. Margem Livre = ", AccountFreeMargin());

devolução(0);

}

se (UseStopLoss) StopLossLevel = Bid + StopLoss * Ponto; caso contrário, StopLossLevel = 0,0;

if (UseTakeProfitLevel) TakeProfitLevel = Bid - TakeProfit * Ponto; caso contrário TakeProfitLevel = 0,0;

Ticket = OrderSend(Symbol(), OP_SELLL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

if(Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

Imprimir("ordem de venda aberta : ", OrderOpenPrice());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");

} else {

Imprimir("Erro na abertura do pedido de VENDA : ", GetLastError());

}

}

se (EachTickMode) TickCheck = Verdadeiro;

se (!EachTickMode) BarCount = Bars;

return(0);

}

}

se (!EachTickMode) BarCount = Bars;

retorno(0);

}

//+------------------------------------------------------------------+[/lang]

 

Estou tentando usar este código para aumentar o lucro das negociações abertas (se forem duas negociações abertas).

if(total>2)

if(OrderType()==OP_BUY)

OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);

if(OrderType()==OP_SELL)

OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);

total=OrdensTotal(); btw.

Mas ainda não consegui fazer com que funcionasse, alguma sugestão?

Obrigado,

madmax3

 

Ajuda a limitar a 1 o número de negócios diários

Sou novo em programação e preciso de ajuda na MQL4. Estudei alguns guias de codificador e descobri como abrir e fechar negócios com base em minha estratégia comercial. Minha dificuldade é limitar o número de negociações diárias a 1. Quero abrir não mais que 1 negociação por dia (de acordo com o horário do servidor). Portanto, gostaria de verificar as ordens abertas e fechadas para ver se uma ordem foi aberta hoje. Se uma ordem foi aberta hoje, então não abra nenhuma ordem adicional para o dia.

Por favor, ajude.

 
Tente algo como isto :
bool uniqueOnDay()

{

datetime startTime = iTime(NULL,PERIOD_D1,Time[0]);

datetime endTime = startTime+24*60*PERIOD_D1;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime()endTime) continue;

return(false);

}

return(true);

}
É verificar se alguma das ordens fechadas para o símbolo atual foi aberta em um dia atual. Se houve uma ordem aberta no dia corrente, ela retorna falsa (já houve uma ordem aberta naquele dia) ou então retorna verdadeira (não houve uma ordem aberta naquele dia). Ele não verifica as ordens abertas atualmente (apenas histórico), pois presumo que você não queira mais do que 1 ordem aberta e isso é verificado de forma diferente. O uso seria algo como isto :

if (UniqueOnDay() && CurrentlyOpenedOrders==0) ...

PS: assume que seu EA tem um parâmetro MagicNumber (esse nome exato)

PPS: funcionará dentro dos prazos até a daiy. Não funcionará bem em gráficos semanais e traiçoeiros.

dresolo1:
Sou novo em programação e preciso de ajuda na MQL4. Estudei alguns guias de codificador e descobri como abrir e fechar negócios com base em minha estratégia comercial. Minha dificuldade é limitar o número de negociações diárias a 1. Quero abrir não mais que 1 negociação por dia (de acordo com o horário do servidor). Portanto, gostaria de verificar as ordens abertas e fechadas para ver se uma ordem foi aberta hoje. Se uma ordem foi aberta hoje, então não abra nenhuma ordem adicional para o dia. Por favor, ajude.
 

[langtitle=pl]Converter a função Tema para Tema(fechar,período)[/langtitle]

Witam

Jeszcze raz bo cos sie zle wkleilo. Jak przekazac wartosc funkcji Tema do Var1. Jak robie tak jak w kodzie ponizej para Var1 é puste.

#property indicator_chart_window

#property indicator_buffers 1

#property indicator_color1 DarkBlue

#property indicator_width1 2

//---- input parameters

extern int EMA_period=4;

//---- buffers

string txt;

double TemaBuffer[];

double Ema[];

double EmaOfEma[];

double EmaOfEmaOfEma[];

double Var1;

int Var2;

int i,limit,limit2,limit3;

extern int Apply_To_Price=1;

//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+

int init()

{

//---- indicators

IndicatorBuffers(5);

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,Var1);

SetIndexBuffer(1,TemaBuffer);

SetIndexBuffer(2,Ema);

SetIndexBuffer(3,EmaOfEma);

SetIndexBuffer(4,EmaOfEmaOfEma);

IndicatorShortName("TEMA("+EMA_period+")");

switch(Apply_To_Price)

{

case 1:

{txt="Open";break;}

case 2:

{txt="High";break;}

case 3:

{txt="Low"; break;}

case 4:

{txt="Median"; break;}

case 5:

{txt="Typical"; break;}

case 6:

{txt="WghtdClose"; break;}

default:

{txt="Close";}

}

//----

return(0);

}

//+------------------------------------------------------------------+

//| Custom indicator deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| Custom indicator iteration function |

//+------------------------------------------------------------------+

int start()

{

//----

int counted_bars=IndicatorCounted();

if (counted_bars==0)

{

limit=Bars-1;

limit2=limit-EMA_period;

limit3=limit2-EMA_period;

}

if (counted_bars>0)

{

limit=Bars-counted_bars-1;

limit2=limit;

limit3=limit2;

}

for (i=limit3;i>=0;i--)

{

Var1 = Tema(Apply_To_Price,4); //=======================TUTAJ JEST PROBLEM W VAR1 NIC NIE MA. DLACZEGO?

// Alert(Var1);

}

Var2 = dodawanie (2,3);

return(0);

}

double Tema(int Cena, int cykl)

{

//----

for (i=limit;i>=0;i--) Ema=iMA(NULL,0,cykl,0,MODE_EMA,Cena,i);

for (i=limit2;i>=0;i--) EmaOfEma=iMAOnArray(Ema,0,cykl,0,MODE_EMA,i);

for (i=limit3;i>=0;i--) EmaOfEmaOfEma=iMAOnArray(EmaOfEma,0,cykl,0,MODE_EMA,i);

for (i=limit3;i>=0;i--)

{

TemaBuffer=3*Ema-3*EmaOfEma+EmaOfEmaOfEma;

//Alert(TemaBuffer);

}

return(TemaBuffer);

}

int dodawanie (int a, int b)

{

int c;

c=a+b;

return(c);

}

 

Assim (TEMA) ...

Se você quer que funcione assim, então deve ser algo assim:
double workTema[][3];

#define _ema1 0

#define _ema2 1

#define _ema3 2

double iTema(double price, double period, int r, int instanceNo=0)

{

if (ArrayRange(workTema,0)!= Bars) ArrayResize(workTema,Bars); instanceNo*=3; r = Bars-r-1;

//

//

//

//

//

double alpha = 2.0 / (1.0+period);

workTema[r][_ema1+instanceNo] = workTema[r-1][_ema1+instanceNo]+alpha*(price -workTema[r-1][_ema1+instanceNo]);

workTema[r][_ema2+instanceNo] = workTema[r-1][_ema2+instanceNo]+alpha*(workTema[r][_ema1+instanceNo]-workTema[r-1][_ema2+instanceNo]);

workTema[r][_ema3+instanceNo] = workTema[r-1][_ema3+instanceNo]+alpha*(workTema[r][_ema2+instanceNo]-workTema[r-1][_ema3+instanceNo]);

return(workTema[r][_ema3+instanceNo]+3.0*(workTema[r][_ema1+instanceNo]-workTema[r][_ema2+instanceNo]));

}[/PHP]

Anexando também um indicador de exemplo. O conselho de passar um valor em vez do tipo de preço é que desta forma você pode aplicar um tema a qualquer valor (não precisa ser um tema de um preço, pode ser tema de outro indicador, por exemplo)

lukibest:
Witam

Jeszcze raz bo cos sie zle wkleilo. Jak przekazac wartosc funkcji Tema do Var1. Jak robie tak jak w kodzie ponizej to Var1 é puste.

[PHP].

#janela_do_cartão_indicador de propriedade

#property indicator_buffers 1

#Indicador de propriedade_color1 DarkBlue

#largura_do_indicador de propriedade1 2

//---- parâmetros de entrada

período EMA_period=4;

//---- buffers

txt. de corda;

duplo TemaBuffer[];

duplo Ema[];

duplo EmaOfEma[];

duplo EmaOfEmaOfEma[];

duplo Var1;

int Var2;

int i,limit,limit2,limit3;

int exterior Aplicar_ao_Preço=1;

//+------------------------------------------------------------------+

//| Função de inicialização do indicador personalizado |

//+------------------------------------------------------------------+

int init()

{

//---- indicadores

IndicatorBuffers(5);

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,Var1);

SetIndexBuffer(1,TemaBuffer);

SetIndexBuffer(2,Ema);

SetIndexBuffer(3,EmaOfEma);

SetIndexBuffer(4,EmaOfEmaOfEma);

IndicatorShortName("TEMA("+EMA_periodo+")");

switch(Apply_To_Price)

{

caso 1:

{txt="Abrir";intervalo;}

caso 2:

{txt="Alto";pausa;}

caso 3:

{txt="Baixo"; pausa;}

caso 4:

{txt="Mediano"; pausa;}

caso 5:

{txt="Típico"; pausa;}

caso 6:

{txt="WghtdClose"; pausa;}

padrão:

{txt="Close";}

}

//----

retorno(0);

}

//+------------------------------------------------------------------+

//| Função de desinicialização de indicador personalizada |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

retorno(0);

}

//+------------------------------------------------------------------+

//| Função de iteração de indicador personalizada |

//+------------------------------------------------------------------+

int start()

{

//----

int counted_bars=IndicatorCounted();

se (counted_bars==0)

{

limit=Bars-1;

limit2=limit-EMA_periodo;

limit3=limite2-EMA_periodo;

}

se (contado_barras>0)

{

limit=Bars-counted_bars-1;

limit2=limite;

limite3=limite2;

}

para (i=limit3;i>=0;i--)

{

Var1 = Tema(Apply_To_Price,4); //=======================TUTAJ JEST PROBLEM W VAR1 NIC NIE MA. DLACZEGO?

// Alerta(Var1);

}

Var2 = dodawanie (2,3);

retorno(0);

}

duplo Tema(int Cena, int cykl)

{

//----

para (i=limite;i>=0;i--) Ema=iMA(NULL,0,cykl,0,MODE_EMA,Cena,i);

para (i=limit;i>=0;i--) EmaOfEma=iMAOnArray(Ema,0,cykl,0,MODE_EMA,i);

para (i=limit3;i>=0;i--) EmaOfEmaOfEma=iMAOnArray(EmaOfEma,0,cykl,0,MODE_EMA,i);

for (i=limit3;i>=0;i--)

{

TemaBuffer=3*Ema-3*EmaOfEma+EmaOfEmaOfEma;

//Alerta(TemaBuffer);

}

retorno(TemaBuffer);

}

int dodawanie (int a, int b)

{

int c;

c=a+b;

return(c);

}

Arquivos anexados:
tema.mq4  3 kb
 

Ajuda com o código HAMMER, por favor

Olá,

Estou começando de novo em mql4. Tentando colher martelos pretos e brancos em castiçais com o seguinte indicador. Entretanto, na tabela, às vezes os castiçais recebem um texto de identificação errado (vela de martelo branca é identificada como vela de martelo preta e vice versa). Por favor, ajude-me com esta situação, obrigado antecipadamente.

#janela_do_indicador de propriedade

limite int;

//---- buffers

martelo de corda[200000];

//+------------------------------------------------------------------+

//| Função de inicialização do indicador CuStom |

//+------------------------------------------------------------------+

int init()

{

retorno(0);

}

//+------------------------------------------------------------------+

//| Função de desinicialização do indicador CuStor |

//+------------------------------------------------------------------+

int deinit()

{

//----

ObjetosDeleteAll(martelo,OBJ_TEXT);

//----

retorno(0);

}

//+------------------------------------------------------------------+

//| Função de iteração do indicador CuStom |

//+------------------------------------------------------------------+

int start()

{

int N;

int N1;

int N2;

texto de seqüência de caracteres;

int counted_bars=IndicatorCounted();

limit=Bars-counted_bars;

for(N = 1; N < limite; N++) {

martelo[N]= CharToStr(N);

N1 = N + 1;

N2 = N + 2;

//----

//---- verificar possíveis erros

if(counted_bars<0) {

Alerta ("SEM Barras...");

retorno(-1);

}

// Verificação de Martelo Branco

if (((Fechar[N1]>Abrir[N1]) && ((Abrir[N1]-Baixar[N1])>=2*(Fechar[N1]-Abrir[N1]) && ((Alto[N1]-Fechar[N1])<=(Abrir[N1]-Baixar[N1])*0.10))) {

ObjectCreate(martelo[N], OBJ_TEXT, 0, Tempo[N1], Baixo[N1] - Ponto);

ObjectSetText(martelo[N], "WHmr", 9, "Times New Roman", LawnGreen);

}

// Verificação de Martelo Preto

if (((Close[N1]=2*(Open[N1]-Close[N1])) && ((High[N1]-Open[N1])<=(Close[N1]-Low[N1])*0.10))) {

ObjectCreate(martelo[N], OBJ_TEXT, 0, Tempo[N1], Baixo[N1] - Ponto);

ObjectSetText(martelo[N], "BHmr", 9, "Times New Roman", LawnGreen);

}

//----

} // Fim do laço

retorno(0);

}

//+------------------------------------------------------------------+

 
svezir:
Olá,

Estou começando de novo em mql4. Tentando colher martelos pretos e brancos em castiçais com o seguinte indicador. Entretanto, na tabela, às vezes os castiçais recebem um texto de identificação errado (vela de martelo branca é identificada como vela de martelo preta e vice versa). Por favor, ajude-me com esta situação, obrigado antecipadamente.

#janela_do_indicador de propriedade

limite int;

//---- buffers

martelo de corda[200000];

//+------------------------------------------------------------------+

//| Função de inicialização do indicador CuStom |

//+------------------------------------------------------------------+

int init()

{

retorno(0);

}

//+------------------------------------------------------------------+

//| Função de desinicialização do indicador CuStor |

//+------------------------------------------------------------------+

int deinit()

{

//----

ObjetosDeleteAll(martelo,OBJ_TEXT);

//----

retorno(0);

}

//+------------------------------------------------------------------+

//| Função de iteração do indicador CuStom |

//+------------------------------------------------------------------+

int start()

{

int N;

int N1;

int N2;

texto de seqüência de caracteres;

int counted_bars=IndicatorCounted();

limit=Bars-counted_bars;

for(N = 1; N < limite; N++) {

martelo[N]= CharToStr(N);

N1 = N + 1;

N2 = N + 2;

//----

//---- verificar possíveis erros

if(counted_bars<0) {

Alerta("SEM Barras...");

retorno(-1);

}

// Verificação de Martelo Branco

if (((Fechar[N1]>Abrir[N1]) && ((Abrir[N1]-Baixar[N1])>=2*(Fechar[N1]-Abrir[N1]) && ((Alto[N1]-Fechar[N1])<=(Abrir[N1]-Baixar[N1])*0.10))) {

ObjectCreate(martelo[N], OBJ_TEXT, 0, Tempo[N1], Baixo[N1] - Ponto);

ObjectSetText(martelo[N], "WHmr", 9, "Times New Roman", LawnGreen);

}

// Verificação de Martelo Preto

if (((Close[N1]=2*(Open[N1]-Close[N1])) && ((High[N1]-Open[N1])<=(Close[N1]-Low[N1])*0.10))) {

ObjectCreate(martelo[N], OBJ_TEXT, 0, Tempo[N1], Baixo[N1] - Ponto);

ObjectSetText(martelo[N], "BHmr", 9, "Times New Roman", LawnGreen);

}

//----

} // Fim do laço

retorno(0);

}

//+------------------------------------------------------------------+

Olá Svezir,

Tenha este indicador de padrões de vela talvez ele ajude.

Arquivos anexados: