[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 37

 
skyjet:

Muito obrigado por sua resposta! Mas ainda assim, como descrever a futura barra após Ask[0],Bid[0]?

Assim que esta futura barra aparecer, ela se tornará zero. E a barra que está agora [0] será [1].


Ask e Bid NÃO são arrays, há apenas um valor atual, todos os anteriores são esquecidos

 

Por favor, ajude-me a entender o cálculo do depósito
porque meu depósito estimado coincide exatamente com o terminal
somente quando todos os pedidos estão totalmente bloqueados
. Quando eu adiciono mais um pedido ao sistema de pedidos - o resultado do depósito
terminal sempre difere muito ligeiramente do meu depósito estimado
, mas eu nunca consigo ser um bala em uma bala!
Aqui está um exemplo muito breve:

A conta tem 4 pedidos de 10,00 lotes cada, dois deles de bicicletas
e dois de vendas. É claro que a conta está em equilíbrio e todas as ordens estão bloqueadas
Calculamos o depósito padrão para cada ordem, dividimo-lo por 4 e tudo está na ponta dos pés
O terminal bate exatamente.

Colocamos mais um byke a 1,00 lote a 1,4059
Calculamos o depósito. É claro que para isso temos que pagar o depósito padrão
uma vez que todas as encomendas existentes estão na caixa.
Para uma alavancagem de 1:100 temos a promessa para a nova bicicleta

ZALBuy = 140,59*1,00 = 140,59

Portanto, o antigo depósito deve ser aumentado neste valor,
Adicione o antigo depósito e o depósito para nosso byte 1,00

ZAL=ZALold + ZALBuy = 1407,23 + 140,59 = 1547,82

Após a colocação do tchau no terminal o depósito acabou sendo 1547,91
Isto seria aceitável se eu tivesse colocado o tchau 9 pontos acima de
à taxa de câmbio 1,4068 Pois se calcularmos o aumento real do depósito
como a diferença do depósito antes e depois, obtemos exatamente o depósito padrão
para 1,00 lote à taxa 1,4068

1547.91 - 1407.23 = 140.6801

A alteração da versão terminal, infelizmente, não ajudou!

-----------------------------------------------

Perdoe-me por tomar seu tempo, mas estas
pequenas discrepâncias constantes realmente me incomodam
porque minha máquina conta diferentes opções,
e o depósito como saldo e lucro é usado para calcular
todos os parâmetros da conta após certas ações antes de serem implementadas
. Portanto, a precisão é muito desejável aqui.
Talvez eu não entenda algo, mas procurei na documentação
e não consegui encontrar a razão desta discrepância.
Eu ficaria muito grato por sua ajuda!


Cumprimentos MADZX
 
keep87:


Você pode esquecer este cenário. A re-citação ocorre se o café quiser levar seu dinheiro, eles não querem saber qual é a lacuna, eles o farão de qualquer forma). Esta é a realidade de algotrading a maioria das empresas fraudulentas que se dizem "o melhor corretor XXXXX" (XXXXXX - inserir nome de um continente ou galáxia, o que quer que seja)

Alterar ou não alterar a configuração, tudo permanece o mesmo.


Absolutamente certo! Eu também já vi isso!
 
skyjet:
Olá! Você pode me dar uma descrição de um bar real +1. Por exemplo, eu preciso do preço do próximo bar, não do atual.

Tanto quanto eu entendo, você está tentando obter informações da máquina do futuro
Se você encontrar uma maneira - compartilhar, eu ficaria grato :)
 
Kobalerro:
Saudações a todos. Eu mesmo sou novo em programação, portanto, por favor, resolva o problema.

É necessário que vários EAs na mesma conta, abram um número limitado de pedidos.

Por exemplo: 10 EAs mas só pode abrir 5 pedidos, mas não mais de um por par de moedas.

Isto foi implementado da seguinte forma, mas não funciona dessa forma.

extern int МаксКолОрдеров   = 5;

//+------------------------------------------------------------------+

int ПодсчетОткрОрдеров() {
  int k=OrdersTotal();
   if (Символ=="0") Символ=Symbol();
    for (int i=МаксКолОрдеров; i<k; i++) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Символ || Символ=="") {
       if (МагикНомер<0 || OrderMagicNumber()==МагикНомер) {
      if (OrderMagicNumber()<1) return(True);
     }
    }
   }
  }
 return;

}

//+------------------------------------------------------------------+
int start()
  {
   if(ПодсчетОткрОрдеров()==0)ПровТоргУсловий();
   }


Eu implementaria tal espetáculo da seguinte forma:
Todos os 10 de seus cavalos estão trabalhando cada um em seu próprio horário, como se em salas adjacentes
e, portanto, nenhum deles sabe o que o vizinho está fazendo atrás do muro - este é o principal problema
para sua idéia!
Portanto, eu instruiria cada EA a escrever suas ações em um arquivo de disco
que estará disponível para todos os cavalos, pois ele está no diretório do terminal .
Se algum deles tem um desejo ardente de fazer algo em sua janela
deve primeiro analisar este arquivo e verificar a possibilidade de implementar
desejo!
em relação ao seu cenário você precisa adicionar no arquivo o número de pedidos
e pares de moedas nos quais eles estão abertos
. Por exemplo:
EURUSD 1
GBPUSD 1
EURGBP 0

Aqui vemos que não podemos abrir negócios emEURUSD eGBPUSD porque o roteiro não permite que
tenha mais de um pedido por par.
É claro que haverá tantas linhas quantas houver pares em funcionamento.
Com esta solução todos os seus cavalos estarão sempre cientes do que está acontecendo no momento
, e poderão calcular se qualquer ação é permitida ou não no momento.
Quando você estabelece um pedido em qualquer par, você tem que colocar 1 na linha certa
Ao fechá-lo, substitua-o por zero
Isto definitivamente funcionará, embora um pouco complicado para um novato
. Mas vá em frente, porque todos estavam lá - como um novato até que chegue a hora!

Tenha uma boa caçada!
MADZX

 

Estou escrevendo uma estratégia de recuo. Preciso colocar uma ordem de parada acima (abaixo) do extremo da vela correspondente. Aqui está um exemplo:

É claro que se o fechamento for abaixo do aberto, é uma vela de baixa, e vice-versa - uma vela de alta elevação. Quero saber como fazer uma condição dizendo que a vela anterior está em alta. ... mais ou menos.

Logicamente, eu faço uma função que determinará o tipo de vela.

int CandleType()
{
  if(Open[1] > Close[1])
    return(BullCandle);
    
  if{Open[1] < Close[1]}
    return(BearCandle);
    
  return(dodji);
}

Então você deve de alguma forma perguntar se a barra com índice 1 está em alta ou em baixa. ...e fazer algo...

Como eu faço isso?

 
madzx:


Eu implementaria um show como este:
Todos os seus 10 cavalos estão trabalhando cada um em seu próprio horário, como se estivessem em salas adjacentes
e, portanto, nenhum deles sabe o que o vizinho está fazendo atrás da parede - este é o principal problema
para sua idéia!
Portanto, eu instruiria cada EA a escrever suas ações em um arquivo de disco
que estará disponível para todos os cavalos, pois ele está no diretório do terminal .
Se algum deles tem um desejo ardente de fazer algo em sua janela
deve primeiro analisar este arquivo e verificar a possibilidade de implementar
desejo!
em relação ao seu cenário você precisa adicionar no arquivo o número de pedidos
e pares de moedas nos quais eles estão abertos
. Por exemplo:
EURUSD 1
GBPUSD 1
EURGBP 0

Aqui vemos que não podemos abrir negócios emEURUSD eGBPUSD porque o script não permite que
tenha mais de um pedido por par.
É claro que haverá tantas linhas quantas houver pares em operação.
Com esta solução todos os seus cavalos estarão sempre cientes do que está acontecendo no momento
, e poderão calcular se qualquer ação é permitida ou não no momento.
Quando você estabelece um pedido em qualquer par, você tem que colocar 1 na linha certa
Ao fechá-lo, substitua-o por zero
Isto definitivamente funcionará, embora um pouco complicado para um novato
. Mas vá em frente, porque todos estavam lá - como um novato até que chegue a hora!

Tenha uma boa caçada!
MADZX

Obrigado pela dica, mas é um pouco complicado demais. E então, em sua versão, tudo funciona, e são necessários 10 para verificar a condição de entrada,

Eles abrem apenas os primeiros cinco que conseguiram e depois, quando um deles fecha, o primeiro que corresponde às condições abre novamente,

não limitado a EURUSD 1 , GBPUSD 1 , EURGBP 0.

Acho que deveria haver uma solução mais simples. Deve ser semelhante à contagem do número total de pedidos com uma condição de limitação por um determinado parâmetro.

E a limitação pode ser definida ou por um símbolo ou por um número mágico não mais que um.

Embora sua versão provavelmente também funcione, mas não posso decidir como implementá-la em código.

 
hoz:

Eu tenho uma coisa estranha acontecendo aqui. Esta é a função de abrir ordens:

aqui está o erro:

if(SL < g_stopLevel)
    SL = g_stopLevel*pt;

se o nível de parada = 5, então você está tentando colocar uma parada de perda em 0,00005.

O segundo erro é que você não verifica onde você está fazendo o pedido. Se o castiçal fechar em ou perto de sua altura baixa, você receberá o erro 130. Como você pode ver na figura, o servidor abriu uma ordem de venda em vez de um "selltop" porque você tentou abrir um pedido "selltop" a um preço maior ou igual ao preço atual.

Aprenda a usar a impressão. Basta colocar Print(); no lugar certo, colocar as variáveis requeridas entre parênteses e separá-las com isto: ", ", assim: Print(Price," ",SL); e durante os testes no momento da abertura de uma ordem na guia "Experts" você verá a que estas variáveis são iguais, e será capaz de entender o que está errado.

O registro também mostrará o que a EA está tentando fazer, onde estabelecer um Stop Loss e Take Profit. Lá você verá tudo o que precisa.

Logicamente, eu faço uma função que detectará o tipo de vela.

Vamos começar a trabalhar dentro da função.

Primeiramente, criamos uma variável na qual escreveremos a direção da vela anterior.

int Candle=-1;

Vamos preenchê-lo com alguns valores, um dos quais denotará uma alta, outro - baixa. Se -1, não é nada (não foi determinado ou não tem direção próxima=aberta).

Valor que proponho utilizar por analogia com uma ordem comercial 0 - comprar, 1 - vender;

então temos que escrever:

if(Close[1]>Open[1]) Candle=0; else
if(Close[1]<Open[1] Candle=1;

Agora temos uma direção definida e podemos usá-la diretamente na função OrderSend( símbolo de corda, int cmd, ...outras coisas...);

if(Candle!=-1) OrderSend( Symbol(),Candle, ...outras coisas...);

ou seguindo sua analogia:

if(Candle==0) OpenBuy();
if(Candle===1) OpenSell();

 
Kobalerro:

Obrigado pela dica, mas é um pouco complicado demais. E então acontece que todos eles funcionam em sua versão e são necessários 10 para verificar as condições de entrada,

e eles abrem apenas cinco que chegaram a tempo primeiro e depois, quando um deles fecha, o primeiro que corresponde às condições abre novamente,

não limitado a EURUSD 1 , GBPUSD 1 , EURGBP 0.

Acho que deveria haver uma solução mais simples. Deve ser como contar o número total de pedidos com uma condição de limitação por um determinado parâmetro.

E precisamos limitar este número ou por um símbolo ou por um número mágico, ou por não mais de um.

Embora, talvez, sua variante também funcione, mas como implementá-la no código, eu não consigo pensar.


Ou talvez assim :

if(NumberOfPositions("EURUSD")==0 && NumberOfPositions()<10)
Aqui está uma função
 
keep87:

há aqui um erro:

se o nível de parada = 5, então você está tentando colocar uma parada de perda em 0,00005.

O segundo erro é que você não verifica onde está fazendo o pedido. Se o castiçal fechar em ou perto de sua altura baixa, você receberá o erro 130. Como você pode ver na figura, o servidor abriu uma ordem de venda em vez de um "selltop", porque você tentou abrir um pedido "selltop" a um preço maior ou igual ao preço atual.

Aprenda a usar a impressão. Basta colocar Print(); no lugar certo, colocar as variáveis requeridas entre parênteses e separá-las com isto: ", ", assim: Print(Price," ",SL); e durante os testes no momento da abertura de uma ordem na guia "Experts" você verá a que estas variáveis são iguais, e será capaz de entender o que está errado.

O registro também mostrará o que a EA está tentando fazer, onde estabelecer um Stop Loss e Take Profit. Ele mostrará tudo o que é necessário.

Eu a utilizo dessa forma de tempos em tempos. Veja, agora as funções se parecem com isto:

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  int ticket = -1;
  string myNote = "Сов баянул";
  
  double price = High[1] + i_thresholdFromInput*pt;
  Print("price = ", price);
  double SL = Low[1] - i_thresholdFromBasedSL*pt ;
  Print("SL = ", SL);

  if(price > Ask)
  {
    ticket = OrderSend(Symbol(),OP_BUYSTOP,0.1,NormalizeDouble(price,Digits),i_slippage,0,0,myNote,i_myMagic,TimeCurrent() + 600,Navy);
  }
  
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    if(!OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),NormalizeDouble(High[1] + i_tp*pt,Digits),0,Navy))
    return(false);
  
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  int ticket = -1;
  string myNote = "Сов шортанул";
  
  double price = Low[1] - i_thresholdFromInput*pt;
  Print("price = ", price);
  double SL = High[1] + i_thresholdFromBasedSL*pt;
  Print("SL = ", SL);
  
  if(price < Bid)
  {
    ticket = OrderSend(Symbol(),OP_SELLSTOP,0.1,NormalizeDouble(price,Digits),i_slippage,0,0,myNote,i_myMagic,TimeCurrent() + 600,Red);
  }
  
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    if(!OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),NormalizeDouble(Low[1] - i_tp*pt,Digits),0,Red))
    return(false);
    
  return(true);
}

Eu li na revista:

2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: modify #1 buy stop 0.10 EURUSD at 1.32103 sl: 1.32007 tp: 1.32243 ok
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: open #1 buy stop 0.10 EURUSD at 1.32103 ok
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: SL = 1.3201
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: price = 1.321
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: OrderSend error 130
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: SL = 1.3194
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: price = 1.3204
2012.12.25 18:20:14     5_minites_TS_by_Philippe Nell inputs: i_fastMaPeriod=10; i_slowMaPeriod=21; i_filtrMaPeriod=50; i_trading_TF=5; i_thresholdFromInput=1; i_thresholdFromBasedSL=1; i_slippage=3; i_tp=15; i_myMagic=33330215; 
2012.12.25 18:20:12     5_minites_TS_by_Philippe Nell EURUSD,M5: loaded successfully

Assim, inicialmente do preço de compra até a parada foi a diferença de 1.3204 - 1.3194 = 0.001 pontos

Mais 1.3210 - 1.3201 = 0.009 pontos

E por alguma razão, no segundo caso, a parada estava mais próxima do preço de entrada, mas não houve erro! Pensei sobre isso e não o entendi.

Corrigi o erro posteriormente de uma maneira diferente. Já existem condições no código:

if(price > Ask) && if(price < Bid) respectivamente para compra e venda. Ou havia outra variante? Agora não temos mais erros. Mas, mesmo assim, gostaria de ouvir a opinião de um programador mais experiente.