Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 386

 
alexey1979621:
Obrigado, desmonte seu código. Há de fato um erro na abertura (meu olho já está encharcado). Eu coloquei a EA modificada em uma demonstração onde já existem posições abertas em nosso Meijic com lucro positivo total. No entanto, a posição não foi fechada.

Vejo no novo código (que está abaixo no post) o parâmetro padrão passado para a função foi alterado:

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

A versão original tinha um Magik diferente. Eu corrigi a referência a esta função em meu código. Veja sob quais ordens Magik estão abertas agora e defina este número de Magik em sua EA.

P.S. E usar codificações diferentes ao nomear variáveis não é sinal de boa forma... Quero dizer:

extern string Сomment           = "KVAZ_EURUSD_GBPUSD";
 
Roger:


Olhe para esta linha

senão se (order_type = OP_SELL()

E este aqui.

if (order_type = OP_BUY)
 
TarasBY:

Vejo no novo código (que está abaixo no post) o parâmetro padrão passado para a função foi alterado:

A versão original tinha um Magik diferente. Eu corrigi a referência a esta função em meu código. Veja sob qual Magik os pedidos estão abertos agora e coloque este número Magik em seu EA.


Não, o magik está correto, o de EURAUDUSD é 1111 e o de EURUSD_GBPUSD é 1114 (outra pessoa me ajudou a corrigi-lo). Os dois ofícios não fecham. Estou observando os lucros totais do EURUSD_GBPUSD, mas meu Conselheiro Especialista não consegue fechá-lo. Eu revisei sua versão para EURAUD_AUDUSD - 1111 para EURUSD_GBPUSD - 1114, ela ainda não fecha negócios. A característica da coruja é que eu não posso testá-la no testador (porque dois pares são negociados) - apenas em uma demonstração.
 
alexey1979621:

Não, o mago está correto, o de EURAUD_AUDUSD é 1111 e o de EURUSD_GBPUSD é 1114 (outra pessoa me ajudou a corrigi-lo). Os dois ofícios não fecham. Estou observando os lucros totais do EURUSD_GBPUSD, mas meu Conselheiro Especialista não consegue fechá-lo. Eu revisei sua versão para EURAUD_AUDUSD - 1111 para EURUSD_GBPUSD - 1114, ela ainda não fecha negócios. A característica da coruja é que você não pode testá-la no testador (porque dois pares são negociados) - apenas em uma demonstração.


Vamos fazer algumas mudanças. Em vez de

if(prof>=Profit)
   {
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;

       OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
         }
      }   
   }

colocar

Comment("Profit = ",prof);
if(prof>=Profit)
   {
Print("Profit is good!");
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;
       Print("OrderTicket - ",OrderTicket()," price - ",price);
       if(!OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE))Print ("Error - ",GetLastError());
         }
      }   
   }
executar a EA, fixar o lucro em zero e ver o que saiu e o que está nos registros.
 
Roger:


Olhe para esta linha

senão se (order_type = OP_SELL()


obrigado!)
 
alexey1979621:

Não de acordo com o majik tudo está correto, o para EURAUD_AUDUSD é 1111 e o para EURUSD_GBPUSD é 1114 (outra pessoa ajudou a consertá-lo). Os dois ofícios não fecham. Estou observando os lucros totais do EURUSD_GBPUSD, mas meu Conselheiro Especialista não consegue fechá-lo. Eu revisei sua versão para EURAUD_AUDUSD - 1111 para EURUSD_GBPUSD - 1114, ela ainda não fecha negócios. A característica da coruja é que eu não posso testá-la no testador (porque dois pares são negociados) - apenas em uma demonstração.

Primeiramente, você não está abordando o indicador corretamente. Este indicador tem uma série de parâmetros externos:

extern string Symbol1.Name      = "EURUSD";// Название инструмента 1
extern bool   Symbol1.Reverse   = false;   // Является ли инструмент 1 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string Symbol2.Name      = "USDCHF";// Название инструмента 2
extern bool   Symbol2.Reverse   = false;   // Является ли инструмент 2 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string  ___MISC___       = " == Прочие настройки ==========";
extern bool   UseVolatility     = True ;   //отрисовка с учетом волатильности
extern bool   Triangle          = True ;   // Рисовать треугольник?
extern color  Triangle.Color    = DarkSalmon; // Цвет треугольника
extern double Alert.ChannelMore = EMPTY;   // Если ширина канала больше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern double Alert.ChannelLess = EMPTY;   // Если ширина канала меньше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern string  __VOL___         = " == Расчет объемов ====";
extern int VOL.Mode             = 3;       // Режим расчета объемов для торговли
                                           //   1 - по ценам открытия
                                           //   2 - по волатильности, а если невозможно - по ценам открытия
                                           //   3 - по волатильности (если возможно) и ценам открытия
extern int VOL.PeriodATR        = 144;            // Период усреднения ATR 
extern string  ___MA___         = " == Параметры МА ценовых линий ====";

extern int MA.Slow              = 21;      // Период медленной МА
extern int MA.Fast              = 8;       // Период быстрой МА
extern int MA.Method            = 2;       // Метод аппроксимации
                                           // - MODE_SMA=0 Простое скользящее среднее 
                                           // - MODE_EMA=1 Экспоненциальное скользящее среднее 
                                           // - MODE_SMMA=2 Сглаженное скользящее среднее 
                                           // - MODE_LWMA=3 Линейно-взвешенное скользящее среднее 
extern int MA.Price             = 6;       // Расчетная цена:
                                           // - PRICE_CLOSE=0 Цена закрытия 
                                           // - PRICE_OPEN=1 Цена открытия 
                                           // - PRICE_HIGH=2 Максимальная цена 
                                           // - PRICE_LOW=3 Минимальная цена 
                                           // - PRICE_MEDIAN=4 Средняя цена, (high+low)/2 
                                           // - PRICE_TYPICAL=5 Типичная цена, (high+low+close)/3 
                                           // - PRICE_WEIGHTED=6 Взвешенная цена закрытия, (high+low+close+close)/4 

e eles precisam ser listados quando você chama o indicador. Se você os omitir, os parâmetros serão tomados por padrão, e como você deseja utilizá-los para diferentes pares de moedas, esta opção não é adequada. E tudo o mais pode ser feito levando em conta as mudanças de parâmetros no início da EA:

extern string Symbol_1 = "EURAUD";
extern string Symbol_2 = "AUDUSD";
extern double Lot_1=0.01;
extern double Lot_2=0.01;
extern double Profit=10;
extern string EXP_Comment           = "KVAZ_";
extern int    Magic                 = 1111;

string gsa_SMB[2];
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  gsa_SMB[0] = Symbol_1;
  gsa_SMB[1] = Symbol_2;
  EXP_Comment = StringConcatenate (EXP_Comment, Symbol_1, "_", Symbol_2);
   return (0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
    int    li_N;
    double prof = 0., ld_Price = 0.;

    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        OrderSelect (i, SELECT_BY_POS);
        li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
        if (li_N < 0) continue;
        if (OrderMagicNumber() != Magic) continue;
        prof += OrderProfit();
        Print ("Profit=", prof);
    }
    if (prof >= Profit)
    {
        for (i = OrdersTotal() - 1; i >= 0; i--)
        {
            OrderSelect (i, SELECT_BY_POS);
            li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
            if (li_N < 0) continue;
            if (OrderMagicNumber() != Magic) continue;
            if (OrderType() == OP_BUY) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_BID);
            else if (OrderType() == OP_SELL) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_ASK);
            OrderClose (OrderTicket(), OrderLots(), ld_Price, 5);
        }
    }
    double lda_Price[2],
           Line_1 = iCustom (Symbol(), 0, "Ind_2 Line+1", 0, 1), // Первый инструмент
           Line_2 = iCustom (Symbol(), 0, "Ind_2 Line+1", 1, 1); // Второй инструмент

    if (NumberOfPositions (gsa_SMB[0], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[0], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[0], MODE_ASK);
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[0], OP_SELL, Lot_1, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[0], OP_BUY, Lot_1, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
    }
    if (NumberOfPositions (gsa_SMB[1], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[1], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[1], MODE_ASK);
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[1], OP_BUY, Lot_2, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[1], OP_SELL, Lot_2, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
    }
    return (0);
}
//+------------------------------------------------------------------+
int fGet_NumSymbol (string fs_Symbol, string ar_SMB[])
{
    for (int li_IND = 0; li_IND < 2; li_IND++)
    {if (fs_Symbol == ar_SMB[li_IND]) return (li_IND);}
    return (-1);
}
//+------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=1111)
{
  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);
}
//+------------------------------------------------------------------+

Leia sobre a chamada indicadora aqui.

 
Roger:


Vamos fazer algumas mudanças. Em vez de

colocar

executar a EA, fixar o lucro em zero e ver o que saiu e o que está nos registros.


O resultado é feio. Com suas mudanças e lucro igual a 0, o Expert Advisor fechou todas as posições em Meijic 1111, 1112, 1113, 1114, 1115. Então, após 5 segundos, novas ordens para estes símbolos Meijic foram abertas e após 10 segundos, todos eles foram fechados e a mesma coisa aconteceu novamente. As posições não foram abertas em pares, mas caóticamente.
 
alexey1979621:

Isto se revelou assustador. Com suas mudanças e lucro igual a 0, a EA fechou todas as posições no Majic 1111, 1112, 1113, 1114, 1115 em todos os casos. Então, após 5 segundos, novas ordens para estes símbolos Meijic foram abertas e após 10 segundos, todos eles foram fechados e a mesma coisa aconteceu novamente. As posições não foram abertas em pares, mas caóticamente.


Minha pergunta orientadora é: quantos EAs você tem nesta conta?

E você tinha uma condição - fechar todos os pedidos com lucro.

PS Você já viu a armadilha que tem com esta EA - ela continuará abrindo ordens após o fechamento, o que eventualmente levará a uma perda. Portanto, é preciso colocar uma bandeira proibindo a colocação de novos pedidos até que as condições passem e surjam novamente.

 
TarasBY:

Primeiramente, você não está abordando o indicador corretamente. Este indicador tem uma série de parâmetros externos:

e eles precisam ser listados quando você chama o indicador. Se você os omitir, os parâmetros serão tomados por padrão, e como você deseja utilizá-los para diferentes pares de moedas, esta opção não é adequada. E tudo mais pode ser feito considerando as mudanças de parâmetros no início da EA:

Você pode ler sobre como chamar o indicador aqui.

Obrigado. Eu sei sobre a chamada do indicador. Mas os parâmetros ajustáveis do indicador devem ser listados quando os aplicamos em testes ou em operação. Como este EA não pode ser testado no testador (porque dois pares são negociados), é impossível escolher estes parâmetros no histórico. Sua última variante já foi implementada em uma demonstração. Vou ver como as negociações serão fechadas. Outra pequena pergunta, para dois instrumentos, o que devemos fazer se precisamos de um para abrir em Vender para um instrumento e em Comprar para outro? Eu já dei uma olhada, sem sorte ..... Mais uma vez, muito obrigado por seu trabalho árduo.
 
Roger:


Uma pergunta orientadora - quantos EAs você tem nesta conta?

E você tinha uma condição - fechar todos os pedidos com lucro.

PS Você já viu a armadilha que tem com esta EA - ela continuará abrindo ordens após o fechamento, o que eventualmente levará a uma perda. Portanto, é preciso colocar uma bandeira proibindo a colocação de novos pedidos até que as condições passem e surjam novamente.


Os Conselheiros Especialistas trabalharam para 5 (irmãos gêmeos - para diferentes pares), é claro, com diferentes Meijic.


Sim, tínhamos a condição de lucro para fechar as encomendas, mas as encomendas estavam relacionadas a uma certa EA, por exemplo, com MAJIC 1114. Escrevi sobre isso desde o início e acreditei que a coruja não vê suas próprias ordens no fechamento; acontece que ela vê todas as ordens e quer muito fechá-las, mas não precisamos de todas elas, mas de algumas específicas.

Se tomarmos o período H4, quando as linhas indicadoras são superiores a 0,1 e inferiores a -0,1, a condição é satisfeita e os negócios são abertos, ou seja, é possível obter vários lucros em um único sinal (embora haja a opção de fechar negócios quando as linhas indicadoras convergem).