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

 
sss2019:

Diga-me como escrever um EA sobre esta condição:

Há três pares de moedas nos quais a EA abrirá negócios e a EA é anexada a apenas um gráfico e nos outros dois ela trabalha por si só, em geral, com várias moedas.

A segunda condição é quando o preço atinge um certo nível em qualquer um dos pares de moedas, um acordo é aberto. Apenas um negócio pode ser aberto de cada vez.

Assim que o negócio for fechado, o Expert Advisor pode reabrir o negócio em qualquer par, se o preço se aproximar.

Eu defini uma variável estática para que, enquanto o valor da variável for falso, os negócios possam ser abertos e assim que a ordem for aberta em qualquer um dos pares, a variável assume o valor verdadeiro. Assim que a ordem é fechada e o for loop não consegue encontrar nenhuma troca, a variável toma o valor falso novamente.

E se, por exemplo, apenas uma negociação deve ser aberta para cada um dos pares, isso significa que cada par tem sua própria variável.

Existe uma solução mais racional para este problema?


Há um parâmetro como "Magik" na ordem - basta contar as ordens com um determinado Magik e permitir ou proibir o comércio.
 

Como fechar os pedidos corretamente e como coletar informações sobre eles?

Desculpe por perguntas estúpidas de antemão) Eu escrevi o seguinte algoritmo: Eu quero abrir uma posição de compra quando a abertura é inferior ao fractal para cima e o fechamento é superior ao fractal para cima, e uma posição de venda quando a abertura é superior ao fractal para baixo e o fechamento é inferior; eu também quero fechar todas as posições se elas ficarem abaixo em 85 pontos ou se a ordem for aberta dentro de 38 velas (const. S).Tenho a sensação de que nada é fechado, apenas ordens fechadas e, em geral, tenho a sensação de que estou lidando com ordens da maneira errada, eu opero incorretamente e depois as fecho da maneira errada)) Por favor, me diga como fechá-las corretamente, para que não deslizem fechadas e onde há erros neste código. Ou pode ser um exemplo de como a nyu anda, na qual todas essas operações são feitas adequadamente. Obrigado antecipadamente por sua ajuda!)


externo int S=38; //número de castiçais, após o qual a posição será fechada
externo int SL=85; // a parada, na qual as posições serão fechadas em qualquer caso
externo int HIGH=0; // em que os extremos de tempo serão pesquisados (5 ou 1 ou 0(D1))
externo int l=1; //número de lotes a comercializar
int massorder[30][30]; // há dados sobre lotes ABERTOS
int numb=1; // o número de el-ta na matriz, que não é open lot
int i=0;
int ticket=0;
int x=0;
double down,up=0;
double highH1,lowH1=0;

int start()

{
if(Hora()>x)
{
searchH1();
up=highH1;
down=lowH1;
i++;
}
//

if(Open[1]<up && Close[1]>up)// se a vela estiver mais baixa na abertura e mais baixa no fechamento do que o nível fractal acima, então
{
ticket=OrderSend(Symbol(),OP_BUY,l,Bid,5,Bid-SL*Point,NULL);
i=0;
savedata(); }
if(Open[1]>down && Close[1]<down)// se a vela estiver mais alta no aberto e mais baixa no fechado do que no fractal para baixo, então
{
ticket=OrderSend(Symbol(),OP_SELLL,l,Ask,5,Ask+SL*Point,NULL);
i=0;
savedata();
}
if(i===S)
{
closeAllticket();
closeAllPos();
}
i++;
//

x=Hora();
if(Hora()==23)
x=-1;
return(0); }
//+
+
void closeAllticket()
{
for(int j=0;j<=numb;j+++) {
OrderClose(massorder[j][0],l,Ask,5);
OrderClose(massorder[j][0],l,Bid,5);
}
numb=0;
}
fechamentoVálidoeAllPos()
{

for(int j=0;j<=OrdensTotal();j++)
{
OrderSelect(j,SELECT_BY_POS);
OrderClose(OrderTicket(),l,Ask,5);
OrderClose(OrderTicket(),l,Bid,5);
}

void searchH1()//function to find the fractal
{
if(iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,1) &&& iHigh(Símbolo(),PERÍODO_H1,3)>iHigh(Símbolo(),PERÍODO_H1,4) && iHigh(Símbolo(),PERÍODO_H1,3)>iHigh(Símbolo(),PERÍODO_H1,5))
highH1=iHigh(Símbolo(),PERÍODO_H1,3)

if(iHigh(Symbol(),PERÍODO_H1,3)<iHigh(Symbol(),PERÍODO_H1,2) && iHigh(Symbol(),PERÍODO_H1,3)<iHigh(Symbol(),PERÍODO_H1,1) && iHigh(Symbol(),PERÍODO_H1,3)<iHigh(Symbol(),PERÍODO_H1,4) && iHigh(Symbol(),PERÍODO_H1,3)<iHigh(Symbol(),PERÍODO_H1,5))
lowH1=iHigh(Symbol(),PERÍODO_H1,3);
return (0);

}

void savedata() //program para salvar dados na matriz
{

OrderSelect(ticket,SELECT_BY_TICKET);
massorder[numb][0]=OrderTicket();
massorder[numb][1]=OrderOpenPrice();
massorder[numb][2]=OrderStopLoss();
massorder[numb][3]=OrderTakeProfit();
if(OrderType()==OP_BUY)
massorder[numb][4]=0;
if(OrderType()==OP_SELLL)
massorder[numb][4]=1;
numb++;

}
 
Qwertee:

Como fechar os pedidos corretamente e como coletar informações sobre eles?

Desculpe por perguntas estúpidas de antemão) Eu escrevi o seguinte algoritmo: Eu quero abrir uma posição de compra quando a abertura é inferior ao fractal para cima e o fechamento é superior ao fractal para cima, e uma posição de venda quando a abertura é superior ao fractal para baixo e o fechamento é inferior; eu também quero fechar todas as posições se elas ficarem abaixo em 85 pontos ou se a ordem for aberta dentro de 38 velas (const. S).Tenho a sensação de que nada é fechado, apenas ordens fechadas e, em geral, tenho a sensação de que estou lidando com ordens da maneira errada, eu opero incorretamente e depois as fecho da maneira errada)) Por favor, me diga como fechá-las corretamente, para que não deslizem fechadas e onde há erros neste código. Ou pode ser um exemplo de como a nyu anda, na qual todas essas operações são feitas adequadamente. Obrigado antecipadamente por sua ajuda!)


Em variáveis globais, onde você especificou paradas no início

extern int MagicNumber = 11113;
int cntBuy = 0, cntSell = 0, totalBuy, totalSell;

antes de abrir os pedidos:

           totalBuy = CountTradesBuy();
           totalSell = CountTradesSell();

no sinal para abrir

if((Open[1]<up) && (Close[1]>up) && (totalBuy < 1) && (totalSell < 1))

if((Open[1]>down) && (Close[1]<down) && (totalBuy < 1) && (totalSell < 1))

no final da EA

int CountTradesBuy() {
   int countBuy = 0;
   for (int tradeBuy = OrdersTotal() - 1; tradeBuy >= 0; tradeBuy--) {
      OrderSelect(tradeBuy, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_BUY) countBuy++;
   }
   return (countBuy);
}

int CountTradesSell() {
   int countSell = 0;
   for (int tradeSell = OrdersTotal() - 1; tradeSell >= 0; tradeSell--) {
      OrderSelect(tradeSell, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_SELL) countSell++;
   }
   return (countSell);
}

acho que não me esqueci de nada

 
belck:


nas variáveis globais, onde você especificou as paradas no início

antes da abertura dos pedidos:

no sinal para abrir

no final da EA

como se nada tivesse sido esquecido



coloquei tudo o que você escreveu mas ainda nada mudou por alguma razão. o resultado é o mesmo que era e ainda permanece, as ordens permanecem abertas por um grande período de tempo, e preciso que fechem depois das barras S, o que é isso?????????????????

Arquivos anexados:
ikdgna.mq4  7 kb
 
Qwertee:


coloquei tudo o que você escreveu mas ainda nada mudou. o resultado é como era e como é agora, as ordens ainda estão abertas por muito tempo e preciso que elas fechem depois das barras S, qual é o acordo?????????????????

A chamada para fechar os pedidos deve ser feita antes da abertura dos pedidos. Eu os tenho no fechamento:

antes do mais global

#include <stdlib.mqh>


Eu coloquei assim antes de abrir as ordens:

if ()
   {
    CloseAllBuy();
    }
    
       
   if () 
   {
   CloseAllSell();
   }

или

if ()
   {
    CloseAllBuy();
    CloseAllSell();
     }

e isto logo no final da EA

void CloseAllBuy()
{
        int i;
        int Orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(Orders > 0)
        {
                for(i = Orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 60 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера BUY #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

void CloseAllSell()
{
        int i;
        int orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(orders > 0)
        {
                for(i = orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 120 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                   result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера SELL #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

 

Pergunta aos especialistas, há algum critério para EAs, tal como o número mínimo de lotes para um determinado período de tempo do teste? Porcentagem de perda, etc.?

Eu só tenho 2 EAs, e eles fazem 100 negócios por ano, e outro faz 30 negócios ao todo... (prazo 15, 30 respectivamente). A rentabilidade é boa, a primeira está em uma demonstração sobre citações reais, agora está sendo testada ... mas alguém pode me dizer se há uma melhor ... Mas talvez alguém me diga se há testes melhores do que no MT4?

 
Você pode me dizer como executar uma condição? Temos a condição de abrir uma ordem de compra ao preço atual, assim que o preço atingir 1.2550. Assim, quando o preço é maior ou igual a 1,2550, a ordem é aberta e quando a ordem é aberta, a variável estática bloqueia a abertura de novas ordens, até que a ordem chegue a 0. Assim, assim que a ordem é fechada e não há mais ordens com esta magia, a proibição de abertura é removida e uma nova ordem é aberta, mas o preço já se afastou deste nível há muito tempo. Precisamos do Expert Advisor para abrir ordens de mercado quando o preço atingir este nível, e não as ordens pendentes.
 

Olá a todos os conhecedores))))

Há um indicador que traça uma linha de tendência nos dois últimos fractais, mas ele a desenha após um "fractal não confirmado", ou seja, a segunda barra ainda não se formou após o fractal, mas a linha já foi desenhada. Como fazê-lo desenhar após a segunda barra, mas não após a primeira? O indicador está na aba.

Arquivos anexados:
 
rigc:

Olá a todos os conhecedores))))

Há um indicador que traça uma linha de tendência nos dois últimos fractais, mas ele a desenha após um "fractal não confirmado", ou seja, a segunda barra ainda não se formou após o fractal, mas a linha já foi desenhada. Como fazê-lo desenhar após a segunda barra, mas não após a primeira? O indicador está na aba.


Tente
Arquivos anexados:
 
Figar0:

Tente
não desenhar de todo))))