Ajuda na codificação - página 242

 
Mastercash:
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

Arquivos anexados:
_test_mc.mq4  3 kb
 
mladen:
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 abertura

EDIT: 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);

}

 
BlackCoq:
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 OpenOrderPrice(double priceToCompareTo, double priceDeviation)

{

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)

 
mladen:
Tente algo assim:
double OpenOrderPrice(double priceToCompareTo, double priceDeviation)

{

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?

 
BlackCoq:
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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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".

 
mladen:
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.

//+------------------------------------------------------------------+//| expert start function |

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

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)

//----
 
BlackCoq:
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.

//+------------------------------------------------------------------+//| expert start function |

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

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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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

 
mladen:
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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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);

}

Deve funcionar corretamente agora

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.

Arquivos anexados:
564.mq4  10 kb
 
sulaimoney:
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

Arquivos anexados:
564_1.mq4  10 kb