Características úteis da KimIV - página 51

 
Caro Igor, peço desculpas se ofendi alguém... Eu não estava realmente criticando, é uma pena que pareça assim. Em qualquer caso, o protótipo postado será corrigido e refinado mais de uma vez. Portanto, não haverá quebra-cabeças (eu nunca fingi ser o autor), enviarei o trabalho para a revisão do autor no futuro. Eu me vejo como o primeiro passo até agora, 25 páginas. Assim que eu terminar, enviarei para o endereço mencionado em seu site. Obrigado por seu trabalho inestimável e por sua partilha desinteressada de experiência!!!
 
rid писал (а) >>

Eu acho que é possível. Aparentemente, é necessário verificar em cada nível (no cruzamento) qual é o tamanho atual do lote da posição aberta. E exatamente por este critério, devemos implementar um mecanismo de fechamento!

Tais funções (que devolvem o tamanho do lote) estão disponíveis neste ramo. Veja a pp. 17 и 27

Muito obrigado! Hurra! Agora posso seguir em frente. Muito obrigado!

 

Para determinar se são ou não necessárias verificações adicionais do tamanho do lote na função OpenPosition(), você precisa ver como você calcula o tamanho do lote e como e onde ele é chamado; eu não vi essa função na filial

duplo ll=GetSizeLot();

talvez eu tenha perdido .

Se for calculado assim https://championship.mql5.com/2012/ru/news, você pode ter um erro 134 e perder o campeonato :-)

 

Olá KimIV.enviou uma coisa que terá que escrever de volta. Não sou muito bom em programação e estou estudando para ser um comerciante por 3 semanas. minha gramática também não é boa.

aqui. Minha pergunta é a seguinte. É possível fazer uma EA usando o indicador CCi?

Níveis CCi 250, 50, -50, -250. A idéia é que quando alcança (cruzes) -50 e 50, respectivamente, eu venderia ou compraria. Considere quando o negócio deve parar:

1Agora (digamos que há uma venda) o gráfico cruza -250, depois cruza na direção oposta -250 (você pode ver na figura).

2 O gráfico não chegou a 250 e passa para 50.

Para comprar, é a mesma coisa, mas vice versa.

Citação Euro/Dólar, a qualquer momento.

Quanto custaria uma EA de pelúcia como esta????

Se for pelo mesmo preço, você pode oferecer algo melhor?

Obrigado de antemão. Espero que sim. Bem, eu fui a um curso FOREX.

A propósito, forex é uma maneira real de ganhar pão e manteiga????

 

Saudações a todos.

Encontrou este indicador, mudou-o um pouco - constrói boas linhas de tendência.

Seria interessante inventar uma função... (é uma espécie de pedido KimIV).

Arquivos anexados:
tlbs.mq4  8 kb
 
Prival писал(а) >>

Re.

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po);

Talvez fosse melhor chamar OpenPosition("GBPJPY", OP_SELL, 0.1, 23, 44);

Esta sugestão, Sergei, aumenta a conveniência do uso de paradas e tomadas em pips. E nos casos em que as paradas e tomadas são estabelecidas por níveis de preço? Por exemplo, uma parada na parte baixa ou alta da barra anterior. Ou por uma linha de algum tipo. É traduzido em pontos antes de chamar a função e convertido de volta aos preços dentro da função? Esta é uma operação redundante. Portanto, vou deixar as coisas como estão.

Consideraremos a função GetSizeLot() mais tarde (a propósito, ela agora se chama GetLots()). Primeiro de tudo, precisamos terminar de usar as bibliotecas b-ForTest.mqh e b-Positions.mqh.

 

A função CountOrders() para o testador.

Em minhas versões de teste (destinadas apenas ao testador do MT4) de Expert Advisors, a função CountOrders() substitui as seguintes funções: ExistOrders(), ExistPositions(), NumberOfOrders() e NumberOfPositions(). Ou seja, ele pode dar informações sobre a existência de uma posição ou ordem de qualquer tipo, bem como informações sobre o número de negócios de cada tipo. Tal intercâmbio tem suas próprias vantagens, que se expressam em uma referência única à base de pedidos por um tick e na obtenção de todas as informações necessárias de uma só vez. E as funções mencionadas acima, especialmente quando usadas em conjunto, cada uma delas trabalha com uma e a mesma base de ordem independentemente, de modo que repetidamente fazem as mesmas chamadas. Como resultado, a função CountOrders() pode reduzir o tempo de uma passagem em vários segundos, o que permite economizar horas de otimização.

A função CountOrders() toma os seguintes parâmetros:

  • mo - Número de pedidos por tipo. Após a função ter sido executada, a matriz terá 6 (seis) elementos. Elemento zero - número de operações do tipo Compra, primeiro elemento - número de ordens de Venda, segundo elemento - BuyLimit, terceiro elemento - SellLimit, quarto elemento - BuyStop, quinto elemento - SellStop.
  • mn - Identificador de um cargo ou ordens (MagicNumber). O valor padrão é -1 - qualquer MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 03.08.2008                                                     |
//|  Описание : Рассчитывает количество ордеров по типам.                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mo - массив количества ордеров по типам                                 |
//|    mn - MagicNumber                          (-1 - любой магик)            |
//+----------------------------------------------------------------------------+
void CountOrders(int& mo[], int mn=-1) {
  int i, k=OrdersTotal();

  if (ArraySize( mo)!=6) ArrayResize( mo, 6);
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if ( mn<0 || OrderMagicNumber()== mn) mo[OrderType()]++;
    }
  }
}

P.S. Em anexo está um roteiro para testar a função CountOrders() online.

Arquivos anexados:
 

Boa tarde, Igor e todos os outros também. Tenho um problema usando a função GetFractalBar(NULL,0, 0). - Ele retorna o número da barra fractal pelo seu número. Para ser mais preciso, o problema não está na função. Mas em algum lugar perto disso.

Tudo está OK quando o comentário é exibido com esta configuração. TENHO o número da barra no canto do gráfico.

int a;
... ...

int start()
  {
//----
if(Time[0] == prevtime)   return(0);//ждём нового бара
   prevtime = Time[0];//если появился новый бар , включаемся

if ( isFractalUp() > isFractalDn() )  {//если это Down-фрактал

   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));
   
Comment( GetFractalBar(NULL,0, 0));            }

E tudo está bem quando eu mostro os números de comentários no canto do gráfico. Vejo valores mínimos do preço da barra com o fractal no canto esquerdo.

if ( isFractalUp() > isFractalDn() ) {//если это Down-фрактал
   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));

Comment(iLow(NULL,0, GetFractalBar(NULL,0, 0)));          }

Mas, de um modo geral, não está claro! Assim que eu inserir a variável "a" no comentário em vez da função em si, o comentário retorna 1 no canto em vez do valor do preço! Aqui :

if ( isFractalUp() < isFractalDn() ) {
   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));
   Comment( a);                        }
Estou sentado há três horas, não entendo o que está errado! Por favor, me diga se você pode....
 
Rita писал(а) >>
Assim que eu inserir a variável "a" no comentário em vez da função em si, o comentário retorna 1 no canto em vez do valor do preço !

Você declarou a variável "a" como uma variável inteira, ou seja

int a;

Você deve declará-la como uma variável real, ou seja

duplo a;

 

Função ModifyOrder() para o testador.

Esta é uma versão simplificada da função ModifyOrder(), publicada na página 7, e é projetada para alterar os níveis de preço absoluto de uma ordem ou posição pré-selecionada.

A função ModifyOrder() aceita os seguintes parâmetros:

  • pp - Preço de fixação do pedido. Se você passar um valor menor ou igual a zero, a modificação deste nível de preço não será realizada. O valor padrão é -1.
  • sl - Parar nível de preço. Se você passar um valor inferior a zero, a modificação do nível de preço não será realizada. O valor padrão é 0.
  • tp - Take price level. Se você passar um valor inferior a zero, a modificação do nível de preço não será implementada. O valor padrão é 0.
  • ex - Data de expiração da ordem pendente. O valor padrão é 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
  double op=NormalizeDouble(OrderOpenPrice() , dg);
  double os=NormalizeDouble(OrderStopLoss()  , dg);
  double ot=NormalizeDouble(OrderTakeProfit(), dg);
  color  cl;

  if ( pp<=0) pp=OrderOpenPrice();
  if ( sl<0 ) sl=OrderStopLoss();
  if ( tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble( pp, dg);
  sl=NormalizeDouble( sl, dg);
  tp=NormalizeDouble( tp, dg);

  if ( pp!= op || sl!= os || tp!= ot) {
    if (MathMod(OrderType(), 2)==0) cl= clModifyBuy; else cl= clModifySell;
    if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er=GetLastError();
      Print("Error(", er,") modifying order: ", ErrorDescription( er));
      Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
            " op="+ GetNameOP(OrderType())," pp=", pp," sl=", sl," tp=", tp);
    }
  }
}
Razão: