Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Alguém pode me dizer o que eu fiz de errado, o código abaixo é 2 EMA cruzado com alertas. Ele se recusa a trabalhar:
#propriedade copyright "wnk
#link da propriedade "www.wnk.com"
#janela_do_cartão_indicador de propriedade
#property indicator_buffers 2
#indicador de propriedade_color1 Lime
#indicador de propriedade_color2 Vermelho
//--- amortecedores
duplo ExtMapBuffer1[];
duplo ExtMapBuffer2[];
//variável externa......
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado |
//+------------------------------------------------------------------+
int init()
{
//---- indicadores
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,217);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexEmptyValue(0,0,0.0);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1.217);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(1,0.0);
//----
retorno(0);
}
//+------------------------------------------------------------------+
//| Função de desinicialização de indicador personalizada |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
retorno(0);
}
//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizada |
//+------------------------------------------------------------------+
int start()
{
data estática hora do LastAlertTime = TimeCurrent();
int counted_bars=IndicatorCounted(),
limite;
if(counted_bars<0)
retorno(-1);
if(counted_bars>0)
barrinhas_contadas..;
limite=barras_contadas_às_barras;
while(limite)
{
duplo ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
duplo ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
duplo b4ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,1);
double b4ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1); double b4ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1);
double mom=iMomentum(NULL,0,14,PRICE_CLOSE,0);
double b4momomentum=iMomentum(NULL,0,14,PRICE_CLOSE,1);
//alertas
if((LastAlertTime!=Time[0])&&(ema5>ema13)&&(ema5>b4ema5)&&(ema13>b4ema13)&&(mom>b4mom)&&(mom>98.6591))
ExtMapBuffer1[limite]=Alto[limite]+5*Ponto;
LastAlertTime = Tempo[0];
Alerta(Símbolo()," ",Período(), "M Preço UP");
//alertas de venda
if((LastAlertTime!=Time[0])&&(ema5<ema13)&&(ema5<b4ema5)&&(ema13<b4ema13)&&(mom<b4mom)&&(mom<100.6872))
ExtMapBuffer2[limite]=Low[limite]-5*Point;
LastAlertTime = Tempo[0];
Alerta(Símbolo()," ",Período(), "M Preço Abaixo");
}
retorno(0);
}
//+------------------------------------------------------------------+Mastercash
Experimente agora
Axel
Isso pode ser feito.
Simplesmente as ordens abertas devem ser escaneadas para o tipo desejado e seus preços abertos devem ser comparados com o novo preço aberto desejado ou as barras em que foram abertas podem ser comparadas com a barra que serve como critério de aberturaEDIT: Parece que eu esqueci de acrescentar a função.
Funcionaria escrever uma função como a abaixo 20 vezes mais ou menos para diferentes "i=OrdensTotal()-1" e depois chamar toda a função e compará-las com o novo preço de abertura?
duplo OpenOrderPrice()
{
duplo TempOrderPrice = 0;
for(int i=OrdensTotal()-1;i>=0;i--)
{
se (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice();
}
}
retorno(TempOrderPrice);
}
EDIT: Parece que eu esqueci de acrescentar a função.
Funcionaria escrever uma função como a abaixo de 20 vezes ou mais para diferentes "i=OrdensTotal()-1" e depois chamar todas as funções e compará-las com o novo preço de abertura?
duplo OpenOrderPrice()
{
duplo TempOrderPrice = 0;
for(int i=OrdensTotal()-1;i>=0;i--)
{
se (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice();
}
}
retorno(TempOrderPrice);
}Tente algo assim:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
BlackCoq
Você tem que passar o preço ao qual deve ser aberto e o desvio máximo (um valor absoluto: por exemplo, não 5 por cinco pontos, mas 5*_Ponto) do preço, e se a diferença for menor ou igual a esse desvio de preço ele retornará o preço da ordem aberta a esse preço aproximado. Caso contrário, ele retornará -1 como resultado (o que significa, nesse caso, que não há ordens com preços semelhantes)
Tente algo assim:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
BlackCoq
Você tem que passar o preço ao qual deve ser aberto e o desvio máximo (um valor absoluto: por exemplo, não 5 por cinco pontos, mas 5*_Ponto) do preço, e se a diferença for menor ou igual a esse desvio de preço ele retornará o preço da ordem aberta a esse preço aproximado. Caso contrário, ele retornará -1 como resultado (o que significa, nesse caso, que não há ordens com preços similares)Portanto, se eu quiser verificar se há alguma ordem em aberto que se desvie 2 pips do preço a que eu quero comprar, eu chamo para esta função:
duplo BuyOpenOrderPrice (preço duploToCompareTo, preço duploDeviation)
{
duplo TempOrderPrice = -1;
for(int i=OrdensTotal()-1;i>=0;i--)
{
se (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
se (MathAbs(OrderOpenPrice()-priceToCompareTo)<= desvio de preço)
TempOrderPrice = OrderOpenPrice();
priceDeviation = 2*Point;
priceToCompareTo = Perguntar;
pausa;
}
}
retorno(TempOrderPrice);
}
E depois fazer outro para os calções?
Portanto, se eu quiser verificar se há alguma ordem em aberto que se desvie 2 pips do preço a que eu quero comprar, eu chamo para esta função:
duplo BuyOpenOrderPrice (preço duploToCompareTo, preço duploDeviation)
{
duplo TempOrderPrice = -1;
for(int i=OrdensTotal()-1;i>=0;i--)
{
se (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
se (MathAbs(OrderOpenPrice()-priceToCompareTo)<= desvio de preço)
TempOrderPrice = OrderOpenPrice();
priceDeviation = 2*Point;
priceToCompareTo = Perguntar;
pausa;
}
}
retorno(TempOrderPrice);
}
E depois fazer outro para os calções?Não
Você chama a função desta forma :
se (OpenOrderPrice(OP_BUY,Ask ,2.0*_Point) == -1) permite longas e
se (OpenOrderPrice(OP_SELL,Ask,2.0*_Point) == -1) permite shorts
A chamada deve ser de sua parte de código onde você tem uma lógica para abrir uma ordem.
Mas então a função tem que ser diferente (assim) :
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
A função cobre ambos os casos agora e você não deve alterar o código com a função.
___________________
PS: _Variável de ponto não existe em construções mais antigas de metatrader 4. O exemplo superior é escrito para o novo metatrader4. Se você usar construções mais antigas (509 ou anteriores) então "_Point" deve ser "Point".
Não
Você chama a função desta forma :
A chamada deve ser de sua parte de código onde você tem uma lógica para abrir uma ordem.
Mas então a função tem que ser diferente (assim) :
A função cobre ambos os casos agora e você não deve alterar o código com a função.
___________________
PS: _Variável de ponto não existe em construções mais antigas de metatrader 4. O exemplo superior é escrito para o novo metatrader4. Se você usar construções mais antigas (509 ou anteriores) então "_Point" deve ser "Point".Obrigado. Copiei a função para a EA e chamei por ela como você escreveu, mas por alguma razão ela abre posições, embora haja outras dentro do desvio do novo preço. Essa função verifica todos os preços abertos, ou apenas o mais recente?
Incluindo a EA abaixo.
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----Obrigado. Copiei a função para a EA e chamei por ela como você escreveu, mas por alguma razão ela abre posições, embora haja outras dentro do desvio do novo preço. Essa função verifica todos os preços abertos, ou apenas o mais recente?
Incluindo a EA abaixo.
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----Há um erro nesse código de função. Presumi que a OrderSelect() funcionava na posição e não a verifiquei. Use este aqui :
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
Ele deve funcionar corretamente agora
Há um erro nesse código de função. Presumi que a OrderSelect() trabalhava na posição e não a verificava. Use este aqui:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
E assim acontece. Mais uma vez obrigado por seu grande trabalho, Mladen.
Olá Mladen ,
Por favor, você poderia dar uma olhada neste código estou tentando selecionar o último pedido e abrir pedidos adicionais com base no último preço aberto. Tudo parece estar funcionando, exceto que
IfOrderDoesNotExist7(); IfOrderDoesNotExist5();
parece estar interferindo um no outro se eu comentar um dos dois como abaixo a ordem vai funcionar bem.
// IfOrderDoesNotExist7();
IfOrderDoesNotExist5();
você pode me dizer o que estou fazendo de errado.
Olá Mladen ,
Por favor, você poderia dar uma olhada neste código estou tentando selecionar o último pedido e abrir pedidos adicionais com base no último preço aberto. Tudo parece estar funcionando, exceto que
IfOrderDoesNotExist7(); IfOrderDoesNotExist5();
parece estar interferindo um no outro se eu comentar um dos dois como abaixo a ordem vai funcionar bem.
// IfOrderDoesNotExist7();
IfOrderDoesNotExist5();
você pode me dizer o que estou fazendo de errado.sulaimoney
Penso que o problema não estava nessas duas funções, mas na forma como o novo metatrader 4 verifica as condições booleanas (se você estivesse usando algumas das novas construções do metatrader 4). Simplificou um pouco o código e resolveu o único lugar onde as condições booleanas precisavam ser estritamente definidas. Experimente-o