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

 
É possível adicionar em seu Expert Advisor e-CloseByPercentProfit.mq4 para definir TP e SL no par no gráfico em que ele está instalado?
 

Boa tarde a todos.

Pergunta sobre a função


//+------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                        |
//|  Описание : Возвращает количество позиций.      |
//+------------------------------------------------------------------+

int NumberOfPositions(string sy="", int op=-1, int mn=-1){
  int i, k=OrdersTotal(), kp=0;  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) kp++;
          }}}}}  return( kp);}  
          

Eu tenho uma contraparte em várias moedas. Os pares são definidos em parâmetros externos. Com seu próprio mágico (para cada par).

Entre as condições de entrada para cada instrumento está:
if ( NumberOfPositions(Symbol_1, -1,Magic_1)<1){//если нет открытых
//позиций по 1-му инструменту, 
OU (para o segundo par)
if ( NumberOfPositions(Symbol_2, -1,Magic_2)<1){//если нет открытых
//позиций по 2-му инструменту, проверяем ОСТАЛЬНЫЕ условия

O que aconteceu é que ontem cobrei ambos os símbolos - EURUSD, e esta manhã descobri que apenas um comércio foi aberto, embora parecesse haver sinais em ambos os casos.

E então isso me ocorreu. Que a função

NumberOfPositions(string sy="", int op=-1, int mn=-1)
Primeiro verifica se existe uma posição aberta para um símbolo. E depois tudo mais.

Em outras palavras, se eu tiver uma posição aberta com a EA para o instrumento EIRUSD, a segunda posição não se abrirá mesmo com outro mágico , de acordo com um algoritmo diferente.

Por favor, diga-me se é verdade ou não?

Ou estou errado em meu raciocínio? Ou a função avalia todos os critérios uma um ...


 

Uso frequentemente esta função, ela retorna tudo de acordo com os parâmetros de entrada. Os itens pelos quais a função passa são classificados sequencialmente de acordo com os parâmetros. Veja por si mesmo.

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  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) kp++; //внутри магика, и только здесь позиция учтена 
          }
        }
      }
    }
  }
  return( kp);
}
 

Então isso significa que minha EA não poderá abrir uma segunda posição EURUSD, mesmo com outro mágico, enquanto a primeira posição estiver aberta ?

Aparentemente, sim. Porque mesmo no testador não parece ver nenhuma sobreposição de posições.

//--------------------------------------------------------

 
Rita >> :

Então, isso significa que minha EA não poderá abrir a segunda posição EURUSD mesmo que tenha outro mágico, enquanto a primeira posição estiver aberta?

Exatamente o oposto :))) Isso significa que a função conta seus símbolos e números mágicos separadamente. Isto é, se houver uma posição aberta no EURUSD com Magic_1, então NumberOfPositions("EURUSD", -1, Magic_2)==0; a menos que haja outra posição no EURUSD com Magic_2.

Em geral, a função conta as posições abertas de acordo com (sy && op & mn), ou seja, as posições serão contadas exatamente com estes parâmetros. Se não houver correspondência de pelo menos um parâmetro, a ordem não será levada em conta por esta função, e não será exibida.

Imprima os valores da função em Comentário e você poderá ver em tempo real o número de pedidos e se a função está funcionando corretamente. O motivo mais provável para o mau funcionamento do algoritmo está no código EA.

 
Certo. Vou verificar o código agora.
 
hope писал(а) >>

Acrescentar uma ligação ao símbolo na chamada de função não ajuda. Por que conta o lucro para cada posição separadamente (foto acima)?

Não, prefiro oferecer-lhe meu desenho...

...e um roteiro...

Arquivos anexados:
 
KimIV писал(а) >>

Não, prefiro oferecer-lhe meu desenho...

...e um roteiro...

Percebi que sou um idiota... Você não pode obter úberes adicionando carne bovina e leite.

 
KimIV писал(а) >>
Angela, o compilador não esperava encontrar a definição da minha função neste mesmo lugar. Isto significa que, em algum lugar acima do código, você tem algo em falta. Pode ser um ponto-e-vírgula ou uma cinta de fechamento enrolada. De qualquer forma, verifique o código cuidadosamente.

Eu descobri, eu apenas inseri sua função dentro de int start(), quando a coloquei fora de int start(), tudo compilado. O problema é diferente, no indicador em modo de visualização no testador esta função não obtém dados da EA para o indicador.

 
e-News-Lucky$.mq4

Lucky$ & KimIV

http://www.kimiv.ru

Olá Igor!

Eu uso seu consultor especializado, é muito bom, tentei anexar um indicador através do iCustom ontem, mas ele não o viu, como prescrevê-lo através do iCustom? Eu me pergunto o que funções embutidas como iHigh, iLow o vêem sem nenhum problema, mas ele se recusa a colocar pedidos pendentes via indicador.

Esta função funciona como esperado, coloca ordens pendentes, mas não quer colocar ordens pendentes com indicador(((.... eu gostaria de mostrar o fragmento de código sobre como fazer pedidos pendentes pelo indicador neste EA? O indicador pode ser tudo menos uma chamada para a função iCustom.

Se você tiver algum tempo, obrigado.

//глобальные переменные

double Hi_Bar;
double Lou_Bar;

//+------------------------------------------------------------------+
//| Установка ордеров                                                |
//+------------------------------------------------------------------+
void SetOrders() {
  Hi_Bar  = iHigh(Symbol(), PERIOD_D1, 0);
  Lou_Bar =  iLow(Symbol(), PERIOD_D1, 0);
  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double pAsk= Hi_Bar+( DistanceSet+ spr)*Point;
  double pBid= Lou_Bar- DistanceSet*Point;


Razão: