[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 271

 
hoz:

Eu entendo o que está lá. Mas não está claro por que é implementado desta forma.

Cada função individual da biblioteca é parte do todo, e uma biblioteca individual é parte de todo o complexo de minhas bibliotecas - sem esta consciência é impossível entender o código.

hoz:

Você não pode usar suas bibliotecas em sua forma original de qualquer maneira, ou seja, você tem tudo amarrado ali. Cada função na embalagem de outras...

E é aí que você está errado. Você já pensou sobre a estrutura da EA "média"? O que torna um indivíduo da EA são as condições estratégicas (isto é, condições de entrada/saída), e tudo o mais é código padrão. A maneira como eu crio EAs, incluindo aqueles baseados em ordens: pego um modelo (por exemplo, SAR, se uma EA de rede for necessária) e conecto a ele uma biblioteca adicional na qual são escritas as condições de uma nova estratégia (eu a recrio).

hoz:

Eu não queria verificar de forma alguma. Mais ainda, não há dúvida de que tudo é escrito de forma muito competente. Eu simplesmente não entendo tudo, então eu disse que não penso assim. Eu olho, eu acho... Mas eu não entendo tudo. Foi por isso que eu perguntei.

P.S. Com bs_Symbol eu ainda não entendi.

Para entender a implementação, é preciso entender os dados da fonte. As bibliotecas foram criadas com a capacidade de trabalhar com qualquer instrumento (forex) e modos mono e multimoedas, daí a introdução da variável global bs_Symbol, que contém o valor do instrumento atual.
 
IIya:

Amigos! Preciso de ajuda no ajuste de um EA.

Há algum código que abre uma ordem sob certas condições. A execução da condição pode ocorrer a cada tique porque é colocada no corpo do int start().

Nós precisamos:

1. Após a execução da condição (e a abertura de uma ordem), pausa para a abertura de novas ordens, pausa para n barras. Por exemplo, se a EA estiver no prazo M30 e eu precisar fazer uma pausa de 3 horas, a pausa deve ser de 6 barras.

2. Este programa deve funcionar no testador de estratégias.

Que código é necessário? E qual seria o lugar certo para colocá-lo.

A função iBarShift() o ajudará. Primeiro, você precisa descobrir a hora da última abertura da ordem e passá-la para esta função, e depois monitorar o valor retornado por esta função, comparando-a com algum número (no seu caso 6).
 
TarasBY:
A função iBarShift() irá ajudá-lo. Primeiro, você precisa descobrir a hora da última abertura da ordem e passá-la para esta função, e depois monitorar o valor retornado por esta função, comparando-a com algum número (no seu caso, 6).

Vamos resolver isso juntos )

Passamos o tempo da última abertura de ordem para esta função e obtemos o número devolvido. Isto é aproximadamente:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 

Ok, temos o número do bar. Agora, como parar para abrir pedidos de 6 barras?

 
IIya:

Vamos resolver isso juntos )

Passamos o tempo da última abertura da ordem para a função, e obter o número devolvido é aproximadamente:

Ok, temos o número do bar. Agora, como parar para abrir pedidos de 6 barras?

Esta é uma abordagem analfabeta:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

Mas como não é diretamente relevante para este caso, nós simplesmente não nos concentramos nele. O esquema é parecido com este:

    if (my_bar >= 6)
    {
        OrderSend();
    }
 
TarasBY:
Não há erros óbvios na lógica. Imprima o código passo a passo. O procedimento comercial está vinculado ao valor da variável bilhete. Antes de mais nada, monitorar suas mudanças. Preste também atenção ao valor da variável global "TRADECONTEXT" - seu valor deve ser 0.

Obrigado! Eu simplesmente não entendo nada((((, sou como um gatinho cego nestes códigos(((...
 
al7bar:

Obrigado! Mas eu não entendo nada(((, sou como um gatinho cego nestes códigos(((...
Acontece que você não é o autor deste código. Então é mais fácil entrar em contato com o autor.
 
TarasBY:

Cada função individual da biblioteca é parte do todo, e cada biblioteca individual faz parte de todo o complexo de minhas bibliotecas - sem esta consciência é impossível entender o código.

Estou tentando entender isso e estou me deparando com todos os tipos de nuances. É por isso que estou lhe perguntando, porque você é quem melhor sabe. Você é o autor...

TarasBY:

E é aí que você está errado. Você já pensou sobre a estrutura do Expert Advisor "médio"? As condições da estratégia (isto é, condições de entrada/saída) tornam uma EA individual, e tudo mais é código padrão. A forma como crio Expert Advisors, incluindo aqueles baseados em ordens: pego um modelo (por exemplo, SAR, se uma EA de rede for necessária) e conecto a ele uma biblioteca adicional na qual estão escritas as novas condições da estratégia (eu a recrio).

Eu entendo isso. Eu simplesmente não quero copiar a biblioteca inteira. Você entende que é mais conveniente criar uma fundação, com a qual será conveniente trabalhar pessoalmente.

TarasBY:

Para entender a implementação, é preciso entender os dados iniciais. As bibliotecas foram criadas com a possibilidade de trabalhar com qualquer ferramenta (Forex) e tanto no modo mono como multicurrency, daí a introdução da variável global bs_Symbol, que contém o valor do símbolo atual.

E onde esta variável é definida explicitamente, se não for um segredo? :) Vejo na bibliotecab-PSI@Base.mqh que ela é apenas declarada:

 bs_Symbol,                            // текущий инструмент

Mas, na verdade, não há nada mais. De qualquer forma, o valor da ferramenta atual é retornado por padrão através de Symbol(). Então, por que precisamos de uma variável aqui?

 
TarasBY:

Esta é uma abordagem analfabeta:

Mas, como não é diretamente relevante para este caso, nós simplesmente não nos concentramos nele. E o padrão é parecido com este:

Agora nosso código funciona. Em minha versão, ele funciona assim:
int start()
  {
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
   int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 
   if (my_bar > 6)                                                     //если прошло 6 баров с момента открытия последнего ордера
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);      //открываем новый ордер
      }
   return(0);
  }

:) Mas se for introduzido no Expert Advisor como está agora, tudo começa a funcionar de forma incorreta.

Tanto quanto eu entendo, é devido a esta entrada:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

O que está errado?

 
Olá a todos. por favor, respondam a todos que podem criar um roteiro que aumente os lotes na abertura da transação. detalhes escrevam em uma garantia de remuneração pessoal na satisfação da tarefa
 
IIya:
Agora nosso código funciona. Em minha versão, ele funciona assim:

:) Exceto que se for implementado no EA como está agora, tudo começa a funcionar de forma incorreta.

Eu entendo por causa desta entrada:

O que está errado?

Eu apenas esbocei um esquema, enquanto sua tarefa era pensar sobre a lógica adicional:

int start()
{
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   else
   {
       OrderSelect (OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
       int my_bar = iBarShift (NULL,PERIOD_M30,OrderOpenTime()); 
       if (my_bar >= 6)                                                     //если прошло 6 баров с момента открытия ордера
       {OrderSend (Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);}      //открываем новый ордер
   }
   return(0);
}
Razão: