[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 832

 
Vinin:

O que vai mudar na próxima vez?
A mesma coisa. Uma posição é fechada - uma ordem pendente é estabelecida, etc. Há uma função que retorna o último valor (por exemplo, OrderCloseTime()). A cada tique, recebo o valor de tempo da última posição fechada (digamos, posição nº 1). Ao fechar a próxima posição (posição nº 2) com um novo tique, tenho tempo para fechar esta posição (nº 2). O valor OrderCloseTime() foi alterado em relação ao anterior. E assim por diante. Não importa como ou quanto a variável tenha mudado. O que me interessa é o próprio fato de a variável ter mudado. É como uma operação lógica: Se o OrderCloseTime() da última posição fechada for maior que o OrderCloseTime() da penúltima, então devemos fazer BLA-BLA-BLA. Também - se o OrderClosePrice() da última posição fechada não for igual ao OrderClosePrice() da penúltima, então faça um BLA-BLA-BLA-BLA. Ou talvez não seja possível fazer tal comparação?
 
Aqui está a questão. Suponha, por exemplo, que nosso EA mostra um sinal de compra quando o indicador (por exemplo, tomei CCI) cruza algum nível (a linha vermelha) de baixo para cima, e um sinal de venda quando ele, respectivamente, desce. Como devemos fazer para que o pedido seja aberto apenas uma vez durante a formação do bar A? Suponha que o indicador cruze o nível (a linha vermelha) para baixo e para cima várias vezes durante a formação da barra A. Como já mencionei, devemos fazer com que o pedido seja aberto apenas uma vez.

O que eu preciso é que o sinal de venda seja recebido no bar D (situação 2 no gráfico) para não fechar o pedido aberto no bar A , e não ser afetado de forma alguma.

Isto é, as ordens não são controladas pelo Consultor Especialista após serem abertas.


Agradecemos antecipadamente.

 

Ajude-me a anexar um pedaço de código Sequent Demarque à EA https://www.mql5.com/ru/code/7372

não funciona assim:

num=0:

for(i=bars; i>=0; i--)
{
if ((iClose(NULL,PERÍODO_M5,i+1)<iClose(NULL,PERÍODO_M5,i+4) && num!=0 )) {
num+++;


if ((iClose(NULL,PERÍODO_M5,i+1)<iClose(NULL,PERÍODO_M5,i+4))
comprar.......

se (num===9)
fechar........

 
Vinin:


1. Contar o número de pedidos do primeiro tipo

2. Contar o número de pedidos do tipo 2

3. Compare os resultados


Prezado Vinin. Muito obrigado!
 
Forrim:
Aqui está a questão. Vamos supor que o sinal de compra no EA é gerado quando o indicador (por exemplo, tomei CCI) cruza algum nível (linha vermelha) de baixo para cima, enquanto o sinal de venda é gerado, respectivamente, quando é de cima para baixo. Como devemos fazer para que o pedido seja aberto apenas uma vez durante a formação do bar A? Suponha que o indicador cruze o nível (a linha vermelha) para baixo e para cima várias vezes durante a formação da barra A. Como já mencionei, devemos fazer com que um pedido seja aberto apenas uma vez.

Isto exige que em um sinal de venda a ser recebido no bar D (situação 2 no gráfico) o pedido aberto no bar A não deve ser fechado e não deve ser afetado de forma alguma.

Ou seja, as ordens não são controladas pela EA após serem abertas.


Muito obrigado de antemão.

Na verdade, a CCI salta de tal forma que é melhor verificarmos depois que o bar foi fechado e um novo foi aberto.

Se quisermos verificar se o tempo de abertura de uma vela é diferente (se for, a ordem abre) ou é a mesma (=> nenhuma ordem abre), então a cada travessia devemos armazenar o tempo de abertura na variável global.

 
Forrim:
Aqui está a questão. Suponha, por exemplo, que nosso EA mostra um sinal de compra quando o indicador (por exemplo, tomei CCI) cruza algum nível (a linha vermelha) de baixo para cima, e um sinal de venda quando, respectivamente, ele desce. Como devemos fazer para que o pedido seja aberto apenas uma vez durante a formação do bar A? Suponha que o indicador cruze o nível (a linha vermelha) para baixo e para cima várias vezes durante a formação da barra A. Como já mencionei, devemos fazer com que o pedido seja aberto apenas uma vez.

O que precisamos é que o sinal de venda seja recebido na barra D (situação 2 no gráfico) para não fechar o pedido aberto na barra A , e para não ser afetado de nenhuma forma.

Isto é, as ordens não são controladas pelo Consultor Especialista após serem abertas.


Agradecemos antecipadamente.

Se uma posição deste tipo já estiver aberta, não abra mais.
 
//--------------------------------------------------------------- 1 --
                                   // Численные значения для М15
extern double StopLoss   =20;      // SL для открываемого ордера
extern double TakeProfit =20;      // ТР для открываемого ордера
extern double Step_Sar=0.02;       // Шаг Sar
extern double Maximum_Sar=0.2;     // Максимум Sar
extern double Lot=0.01;            // Жестко заданное колич. лотов
bool Work=true;                    // Эксперт будет работать.
//--------------------------------------------------------------- 2 --
int start()
  { 
   int   
   Total,                           // Количество ордеров в окне 

   Ticket;                          // Номер ордера
   
   double
   Sar_1 ,                          // Значен. Sar текущее
   Sar_0 ,                          // Значение Sar предыдущей свечки      
   Price,                           // Цена ордера
   SL,                              // SL ордера 
   TP;                              // TP ордера
   
   bool
   Ans  =false,                     // Ответ сервера после закрытия
   Cls_B=false,                     // Критерий для закрытия  Buy
   Cls_S=false,                     // Критерий для закрытия  Sell
   Opn_B=false,                     // Критерий для открытия  Buy
   Opn_S=false;                     // Критерий для открытия  Sell
   
//--------------------------------------------------------------- 3 --   
   // Учёт ордеров   

   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symbol())continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return;                             // Выход из start()
           }

   
     
       
        
    
         
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
         }
         }
   
//--------------------------------------------------------------- 6 --
   // Торговые критерии
   Sar_1=iSAR(NULL, 0, 0.02, 0.2, 1);           // Sar_1
   Sar_0=iSAR(NULL, 0, 0.02, 0.2, 0);           // Sar_0
 
   if (Sar_0 > Price && Sar_1 < Price)          // если Sar меняет положение
     {
      Opn_B=true;                               // Критерий откр. Buy             
     }  
   if (Sar_0 < Price && Sar_1 > Price)          // если Sar меняет положение
     {                                          
      Opn_S=true;                               // Критерий откр. Sell                                   
     }   
//--------------------------------------------------------------- 7 --
  
     {
      if (Opn_B==true)         
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         SL=(20+Ask-Bid)*Bid;                 // Вычисление SL откр.
         TP=20*Bid;                           // Вычисление TP откр.
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,0,SL,TP);//Открытие Buy                         
        }
        if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                                   
         return;                                // Выход из start()
        
        
      if (Opn_S==true)                          // критерий откр. Sell
      
        {                                       // критерий откр. Sell
         RefreshRates();                        // Обновление данных
         SL=(20+Ask-Bid)*Ask;                 // Вычисление SL откр.
         TP=20*Ask;                           // Вычисление TP откр.
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,0,SL,TP);//Открытие Sel
         
         return;                                // Выход из start()
        }
        
      if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                      
         return;                                // Выход из start()
        
     }
//--------------------------------------------------------------- 9 --
   return;                                      // Выход из start()
  }
//-------------------------------------------------------------- 10 --
int Fun_Error(int Error)                        // Ф-ия обработ ошибок
  {
   switch(Error)
     {                                          // Преодолимые ошибки            
      case  4: Alert("Торговый сервер занят. Пробуем ещё раз..");
         Sleep(3000);                           // Простое решение
         return(1);                             // Выход из функции
      case 135:Alert("Цена изменилась. Пробуем ещё раз..");
         RefreshRates();                        // Обновим данные
         return(1);                             // Выход из функции
      case 136:Alert("Нет цен. Ждём новый тик..");
         while(RefreshRates()==false)           // До нового тика
            Sleep(1);                           // Задержка в цикле
         return(1);                             // Выход из функции
      case 137:Alert("Брокер занят. Пробуем ещё раз..");
         Sleep(3000);                           // Простое решение
         return(1);                             // Выход из функции
      case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
         Sleep(500);                            // Простое решение
         return(1);                             // Выход из функции
         // Критические ошибки
      case  2: Alert("Общая ошибка.");
         return(0);                             // Выход из функции
      case  5: Alert("Старая версия терминала.");
         Work=false;                            // Больше не работать
         return(0);                             // Выход из функции
      case 64: Alert("Счет заблокирован.");
         Work=false;                            // Больше не работать
         return(0);                             // Выход из функции
      case 133:Alert("Торговля запрещена.");
         return(0);                             // Выход из функции
      case 134:Alert("Недостаточно денег для совершения операции.");
         return(0);                             // Выход из функции
      default: Alert("Возникла ошибка ",Error); // Другие варианты   
         return(0);                             // Выход из функции
     }
  }
//-------------------------------------------------------------- 11 --

EA elementar, deve abrir uma posição quando o indicador Parabólico SAR muda em relação à tabela de preços, trabalha em M15, SL e TP são sempre constantes para posição aberta.

A EA compara as posições indicadoras dos castiçais atuais e dos anteriores.

Não há erros ou bugs durante a compilação, no teste na guia "resultados" "gráfico" "relatório" está vazio, no log é este: "imagem".

Estou codificando para o segundo dia, nunca codifiquei antes, li meus livros de mql e procurei na internet por meu problema. Estou em um impasse, por favor, ajude-me se puder.


 

T.H.C. tente isto




Arquivos anexados:
0000001_1.mq4  3 kb
 
Techno:

T.H.C. Tente isto.




Muito obrigado, não esperava uma resposta tão rápida e uma mudança tão grande no código.

Aconselhar sobre outros livros de programação além do mql básico

 
T.H.C.:

Muito obrigado, eu não esperava tal rapidez e mudanças no código.

Favor aconselhar mais livros sobre programação, além de mql básico.

Eu só li a base, você precisa de mais prática para ter uma boa compreensão do assunto.
Razão: