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

 

Mais exemplos de como usar a função SetOrder().

Para maior clareza, devemos selecionar um símbolo com um grande nível mínimo permitido de stop loss/stake profit em pips. Eu escolhi a AUDCAD, em que este nível em minha corretora selecionada para testes é de 10 pontos.

1. Estabelecendo um pedido BuyLimit com lote 0,1, 5 pips abaixo do preço atual. Eu escolhi propositadamente o nível de ajuste do pedido abaixo do nível mínimo permitido para obter o erro 130 (Paradas incorretas) e mostrar como a função SetOrder irá funcionar.

SetOrder(NULL, OP_BUYLIMIT, 0.1, Ask-5*Point);

Conteúdo do protocolo (ler de baixo para cima):
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: removido
2008.03.17 09:06:24 stdlib AUDCAD,M5: removido
2008.03.17 09:06:24 stdlib AUDCAD,M5: razão uninit 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: aberto #21616412 limite de compra 0.10 AUDCAD a 0.9180 ok
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: SetOrder(): Níveis de preços corrigidos
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.1 op=Buy Limite pp=0.9185 sl=0 tp=0 mn=0
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Erro(130) definir ordem: parada inválida, tente 1
2008.03.17 09:06:15 stdlib AUDCAD,M5: carregado com sucesso
2008.03.17 09:06:14 test_SetOrder AUDCAD,M5: carregado com sucesso

O protocolo mostra que esta função tentou colocar uma ordem 0,9185 (pp=0,9185), mas o servidor comercial não aceitou tal ordem e devolveu o erro 130. Em seguida, a função corrige o nível de ajuste do pedido de acordo com o nível mínimo permitido e executa a próxima tentativa comercial que termina com sucesso. O pedido é fixado em 0,9180.

2. Estabelecendo um pedido BuyStop com lote 0,3 a 6 pips acima do preço atual com um stop de 9 pips

SetOrder(NULL, OP_BUYSTOP, 0.3, Ask+6*Point, Ask+(6-9)*Point);

Conteúdo do protocolo (lido de baixo para cima):
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: removido
2008.03.17 09:27:36 stdlib AUDCAD,M5: removido
2008.03.17 09:27:36 stdlib AUDCAD,M5: razão uninit 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: aberto #21617419 buy stop 0.30 AUDCAD a 0.9209 sl: 0.9195 ok
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: SetOrder(): Níveis de preços corrigidos
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Ask=0.9198 Bid=0.9188 sy=AUDCAD ll=0.3 op=Buy Stop pp=0.9204 sl=0.9195 tp=0 mn=0
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Erro(130) definir ordem: parada inválida, tente 1
2008.03.17 09:27:26 stdlib AUDCAD,M5: carregado com sucesso
2008.03.17 09:27:25 test_SetOrder AUDCAD,M5: carregado com sucesso

Este exemplo mostra como o nível de ajuste do pedido mudou de 0,9204 para 0,9209. Ao mesmo tempo, o nível de parada permaneceu inalterado em sl=0,9195. Ou seja, a parada em pips aumentou de 9 para 14.

 

3. Estabelecer um pedido de SellLimit com 0,5 lote a 8 pontos acima do preço atual com um stop de 9 pontos e um take order de 7 pontos

SetOrder(NULL, OP_SELLLIMIT, 0.5, Bid+8*Point, Bid+(8-9)*Point, Bid-(8+7)*Point);

Conteúdo do protocolo:
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: removido
2008.03.17 10:38:50 stdlib AUDCAD,M5: removido
2008.03.17 10:38:50 stdlib AUDCAD,M5: razão uninit 0
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 10:38:49 test_SetOrder AUDCAD,M5: aberto #21620553 limite de venda 0.50 AUDCAD a 0.9190 sl: 0.9201 tp: 0.9179 ok
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: SetOrder(): Níveis de preços corrigidos
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.5 op=Sell Limit pp=0.9188 sl=0.9197 tp=0.9179 mn=0
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Erro(130) definir ordem: parada inválida, tente 1
2008.03.17 10:38:40 stdlib AUDCAD,M5: carregado com sucesso
2008.03.17 10:38:39 test_SetOrder AUDCAD,M5: carregado com sucesso

Este exemplo mais uma vez tenta estabelecer uma ordem limite muito próxima do mercado. O nível de ajuste do pedido foi ajustado para cima em 2 pips de 0,9188 a 0,9190. O nível de parada também foi ajustado, mas em 4 pontos de 0,9197 a 0,9201. O nível Only Take permaneceu inalterado, o que o aumentou de 9 para 11 pips.

Acho que já são exemplos suficientes. Eles já são bastante difíceis de entender. Que conclusões podem ser tiradas?
1. A função fará seu melhor para completar sua tarefa, ou seja, tentará estabelecer uma ordem. Ela ajustará os níveis ao mercado em mudança e tentará fazer seu trabalho repetidamente.
2. O ajuste do nível de ajuste da ordem de parada leva a um aumento do nível de parada em pontos em relação ao preço de ajuste. Isto se deve ao fato de que o nível de parada da ordem de parada permanece no lugar e o nível de ajuste da ordem é afastado do nível de parada. O nível do pedido BuyStop é deslocado para cima e o pedido SellStop é deslocado para baixo. Estas manipulações com o nível de ajuste do pedido aumentam o tamanho da parada em pontos pelo valor do ajuste do nível de ajuste do pedido.
3. O ajuste do nível de ajuste do pedido limite resulta no aumento do nível da linha de tomada em pontos relativamente ao preço de ajuste. Isto é implementado da seguinte maneira. Takei são mantidos no lugar enquanto as paradas e os níveis de configuração são deslocados para cima para BuyLimit e para baixo para SellLimit. O tamanho do take in aumenta com o valor da correção do nível de ajuste do pedido.

Advertência! Mudei o código da função SetOrder trocando algumas linhas. O antigo posto não pode ser editado, por isso estou colando aqui a função corrigida. Também está anexado um roteiro para o teste online da função SetOrder.


Arquivos anexados:
 

A fim de acelerar a publicação da função ModifyOrder, decidi mudar para as funções de posição por um tempo, e depois voltar para as funções de ordem e terminar com elas.

Nota!
Eu definoposições como OP_BUY e OP_SELL operações comerciais. As posições são abertas e fechadas.
Chamo as operações comerciais OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT e OP_SELLSTOPcomo ordens. As encomendas são feitas e excluídas. Se uma ordem é acionada, ela se torna uma posição.

A função ExistPosições().

Esta função destina-se a verificar se existem posições abertas de compra ou venda. Semelhante à função ExistOrders. Por padrão, ele verifica todas as posições: atuais e outras. Você pode refinar a seleção com uma combinação de filtros - parâmetros de função:

  • sy - Impõe uma restrição ao nome do instrumento. O parâmetro padrão é "" - sem restrições, ou seja, qualquer instrumento. Se você aprovar o NULL, a seleção de posição será limitada ao instrumento atual.
  • op - coloca uma restrição no tipo de posição (Compra/Venda). Por padrão, não há nenhuma restrição, ou seja, qualquer tipo de posição é verificada. Os valores válidos para este parâmetro são -1, OP_BUY e OP_SELL.
  • mn - Aplica restrição ao número de identificação ("mágico") da posição. Por padrão não há nenhuma restrição, ou seja, a posição com qualquer número mágico é verificada.
  • ot - Aplica restrição no tempo de abertura de posição. É verificado se a posição será aberta mais tarde do que o valor deste parâmetro. Nenhuma restrição por padrão, ou seja, qualquer posição com qualquer tempo de abertura é verificada.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 

Exemplos de como usar a função ExistPositions().

1. Verificar a existência de qualquer posição

ExistPositions();

2. Verificar a existência de qualquer posição no símbolo do gráfico atual

ExistPositions(NULL);

3. Verificar a existência de compra em qualquer instrumento

ExistPositions("", OP_BUY);

4. Verifique se há uma venda com o número mágico 123456 em EURUSD

ExistPositions("EURUSD", OP_SELL, 123456);

5. Verificar a existência de qualquer posição com tempo de abertura não antes de 15 minutos atrás

ExistPositions("", -1, -1, TimeCurrent()-15*60);

O trailer contém um roteiro para testar a função ExistPositions. Os primeiros quatro exemplos são comentados.

Arquivos anexados:
 
Desculpe, mas nem OrderSet_1 nem OrderSet_2 funcionam! Ele gera erros - não compila! O que eu faço?
 
SoloEgoist:
Desculpe, mas nem OrderSet_1 nem OrderSet_2 funcionam! Ele gera erros - não compila! O que eu faço?
Os arquivos OrderSet_1 ou OrderSet_2 são códigos fonte para a função OrderSet em diferentes versões. Apenas o código fonte, só isso. Eles não irão compilar ou executar corretamente (sem erros). Para obter pelo menos alguns resultados, você também deve criar um ambiente de trabalho que utilize a função OrderSet. Criei um exemplo de tal ambiente de trabalho em test_SetOrder.
 
Obrigado. Entendo - vou tentar, só não conheço muito bem a língua.
 

Funções e formas de trabalhar com data e hora seriam úteis...

Por exemplo:
- subtrair 2 horas do tempo atual
- X dias até a expiração...

Também... não sei se isto é relevante... :(

Funções para estatísticas. Por exemplo:
- Quantos castiçais de hora em hora às 21:00 de cada segunda-feira
- dos quais: 215 em alta, 245 em baixa
- de candelabros em alta: mínimo. 12 pips no máximo 54 pips
- etc....

ou
- o baixo de cada primeira vela de 15H do dia é maior/menor do que o segundo X número de vezes

Não são as funções em si que são importantes, mas como elas são criadas, e é mais fácil implementar suas próprias funções,
enquanto aprende a programar...
Estou reclamando mais uma vez :))) Às vezes muitas coisas não são muito claras, e os livros em C podem ajudar.
É claro que você pode lê-los, mas você realmente precisa encher sua cabeça com informações desnecessárias, concentrando-se apenas no µl4?
que tipo de obscuridade? por exemplo isto: |||

 
kombat:

As funções e formas de lidar com data e hora seriam úteis.

Por exemplo:
- subtrair 2 horas do tempo atual
- X dias restantes até a expiração...

...


você não precisa escrever tal função - existe uma solução muito simples!


int gHour = 2;
data/hora gTwoHour ;


gTwoHourTime = TimeCorrent() - ((86400)/24) * gHour ); // 2 horas
gTwoHourTime = TimeCorrent() - 7200; // o mesmo mas sem cálculos de carga

ou seja, recebemos 86400 carrapatos em um dia

portanto 2 horas = 7200 carrapatos, ou seja, 86400/24 * 2 = 7200
1 hora = 3600; etc.
 
kombat:

As funções e formas de trabalhar com data e hora seriam úteis.

Funções para estatísticas. Por exemplo:
- Quantos castiçais de 21:00 todas as segundas-feiras
- dos quais: 215 em alta, 245 em baixa
- de candelabros em alta: mínimo. 12 pips no máximo 54 pips
- etc....

ou
- o baixo de cada primeira vela de 15H do dia é maior/menor do que o segundo X número de vezes

Não são as funções em si que são importantes, mas como elas são criadas, e é mais fácil implementar suas próprias funções,
enquanto aprende a programar...

Devidamente observado... :-)

kombat escreveu (a):
Vou reclamar novamente :))) às vezes muita coisa não é muito clara, e dizem que os livros C ajudarão.
É claro que você pode lê-los, mas você realmente precisa encher sua cabeça com informações desnecessárias, concentrando-se apenas no µl4?
que tipo de obscuridade? por exemplo isto: |||

É um OR lógico. Deixe-me explicar isso através do exemplo. A expressão "Se x>2 ou x<-3, então x=5" em MQL4 terá a seguinte forma

if (х>2 || х<-3) х=5;
Razão: