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

 
aceventura:

O número de pedidos não funcionará, porque a EA é definida de forma diferente para cada par. E estabelece pedidos em pares diferentes ao mesmo tempo. Então, se quatro pedidos são feitos para dois pares e um acionado, três deles são apagados e o oposto deve ser apagado para todos os pares.

Todas as funções do KimIV "filtrarão" as ordens por tipo+par+mágico. Isto é, (para mim! :) para não correr e pesquisar - a partir desta página "Seconds AfterCloseLastPos(string sy="", int op=-1, int mn=-1)" ) chamando "Conte lá alguns" Com certeza você receberá o número real de pedidos abertos neste par ou mesmo com este EA.

ZS Eu quis dizer a função

int NumberOfOrders(string sy="", int op=-1, int mn=-1)

a partir da página 12.

 
SergNF:

Todas as funções das ordens de 'filtragem' KimIV por tipo+par+mágico. Isto é (para mim! :) para não correr e pesquisar - a partir desta página "Seconds AfterCloseLastPos(string sy="", int op=-1, int mn=-1)" ) chamando "Conte lá alguns" Com certeza você receberá as ordens reais abertas para este par de moedas ou mesmo com este EA.

Eu quis dizer a função

a partir da página 12.

Obrigado! Muito útil! Vou investigar isso.

 
Desculpas pela intrusão Ajuda para burros Como traçar linhas paralelas no MT4 de forma rápida e confortável?
 
extern double Lots = 0.1;
extern double TrailingStop = 10;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2;
   double P_up0,P_down0,P_up1,P_down1;
   int cnt,ticket,total;
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   P_up0=iCustom(0,0,"Ценовой канал",5,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",5,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",5,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",5,1,1);
   ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1);
   ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1);
   ao1=iAO(0,0,1);
   ao2=iAO(0,0,2);
   ac1=iAC(0,0,1);
   ac2=iAC(0,0,2);
//задали все данные 
 
   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
Por favor, ajude. Eu montei uma simples EA usando uma parada móvel.

Como fazer a parada de trilha foi colocado uma vez +5 pips e não mais transferido, o fechamento foi feito por

Como utilizar o trailing stop se ele já está definido pelos indicadores? Se você puder dar um exemplo!!!
 
KimIV писал (а) >>

Provavelmente não... Só tenho dois: dedo indicador e punho... >> hee

Igor, eu tenho um fraquinho por você, mesmo não sendo gay. Afinal de contas, você também pode trabalhar como Zadornov.

 

SegundosPósAbrirA função dePos().

Esta função retorna o número de segundos desde que a última posição foi aberta. A seleção das posições a serem levadas em conta é definida por parâmetros externos:

  • sy - Nome do instrumento de mercado. Se este parâmetro for definido, a função considerará apenas as posições do instrumento especificado. O valor padrão - "" significa qualquer instrumento de mercado. O valor NULL significa o instrumento atual.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
  • mn - Identificador de posição, MagicNumber. O valor padrão de -1 significa qualquer identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  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 (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}
P.S. Em anexo está um roteiro para testar a função SecondsAfterOpenLastPos().
Arquivos anexados:
 

É claro que lamento muito, o que você está fazendo é certamente uma coisa boa.

Mas COMO você faz isso, eu não gosto nada disso.

1. O fato de você descrever os nomes das variáveis é ótimo, mas toda vez que você tem que olhar no cabeçalho para ver o significado da próxima abreviação selvagem, é difícil entender o que a variável representa, você esquece o que você queria descobrir no código. Você não pode escrever um código de qualidade autodocumentado, que mesmo sem comentários será compreensível para alguém que sabe inglês, especialmente porque você está fazendo isso para outros e outros com essa qualidade nunca encontrarão um erro no código, se é que existe um.



2. Funções sobrecarregadas. A versatilidade é uma coisa de BAD, 6 parâmetros para uma função é demais.



3. Simplicidade do código

Exemplo.

datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  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 (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}

Este é o seu código. Vamos ver o que você pode fazer com ele:

datetime SecondsAfterOpenLastPos(string symbol = "", int type = -1, int magic = -1) 
{
  datetime nearestTime = 0; // Инициализировать не надо? Самые сложно находимые ошибки.
  int count = OrdersTotal();
 
  if (symbol == "0") 
     symbol = Symbol();
 
  for (int i = 0; i < count; i++) 
  {
     // invalid select    
     if (!OrderSelect(i, SELECT_BY_POS)) continue;
     
     // not needed symbol     
     if (OrderSymbol() != symbol && symbol != "") continue;
 
     int currentType = OrderType();
 
     // only active orders are checked     
     if (currentType != OP_BUY && currentType != OP_SELL) continue;
     
     // type doesn't pass     
     if (type > 0 && currentType != type) continue;
 
     // magic number doesn't pass     
     if (magic > 0 && OrderMagicNumber() != magic) continue;
 
     if (nearestTime < OrderOpenTime()) nearestTime = OrderOpenTime();
  }
 
  return (TimeCurrent() - nearestTime);
}

Devemos comparar o código? Ele faz a mesma coisa.

1. Sim, meu código é maior, mas afinal de contas, não vivemos na era das disquetes, não há espaço suficiente?

2. Meu código é muito mais claro por dentro. Mesmo sem os comentários, que são colados no lugar.

3. Sua função tem ninho 7, a minha tem 2, há diferença?

4 É uma das poucas funções que não está sobrecarregada, mas abrir, modificar e assim por diante é um pesadelo.



SZZH: Respeite as pessoas para quem você está escrevendo.

 

Но КАК вы это делаете, мне абсолютно не нравится.

-1. Discorda. Absolutamente bem com tudo, tanto na forma quanto no conteúdo. Por favor, continue exatamente no mesmo formato.

Sim, meu código é maior.

Exatamente. E quanto menor o código, mais fácil é a sua leitura. Eu odeio fontes "manchadas" em 2-3 telas. Uma função deve estar toda em uma única tela, sem passar por ela. É por isso que sou a favor da compacidade.

Sua função tem ninho 7, eu tenho 2, há diferença?

Você não se importa de ter muitos continuums opcionais que, a propósito, mais uma vez desviam a atenção do leitor?

 
Andrei(TheXpert), obrigado por seus comentários e sugestões! Todos eles são absolutamente justos e você está absolutamente certo em suas declarações!
 

Função DeleteOppositeOrders().

Esta função apaga uma ou mais ordens opostas à posição, cujo tipo é especificado no parâmetro op. Por exemplo, para uma posição Comprar, as ordens opostas seriam SellLimit e SellStop. A eliminação da ordem oposta torna-se necessária se, por exemplo, duas ordens opostas forem estabelecidas e uma delas acionar.

  • sy - Nome do instrumento de mercado. Se você definir este parâmetro, a função considerará apenas as posições do símbolo especificado. O valor padrão "" significa qualquer instrumento de mercado. O valor NULL significa o instrumento atual.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
  • mn - Identificador de posição, MagicNumber. O valor padrão de -1 significa qualquer identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.06.2008                                                     |
//|  Описание : Удаление ордеров, противоположных позиции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void DeleteOppositeOrders(string sy="", int op=-1, int mn=-1) {
  bool eb, es;

  switch (op) {
    case OP_BUY : eb=ExistPositions(sy, OP_BUY , mn); break;
    case OP_SELL: es=ExistPositions(sy, OP_SELL, mn); break;
    default:      eb=ExistPositions(sy, OP_BUY , mn);
                  es=ExistPositions(sy, OP_SELL, mn); break;
  }

  if (eb) {
    DeleteOrders(sy, OP_SELLLIMIT, mn);
    DeleteOrders(sy, OP_SELLSTOP , mn);
  }
  if (es) {
    DeleteOrders(sy, OP_BUYLIMIT, mn);
    DeleteOrders(sy, OP_BUYSTOP , mn);
  }
}
SZZ. Anexado um roteiro para testar a função DeleteOppositeOrders().
Arquivos anexados: