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 207

 

Olá a todos. Precisa de alguma ajuda.

No meu EA, ele abre uma série de ordens no número especificado no parâmetro MaxOrders. Abaixo eu dei um exemplo do que isto parece, não julgue por lotes

1-order-lot=128

2-lotes de pedidos=256

3-lot-order=512

Lote de 4 pedidos=1024

5-order-lot=2048

isto é o que você precisa para seu testador.

MaxOrders=5, e 5 pedidos estão abertos. O problema é que no testador do corretor, o lote limitado a 1000 é de 4 e 5 pedidos não serão abertos conforme necessário.

Procurei na Internet uma maneira de mudar este parâmetro no Testador de Estratégia, não consegui descobrir como fazê-lo.

Assim, decidi resolver este problema utilizando programação. Decidi abrir vários pedidos para 4 pedidos e receber dois

Lote de 4 pedidos=1000

Lote de 4 pedidos=24

para 5 pedidos 3:

5-order-lot=1000

5-order-lot=1000

5-order-lot=48

mas há dois problemas,

- como dividir o MM corretamente para que ele se divida em lotes de acordo com o lote máximo

- Como abrir pedidos adicionais sem perturbar o pedido, ou seja, haverá mais pedidos do que no maxOrders, mas não considere os pedidos adicionais que são abertos para manter o volume.

 
solnce600:

Alexei! Boa tarde!

Nossa comunicação não sai da minha cabeça...... e aqui está o porquê.....

Ouvi mais de uma vez comentários sobre a ausência de lógica em minha codificação.

Ontem você me explicou que isso significa álgebra booleana. Este assunto é muito amplo e muito profundo.

O fato é que eu não sou matemático e certamente não sou algébrico.

Eu entendo algumas coisas matemáticas não tão complicadas.... , mas não de uma só vez e coisas complexas que meu cérebro não percebe de todo.

Há mais de seis meses, antes de começar a estudar o manual de programação MCL, eu estava me perguntando

se eu poderia entendê-lo sem capacidade matemática.

Mas o Sr. Kozlov, no prefácio de seu livro didático, disse que na verdade é muito mais simples do que parece à primeira vista.

à primeira vista.

E de fato 60-70% de seu tutorial eu acho que agora sou capaz de entender (provavelmente não é a primeira vez) e como resultado eu já posso codificar algo.

Até ontem me parecia que todos os cálculos matemáticos complexos (que eu não consigo entender) fazem o programa, e eu só preciso saber as regras pelas quais

o programa funciona e faz os cálculos.

Mas nossa conversa de ontem me levou à idéia de que se eu não aprender álgebra booleana, meus códigos estarão ausentes da lógica.

Se meus códigos não tiverem lógica booleana, meus programas não funcionarão corretamente, ou não funcionarão em absoluto.

Mas ontem dei uma olhada na Wikipédia e percebi - álgebra booleana e provavelmente lógica - não é para minha mente!

Ontem você rapidamente deduziu de um olhar superficial a um fragmento do meu código que lhe falta lógica booleana.

Se você não se importa, poderia explicar um curso de seu raciocínio, que precedeu sua conclusão sobre a ausência de lógica neste fragmento.

Se eu entender, eu seguirei em frente. Se eu não entender..... provavelmente concluirei que a programação é algo que excede em muito minhas habilidades.

Obrigado.

se (ot==0)
se (Bid==Preço)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))
if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

Andrei, não é assim tão trágico! Basta usar o que você entende! Tudo o resto virá a tempo!

Por exemplo, após ter verificado o fechamento parando de usar a função Kim, você deve introduzir uma variável adicional Lotes e antes de abrir uma nova posição com um lote dobrado você deve escrever a seguinte linha: Lotes = Lote*2.0 e isso é tudo! E você coloca um lote normal, onde não precisa dobrar!

Por que você precisa de códigos complexos para coisas simples? Para o bem da ciência, para que ninguém pudesse entendê-los? Uma espécie de proteção contra o "plágio"!

 
borilunad:

Andrei, não é assim tão trágico! Basta usar o que você entende! Tudo o resto virá a seu tempo!

Por exemplo, tendo verificado o fechamento por parada, você deve introduzir uma variável adicional Lotes, e antes de abrir uma nova posição com um lote dobrado, você deve escrever a seguinte linha: Lotes = Lote*2.0 e isso é tudo! E você coloca um lote normal, onde não precisa dobrar!

Por que você precisa de códigos complexos para coisas simples? Para o bem da ciência, para que ninguém pudesse entendê-los? Uma espécie de proteção contra o "plágio"!

Boris! Obrigado pelo incentivo. Você me acalmou um pouco....

Mas ainda sofro com repetidas observações sobre a falta de lógica em meus códigos.

E o que me irrita acima de tudo é que não consigo entender exatamente do que estou falando.

Parece-me que a ausência da lógica booleana em código é importante.

Mas como posso saber se existe ou não?

Alexey me disse que eu poderia ter problemas por causa deste fragmento (embora o testador esteja bem).

se (ot==0)

se (Bid==Preço)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

No caso de um erro de codificação, tudo está claro - ou o MetaEditor me dirá ou o Terminal Log.

E se me falta lógica ......., como posso saber disso? Somente com uma dica de companheiros mais experientes.

Mas mesmo depois de sua solicitação, não entendo exatamente do que se trata.

Estudar álgebra booleana é irreal para mim.

 

Esqueça essa álgebra booleana e não fale mais nisso.

Uma anedota:

Um professor psiquiatra visitou um hospital para os doentes mentais e perguntou ao médico chefe como eles determinam se um paciente se recuperou ou se ainda está doente.

- Enchemos a banheira com água, colocamos uma xícara de chá com uma colher na borda e oferecemos ao paciente para retirar a água.

- Temos que assumir que se o paciente está bem, ele pega o copo e não a colher?

- Se o paciente estiver saudável, ele puxa a rolha na banheira.

* * *

Você deve ser capaz de responder sua própria pergunta sobre se as ações que você está tentando fazer em código são razoáveis, e não é uma pergunta tão difícil.

Abrir[1]-Fechar[1] pode ser negativo. Portanto, para o caso de Close>Open existe uma opção, para o caso de Close<Open existe outra opção. Ou você deve calcular o tamanho do corpo para que ele não dependa da direção da vela.

 
solnce600:

Boris, obrigado por seu apoio, você me acalmou um pouco...

Mas ainda assim, me disseram repetidamente que não há lógica em meus códigos.

E o que mais me irrita é que eu não consigo entender exatamente do que estou falando.

Parece-me que a ausência da lógica booleana em código é importante.

Mas como posso saber se existe um ou não?

Alexey me disse que ele está ausente neste fragmento e que eu posso ter problemas por causa deste fragmento (embora o testador esteja bem).

se (ot==0)

se (Bid==Preço)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

Em caso de erro na codificação, tudo fica claro - ou o MetaEditor me dirá ou o Terminal Log.

Mas se me falta lógica ......., como posso saber disso? Apenas com uma dica de colegas mais experientes.

Mas mesmo depois de sua solicitação, não entendo do que estou falando.

Aprender álgebra booleana é irreal para mim.

"Primeiro, vou tornar seu código legível, remover parênteses e condições desnecessárias, e então você pode me dizer porque você precisa dessas condições!

if (ot==0)                    //если Buy, значит эти условия для закрытия или модификации?!

if (Bid==Price)               //это не будет работать на Реале! 
                              //Надо так: (Bid>=Price) или (Bid<=Price) в зависимости от направления
if(Open[1]-Close[1]>100*Point && Open[1]-Close[1]<120*Point)
if(High[1]-Open[1]>40*Point && High[1]-Open[1]<60*Point)  

if(Close[1]-Low[1]>40*Point && Close[1]-Low[1])<60*Point) 

 
borilunad:

"Primeiro vou tornar seu código legível, remover parênteses e condições desnecessárias, e depois você me diz porque precisa dessas condições!

Estou lhes dizendo porque preciso destas condições desnecessárias.

Preciso das condições que você enviou ao forno, para que o programa calcule os parâmetros específicos da vela com uma folga de 1 ponto.

Ou seja, um candelabro de baixa com um tamanho específico de seu corpo, com um tamanho específico entre os preços aberto e baixo, com o tamanho específico da distância entre os preços baixo e fechado.

Entendo que para este fim, se não estou enganado, você também pode usar NormalizeDouble (MathAbs ()), mas não notei uma diferença entre esta versão e a que eu usei.

 
solnce600:

Estou lhe dizendo para que preciso dessas condições extras.

As condições que você me enviou ao forno, eu preciso do programa para calcular os parâmetros específicos da vela +, - 1 ponto.

Ou seja, um candelabro de baixa com um tamanho específico de seu corpo, com um tamanho específico entre os preços aberto e baixo, com o tamanho específico da distância entre o preço baixo e o preço fechado.

Entendo que para este fim, se não estou enganado, você também pode usar NormalizeDouble (MathAbs ()), mas não notei uma diferença entre esta versão e a que eu usei.

Então veja acima, corrigido!
 
Integer:

Esqueça essa álgebra booleana e não fale mais nisso.

Uma anedota:

Um psiquiatra visitou um hospital para os doentes mentais e perguntou ao médico chefe como eles determinam se um paciente se recuperou ou se ainda está doente.

- Enchemos a banheira com água, colocamos uma xícara de chá com uma colher na borda e oferecemos ao paciente para retirar a água.

- Temos que assumir que se o paciente está bem, ele pega o copo e não a colher?

- Se o paciente estiver saudável, ele puxa a tomada na banheira.

* * *

Você deve ser capaz de responder sua própria pergunta sobre se as ações que você está tentando fazer em código são razoáveis, e não é uma pergunta tão difícil.

Abrir[1]-Fechar[1] pode ser negativo. Portanto, para o caso de Close>Open existe uma opção, para o caso de Close<Open existe outra opção. Ou você deve calcular o tamanho do corpo para que ele não dependa da direção da vela.

Obrigado pela anedota..... a partir de agora vou tentar pensar apenas na tomada.

Mas mesmo assim... quando pessoas respeitáveis deste ramo dizem repetida e simultaneamente sobre a ausência de lógica em meu código.... como acontece mais tarde Álgebra booleana - significa cuspir com a autoridade de profissionais sérios deste ramo..... eu não me levantarei imediatamente.... e posso não me levantar..... eu ainda não tentei.

 
borilunad:
Então veja acima, corrigido!

Então eu tinha um monte de parênteses extras? Eles são nocivos?!

Bem, se o compilador não me deu um erro quando eu entrei nestes parênteses .... eu achei que tudo estava bem.

Eu pensava até recentemente que se o compilador não reclamasse e a EA trabalhasse no Testador de Estratégia de acordo com seu código, então estava tudo bem.

Parece que não é bem assim.....

 
solnce600:

Boris, obrigado por seu apoio, você me acalmou um pouco...

Mas ainda assim, me disseram repetidamente que não há lógica em meus códigos.

E o que mais me irrita é que eu não consigo entender exatamente do que estou falando.

Parece-me que a ausência da lógica booleana em código é importante.

Mas como posso saber se existe um ou não?

Alexey me disse que ele está ausente neste fragmento e que eu posso ter problemas por causa deste fragmento (embora o testador esteja bem).

se (ot==0)

if (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

Em caso de erro na codificação, tudo fica claro - ou o MetaEditor me dirá ou o Log do Terminal.

Mas se me falta lógica ......., como posso saber disso? Apenas com uma dica de colegas mais experientes.

Mas mesmo depois de sua solicitação, não entendo do que estou falando.

Estudar álgebra booleana é irreal para mim.


Não é preciso ser um especialista em álgebra booleana para dizer os termos claramente...

Deixe-me tornar as coisas um pouco mais fáceis para você... Substituir se pelo habitual se, caso contrário, por && com e, ||| com ou , etc... Então você poderá ler em suas próprias palavras normais o que está escrito ou decidir o que você quer escrever.

O que você escreveu (vamos pular a descrição incorreta das condições por enquanto):

1. se (ot==0) Se não houver ordens de mercado (nem ordens de mercado, nem pendentes, nem abertas por esta EA, outra EA ou manualmente)... Se sim, então a linha 2 é executada, se não, então vamos para a linha 3.

2. Se (Bid==Preço) Se o preço for igual ao preço de abertura da vela atual... Se for, então a linha 3 é executada, se não, então vamos para a linha 4.

3. if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point)) Se o preço aberto da primeira vela for superior ao preço fechado da primeira vela em mais de 100 pontos e menos de 120 pontos... Se for, vá para a linha 4, se não for, vá para a linha 5.

4. if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point)) Se o alto da primeira vela for superior ao preço aberto da primeira vela em mais de 40 pontos e menos de 60 pontos... Se for, então executamos a linha 5, se não, vamos para a linha 6.

5. if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point)) Se o fechamento da primeira vela for mais alto que o baixo da primeira vela por mais de 40 pontos e menos de 60 pontos. Se for, então a linha 6 é executada, se não, vá para a linha 7.

6.

7.

Como você pode ver nesta decomposição, ou você tem todas as linhas de código executadas uma após a outra (no caso de cada linha retornar verdadeira), ou você pula a linha que vem após a linha que retorna falsa.

Para evitar confusões em seus próprios termos e para compor corretamente sua lógica, inclua todas as afirmações em chaves de fendas, independentemente de uma única linha dever ser executada após o valor da verdade, ou um bloco inteiro.

Por exemplo:

if (ot==0) {
   if (Bid==Price) {
      // сюда можно вписать целый блок, который будет исполняться лишь при одном условии, что bid==Price
      // только вот вряд ли он когда-либо исполнится в реале
      }
   }
Portanto, tente decompor seu código em componentes, removendo parênteses extras, que são desnecessários neste caso...
Razão: