[Arquivo!] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por ela. Não poderia ir a lugar algum sem você - 2. - página 56

 
Sergstuddek:


(A classe é boa, mas ainda há um problema)))

Eu entendo teoricamente, mas na prática não funciona, você pode olhar para o meu código e me dizer o que está errado

Entendo que esta é uma EA muito simples, mas estou apenas começando minha jornada)))) e já tenho um problema

// A essência do Expert Advisor é que primeiro ele abre o primeiro pedido de compra
// então coloca paradas em duas direções
// em um dos lados como continuação de uma ordem em aberto
// no outro lado mais duas vezes em caso de inversão de gráfico
// as paradas são feitas em relação ao último pedido aberto pelo conselheiro
// com cada nova abertura de uma nova ordem pendente, todas as anteriores são eliminadas
// e novas paradas pendentes já estão abertas em relação a uma nova ordem aberta.


Paradas podem ser entendidas como duas coisas - ordens de parada (Take Profit e Stop Loss) e ordens de parada (Bystop e Sell Stop). O que aqui se entende por "pára" provavelmente só é entendido por você. Por favor, seja preciso com os termos. O computador tem que receber instruções precisas. A descrição também deve ser tão precisa quanto possível
 
drknn:
Paradas podem ser entendidas como duas coisas - ordens de parada (Take Profit e Stop Loss) e ordens de parada (Bystop e Sell Stop). O que aqui se entende por "pára" provavelmente só é entendido por você. Por favor, seja preciso com os termos. Você tem que dar instruções precisas ao computador. A descrição também deve ser tão precisa quanto possível

Sinto muito pela inexatidão, mas as ordens de parada são ordens de parada (Buy Stop and Sell Stop)
 
Sergstuddek:

Peço desculpas pela imprecisão: quero dizer, ordens de parada (Buy Stop e Sell Stop).
void DeleteStopOrders()
{
  int res;
  for(int i=0;i<OrdersTotal();i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
    {
      if(OrderType()==OP_SELLSTOP)
        res=OrderDelete(OrderTicket());
      if(OrderType()==OP_BUYSTOP)
        res=OrderDelete(OrderTicket());
     }
  }
}


Esta função está escrita de forma incorreta. Os pedidos devem ser pesquisados do último para o primeiro na lista de pedidos. Seu método fará com que 1 ordem seja pulada porque depois de apagada, a lista de ordens será movida por suas posições. O laço deve ser organizado da seguinte forma:

for (int i=OrdersTotal()-1;i>=0;i--){

Além disso, se o pedido não for selecionado, você não precisa fazer uma brisa - não precisa sair do ciclo - você precisa descobrir o motivo pelo qual o pedido não é selecionado. Isso é o seguinte:

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
  Print("При выборе ордера № ",i," произошла ошибка № ",GetLastError());

res=OrderDelete(OrderTicket()); - isto também não é correto o suficiente. A função OrderDelete() tem um tipo booleano. E além de dar uma ordem para apagar a ordem, também precisamos lidar com a situação se a ordem não puder ser apagada. Em outras palavras, é assim:

res=OrderDelete(OrderTicket());
if(!res){
  Print("Ордер № ",OrderTicket()," удалить не получилось - ошибка № ",GetLastError());
}

Mais tarde verei o resto.

 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  if (CalculateCurrentOrders1(Symbol())==0)
   OpenBuy();
  if (CalculateCurrentOrders2(Symbol())<=1)
  DeleteStopOrders();
  if (CalculateCurrentOrders2(Symbol())<=1)
   OpenStops();
//----
   return(0);
}

O código da função de início não está escrito corretamente.

Com a primeira função, você soma as ordens de compra e venda. Você precisa contar os pedidos de compra separadamente e os pedidos de venda separadamente. A questão é a seguinte. Se houver 1 ordem de compra no mercado, então a parada de compra deve ser definida com um lote maior. Certo? E se houver uma ordem de venda no mercado, então a parada de compra deve ser definida com um lote normal e a parada de venda com um lote maior. Então, como você detecta qual ordem está aberta no mercado se você soma as ordens de Compra e Venda em uma única função? Tente refazer o código à luz destes fatos.

 

Você pode me dizer como fazer o download automático do histórico a partir do corretor? É um pouco inconveniente pressionar para casa por uma hora.

 
_dude_:

Você pode me dizer como fazer o download automático do histórico a partir do corretor? É um pouco inconveniente pressionar para casa por uma hora.

Vadim Junko se encarregou disso para você. Roteiro para carregar a história. Há mais alguns na base (seção Scripts).
 
gince:

Pergunta sobre o indicador.

O indicador é um indicador cruzado. Atrai muitas flechas para um lado, depois muitas para o outro. Como fazer apenas os primeiros a serem sorteados. Eu tentei da maneira descrita no código, mas as setas mudam quando eu troco de Quadro.

Por favor, informe como fazê-lo corretamente.


Eu teria que olhar para o indicador. Talvez haja uma solução
 
nemo811:
Por favor, ajude-me a corrigir meu Consultor Especialista. Você precisa fazer com que funcione com pedidos (próprios e abertos pelo usuário) do par de moedas no gráfico do qual ele está instalado. Referimo-nos ao momento da fixação do lucro ou do prejuízo. Na versão atual, quando ocorre uma condição (captura de um depósito %), ele tenta fechar todas as posições (com MAGIC=0) para todos os pares de moedas e eu não preciso dele. É necessário delimitar completamente todos os pares de moedas. Meus agradecimentos de antemão.

A mesma coisa que você tem que fazer em quadros de mensagens diferentes - isto é spam, e você pode obter uma proibição.
 
Vinin:

E escrever a mesma coisa em linhas diferentes - é spam e pode obter uma proibição

Peço desculpas - como sempre quero fazer tudo de uma só vez))
 

Obrigado por sua atenção e compreensão ))

Foi capaz de resolver o problema sozinho:

Inseriu uma linha complicada se (OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC) continuar;

para um lugar igualmente complicado. Depois disso, tudo funcionou como pretendido.

Obrigado pela dica com o mágico. Eu não sou um programador, então às vezes e não penso em algo por falta de conhecimento.

Razão: