Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 70

 

Prezados usuários do fórum!

Por favor, ajude, os problemas são os seguintes: 1) Como prescrever no código, para que o negócio, digamos, na VENDA, seja aberto quando o limite superior do canal, e fechado quando chegar ao fundo; 2) Quando um sinal deve abrir somente um negócio; 3) quando instalar a EA, o negócio se abre imediatamente, mas você quer que o negócio seja aberto somente quando a linha do canal for alcançada.

Eu ficaria muito grato por sua ajuda.

Lotes duplos externos = 0,1;
Exterior int TakeProfit = 30; // TakeProfit (um número negativo ou zero para evitar o uso);
StopLoss int externo = 20; // Nível de Stop Loss para compra;
escorregadela externa interna = 2; // escorregadela externa interna = 2; // escorregadela externa
Comentário de cadeia externa = "Keller";
magia interna externa = 333;

cadeia externa Indi = "Dados indicadores";
String externo TimeFrame = " período detempo atual;
externo int int MA_Period = 10; // 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
externo int Modo_MA = 0; // 0 - Fechado, 1 - Aberto, 2 - Alto, 3 - Baixo, 4 - Mediano, 5 - Típico, 6 - Ponderado
Tipo Preço_Tipo_Externo Int = 5;

duplo PriceHigh, PriceLow, SL, TP;
int ticket;
//+------------------------------------------------------------------+
//| função de iniciação de especialista |
//+------------------------------------------------------------------+
int init()
{
se (Dígitos ==3 || Dígitos ==3) // para um corretor de cinco dígitos
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
}
retorno(0);
}
//+------------------------------------------------------------------+
//| função de desinicialização especializada |
//+------------------------------------------------------------------+
int deinit()
{
retorno(0);
}
//+------------------------------------------------------------------+
//| função de início especializado |
//+------------------------------------------------------------------+
int start()
{
PriceHigh = iCustom (Symbol(), 0, "Keller", TimeFrame, MA_Period, Mode_MA, Price_Type, 0, 0); // buffer superior vermelho 0
PriceLow = iCustom (Symbol(), 0, "Tma", TimeFrame, MA_Period, Mode_MA, Price_Type, 2, 0); // buffer inferior vermelho 2

if (Bid >= PriceHigh && CountSell() == 0) // onde Countsell verifica se os pedidos são abertos um a um e não em cada tick
{
SL = NormalizeDouble (Bid + StopLoss * Ponto, Dígitos);
TP = NormalizeDouble (Bid - TakeProfit * Ponto, Dígitos);

bilhete = OrderSend (Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, Comment, Magic, 0, Red); // onde 0 é SL e TP (este é 0 para contas ßn) e o último 0 é uma ação
se (bilhete > 0) // verificar se há um pedido em aberto
{
se (OrderSelect (bilhete, SELECT_BY_TICKET, MODE_TRADES) == verdadeiro)
OrderModify (bilhete, OrderOpenPrice(), SL, TP, 0); // onde 0 é uma expressão
}
}


se (Ask <= PriceLow && CountBuy() == 0)// onde Countsell verifica se os pedidos são abertos um a um, não em cada tick
{
SL = NormalizeDouble (Ask - StopLoss * Ponto, Dígitos);
TP = NormalizeDouble (Ask + TakeProfit * Ponto, Dígitos);

bilhete = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, Comment, Magic, 0, Blue); // onde 0 é SL e TP (este é 0 para contas ßn), e o último 0 é uma ação
se (bilhete > 0) // verificar se há um pedido em aberto
{
se (OrderSelect (bilhete, SELECT_BY_TICKET, MODE_TRADES) == verdadeiro)
OrderModify (bilhete, OrderOpenPrice(), SL, TP, 0); // onde 0 é uma expressão
}
}


se (Bid >= PriceHigh && CountBuy() > 0) // se o preço atingiu o limite superior do canal e o número de pedidos é maior que 0
{
para (int i=OrdensTotal()-1; i >= 0; i--)
{
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== verdadeiro)
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY) // verificar se este é nosso pedido de compra
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black); // fechar a ordem na borda superior do canal
}
}
}
se (Pergunte <= PriceLow && CountSell() > 0) // se o preço atingiu o limite inferior do canal e o número de pedidos é maior que 0
{
para ( i=OrdensTotal()-1; i >= 0; i--) // sem definição de variável para compra
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== verdadeiro)
{
if(OrderMagicNumber() == Magic && OrderType() == OP_SELL) // verifique se esta é nossa ordem de venda
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black); // fechar a ordem na borda inferior do canal
}
}
}

retorno(0);
}

//+------------------------------------------------------------------+
int CountSell()// verificar - número de ordens de venda em andamento
{
int Count = 0;
para (int trade = OrdensTotal() - 1; trade >=0; trade --)
{
OrderSelect (comércio, SELECT_BY_POS, MODE_TRADES);
se (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
se (OrderType() == OP_SELL)
Conta +++;
}
}
retornar(Contar);
}
//+------------------------------------------------------------------+
int CountBuy()// cheque - número de pedidos de compra que estão em andamento
{
int Count = 0;
para (int trade = OrdensTotal() - 1; trade >=0; trade --)
{
OrderSelect (comércio, SELECT_BY_POS, MODE_TRADES);
se (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
se (OrderType() == OP_BUY)
Conta +++;
}
}
retornar(Contar);
}

 
Adicionando uma captura de tela
 
artmedia70:

Não, eles não o fizeram. Dei uma olhada em seu código e respondi "sem olhar". Sua linha:

- atribui ao índice do ciclo i um valor igual ao número total de linhas horizontais. Se você tiver 3 deles, o ciclo será de 2 a 0. Não está claro o que está em seu ciclo, mas haverá apenas três iterações de 2 a 0.


Sim, bem... E era exatamente com isso que eu estava preocupado. A coisa é que, sem experiências especialmente definidas, mas apenas por observação, ele funcionou na presença de outros objetos.

for(int i=ObjectsTotal(OBJ_HLINE)-1; i>=0; i--) 

E, num relance, funcionou corretamente. Mas havia dúvidas sobre o que você descreveu. É por isso que eu queria esclarecer este aspecto.

E estou feliz que suas opiniões confirmaram minha suposição. Podemos considerar que a certeza sobre o assunto é alcançada.

Muito obrigado mais uma vez!

 
bistreevseh:


Tenho um indicador personalizado, é um histograma, todos os valores são máximos, só importa a cor das barras no histograma, não tem parâmetros de entrada, buffers 2 : 0 - com barra vermelha, e 1 - barra azul, descobri pelo método imperial, que em 0 buffer, não muda de valor, e em 1 muda. Como escrever os critérios para a transação que eu não consigo entender, por favor explique como, obrigado antecipadamente.


Se você tiver o código fonte do indicador, não é difícil: você olha para o código fonte e encontra as condições para mudança de cor no indicador. Usando-os, formamos um sinal. Existem 2 maneiras de fazê-lo, a primeira é escrever um "invólucro" para analisar as condições de alteração dos valores de tampão, no qual o código indicador não é alterado, iCustom() é usado, a segunda converte o código indicador em uma função que pode ser chamada do Expert Advisor. Os dois métodos estão descritos nos artigos do site.

Se você estiver interessado, por exemplo, no indicador suavizado Heikin-Ashi, procure no site - para este indicador houve uma discussão, até onde me lembro, tanto a correção do algoritmo quanto a análise do sinal foram discutidas. O código de seu aberto e está disponível na base de código (há muitos deles lá).

Se o indicador é único e não tem código fonte, a questão é muito mais complicada: engenharia reversa, o que, por sinal, nem sempre justifica o esforço.

 
VladislavVG:

Se você tiver o código fonte do indicador, não é difícil: olhe para o código fonte e encontre as condições para mudança de cor no indicador. Usando-os, formamos um sinal. Há duas maneiras de fazê-lo: a primeira - escrevendo um "invólucro" para a análise das condições de alteração dos valores de tampão, o código indicador não é alterado, iCustom() é usado, a segunda - convertendo o código indicador na função que pode ser chamada do Expert Advisor. Os dois métodos estão descritos nos artigos do site.

Se você estiver interessado, por exemplo, no indicador suavizado Heikin-Ashi, procure no site - para este indicador houve uma discussão, até onde me lembro, tanto a correção do algoritmo quanto a análise do sinal foram discutidas. O código de seu aberto e está disponível na base de código (há muitos deles lá).

Se o indicador é único e não tem código fonte, a questão é muito mais complicada: engenharia reversa, o que, por sinal, nem sempre justifica o esforço.


Muito obrigado, vou tentar. Você poderia me ajudar a encontrar artigos sobre "embrulho" e conversão de código indicador, pois receio não poder interpretar isto como uma consulta de busca.
 
Ajude, por favor. O indicador desenha as linhas alta e baixa do dia anterior. Preciso dele para traçar linhas na história todos os dias. Obrigado.
Arquivos anexados:
line.mq4  3 kb
 
prom18:
Ajude, por favor. O indicador desenha as linhas alta e baixa do dia anterior. Preciso dele para traçar linhas na história todos os dias. Obrigado.
Arquivos anexados:
line_1.mq4  3 kb
 
bistreevseh:

Muito obrigado, vou experimentá-lo. Você poderia me ajudar a encontrar artigos no "invólucro" e a transformar o código indicador, pois receio não poder interpretar isto como uma consulta de busca.


https://www.mql5.com/ru/forum/114117 aqui é um exemplo de criação de uma função de invólucro para interpretar sinais indicadores

aqui estão artigos sobre o uso de códigos indicadores:

https://www.mql5.com/ru/articles/1456

https://www.mql5.com/ru/articles/1457

 
Vinin:



Obrigado!
 
VladislavVG:


https://www.mql5.com/ru/forum/114117 aqui é um exemplo de criação de uma função de invólucro para interpretar sinais indicadores

aqui estão artigos sobre o uso de códigos indicadores:

https://www.mql5.com/ru/articles/1456

https://www.mql5.com/ru/articles/1457


Mais uma vez, muito obrigado.
Razão: