[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 335

 
borilunad:
Então faça algumas escavações em seu próprio lugar! Você tem uma função para cada palavra de seu código, e você tem que se contentar com variáveis. Isso é o que torna o código pesado. Você deve usar funções quando não pode passar sem elas! Eu comentei tudo no código de Kim que eu não preciso, e tudo funciona muito rápido! Lembre-se, eu perguntei a todos como fazer o programa funcionar mais rápido sob muitas condições. Agora os testes funcionam por um ano em todos os carrapatos em 5 minutos! Passei a pente fino todas as condições e funções e joguei fora tudo o que era desnecessário.

É claro que eu me lembro. Vou continuar assim por um tempo. De fato, eu preciso mudar meus hábitos. Não é o primeiro programador a dizer que meu código não é fácil de entender. Aparentemente, é...
 
borilunad:
Então cava em seu próprio lugar! Você tem uma função para cada palavra de seu código, e você tem que se contentar com variáveis. É por isso que seu código é pesado. Você deve usar funções quando não pode passar sem elas! Eu comentei tudo no código de Kim que eu não preciso, e tudo funciona muito rápido! Lembre-se, eu perguntei a todos como fazer o programa funcionar mais rápido sob muitas condições. Agora os testes funcionam por um ano em todos os carrapatos em 5 minutos! Passei a pente fino todas as condições e funções e joguei fora tudo o que era desnecessário.

As variáveis só podem ser dispensadas se testarmos a estratégia no testador.

Para o real, todo valor necessário para executar a lógica deve ser calculado no momento certo, pois os valores destas variáveis são muito fáceis de perder, por exemplo, durante um reinício.

 

Bom dia a todos vocês.

Eu já descobri como escrever índices, mas tenho problemas com o primeiro robô. Parece lógico, o compilador não reclama, a revista não tem erros, mas o consultor especializado no testador não funciona - o gráfico se abre, mas não há movimento neste gráfico (o gráfico não se move).

A idéia é a seguinte: O indicador produz um ponto (sempre na abertura e no preço de abertura da vela) a partir do qual comprar ou vender, a tarefa do robô ao mesmo tempo, após receber um ponto para comprar ou vender, fechar a ordem oposta, abrir uma ordem nova ou modificar uma ordem antiga na mesma direção (as paradas e TP são emitidas por outro indicador)

Ficar-lhe-ia muito grato por dicas de onde está errado.

O código em si (mudou os nomes dos índices de acordo com sua funcionalidade, removeu a declaração das variáveis e a seção de tratamento de erros):

   // Предварит.обработка

   if(High[0]!=Low[0]) return; //если бар открылся до поступления текущей котировки, выход из start

       vverh = iCustom(NULL,0,"Индикатор дающий точку на покупку",Glubina,Pogreshnost,0,0);   //значение индикатора на покупку
       vniz  = iCustom(NULL,0,"Индикатор дающий точку на продажу",Glubina,Pogreshnost,1,0);   //значение индикатора на продажу
       
   if(vverh==0 && vniz==0)
     {
      Alert("Сигнала нет. Эксперт ждёт сигнал.");
      return;
     }
   if(Bars < Glubina)                       // Недостаточно баров
     {
      Alert("Недостаточно баров в окне. Эксперт не работает.");
      return;                                   // Выход из start()
     }
   if(Work==false)                              // Критическая ошибка
     {
      Alert("Критическая ошибка. Эксперт не работает.");
      return;                                   // Выход из start()
     }

//--------------------------------------------------------------- 4 --
   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(i=1; i<=OrdersTotal(); i++)              // Цикл перебора ордеров
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderMagicNumber()!=MagicNumber)   // Попался ордер открытый не советником
            continue;
            
         Total++;                               // Счётчик ордеров открытых советником
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько ордеров одного советника. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
//--------------------------------------------------------------- 5 --
// торговые критерии
if(vverh>0)
  {
   Opn_B=true;
   Cls_S=true;
   Opn_S=false;
   Cls_B=false;
  }
if(vverh>0)
  {
   Opn_S=true;
   Cls_B=true;
   Opn_B=false;
   Cls_S=false;
  }
  
//--------------------------------------------------------------- 6 --
   
   //расчет стопов
   i_stop=0;
   while (stopov_for_S<2)                                                        //ищем 2 последних точки стопа в индикаторе, выбираем изз них самую дальнюю от текущей цены
         {
          for_S = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,0,i_stop);
          if (for_S>0)
             {
              stopov_for_S++;
              if(Stop_for_S<for_S) Stop_for_S=for_S;
             }
          i_stop++;
         }
   i_stop=0;
   while (stopov_for_B<2)
         {
          for_B = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,1,i_stop);
          if (for_B>0)
             {
              stopov_for_B++;
              if(Stop_for_B<for_B) Stop_for_B=for_B;
             }
          i_stop++;
         }
SL_for_B = Stop_for_B-pogreshnostSL;
SL_for_S = Stop_for_S+pogreshnostSL;
TP_for_B=vverh+(vverh-Stop_for_B)*koeff_dvizheniya;
TP_for_S=vniz-(Stop_for_S-vniz)*koeff_dvizheniya;


   // Закрытие и модификация ордеров
   while(true)                                  // Цикл закрытия и модификации орд.
     {
      if (Tip==0 && Opn_B==true)                // Если открыт ордер БАЙ и индикатор дает сигнал на покупку
             {
              OrderModify(Ticket,SL_for_B,TP_for_B,0,CLR_NONE); //меняем стопы текущего ордера бай
              break;
             }
      if (Tip==0 && Opn_S==true)                // Если открыт ордер БАЙ и индикатор дает сигнал на продажу
             {
              RefreshRates();
              Ans=OrderClose(Ticket,Lot,Bid,50);        // закрываем БАЙ
                 if (Ans==true)                         // Получилось :)
                    {
                     Alert ("Закрыт ордер Buy ",Ticket);
                     break;                             // Выход из цикла закр
                    }
                 if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                     continue;                          // Повторная попытка
             }
      
      if (Tip==1 && Opn_S==true)
             {
              OrderModify(Ticket,SL_for_S,TP_for_S,0,CLR_NONE);
              break;
             }
      if (Tip==1 && Opn_B==true)
             {
              RefreshRates();
              Ans=OrderClose(Ticket,Lot,Ask,50);
                 if (Ans==true)                         // Получилось :)
                    {
                     Alert ("Закрыт ордер Sell ",Ticket);
                     break;                             // Выход из цикла закр
                    }
                 if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                     continue;                          // Повторная попытка
             }
     }
//--------------------------------------------------------------- 7 --
   // Стоимость ордеров
   RefreshRates();                              // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера

   if (Lots > 0)                                // Если заданы лоты,то 
      Lts =Lots;                                // с ними и работаем 
   else                                         // % свободных средств
      Lts=MathFloor(Free*Prots/One_Lot/Step )*Step;// Для открытия

   if(Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                      // Лот дороже свободн.
     {
      Alert(" Не хватает денег на ", Lts," лотов");
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------- 8 --
   // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      Ticket=0;
      if (Opn_B==true)                          // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,50,SL_for_B,TP_for_B,"My order #",MagicNumber,0,CLR_NONE);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                            // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
        
      if (Opn_S==true)                          // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,50,SL_for_S,TP_for_S,"My order #",MagicNumber,0,CLR_NONE);//Открытие Sell
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                            // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
     }
//--------------------------------------------------------------- 9 --
   return;                                      // Выход из start()
  }

 
If (торговые условия сигнал №1)
  {
  }//   Какой код нужен, чтобы тело оператора №1 в случае соответствия, передало управление к оператору  «торговых       условий №2»    

If (торговые условия сигнал №2)
  {
  }// Какой код нужен, чтобы тело оператора №2 в случае соответствия, передало управление к оператору «торговых       условий №3 и №4»    

If (торговые условия сигнал №3)
  {                                          
   Opn_B=true;                            
   }
   else
If (торговые условия сигнал №4)
  {                                          
   Opn_S=true;                            
   }
     else
         return(0);

A essência do problema é a seguinte: não está claro o que colocar entre parênteses no corpo dos operadores nº 1,2, de fato, é verificada a conformidade das condições comerciais e não há mais ações.

(Há quatro sinais comerciais, disparadores número 1, passamos o controle para os sinais de processamento número 2, disparadores número 2, passamos para os sinais de processamento número 3 e 4 e realizamos operações comerciais lá).

  else
         return(0);

Vale a pena adicioná-lo ao final? Logicamente, se os sinais #3,4 não acionarem, então preciso que o Expert Advisor comece novamente.

 
artmedia70:

As variáveis só podem ser usadas quando se testa a estratégia no testador.

Para o mundo real, todo valor necessário para executar a lógica deve ser calculado no momento certo, porque os valores destas variáveis são muito fáceis de perder, por exemplo, durante um reinício.

Mas será que as variáveis escritas no exterior se perdem? Isso nunca aconteceu! Mas todas as condições estão diante de meus olhos e em mãos no início(), e as funções, que estão fora do início(), têm verificações e ações finais não modificáveis! Posso estar errado, mas até agora estou confortável desta forma, e ainda não recebi um único erro ou rakeback no Real! Eu sempre leio cuidadosamente seus posts, Artem, e outros programadores experientes como alsu, Meat e outros, assim como moderadores convidados! Mas nem tudo ainda está dentro das minhas possibilidades, então não posso aplicar o que ainda não está claro para mim ao menor detalhe. obrigado por tudo!
 
barma:

Bom dia a todos vocês.

Eu já descobri como escrever índices, mas tenho problemas com o primeiro robô. Parece lógico, o compilador não reclama, a revista não tem erros, mas o consultor especializado no testador não funciona - o gráfico se abre, mas não há movimento neste gráfico (o gráfico não se move).

A idéia é a seguinte: O indicador produz um ponto (sempre na abertura e no preço de abertura da vela) a partir do qual comprar ou vender, a tarefa do robô ao mesmo tempo, após receber um ponto para comprar ou vender, fechar a ordem oposta, abrir uma ordem nova ou modificar uma ordem antiga na mesma direção (as paradas e TP são emitidas por outro indicador)

Ficar-lhe-ia muito grato por dicas de onde está errado.

O código em si (mudou os nomes dos índices de acordo com sua funcionalidade, removeu a declaração das variáveis e a seção de tratamento de erros):

Se você tiver substituído os nomes dos indicadores apenas na EA, e não também nos próprios códigos indicadores, que são exibidos nas janelas correspondentes dos gráficos, então a EA não receberá nada deles, e o erro não é dado, porque tudo é apresentado na EA, mas não recebe sinais dos indicadores. Verifique se os nomes dos indicadores estão soletrados da mesma maneira!
 
borilunad:
Se você mudou os nomes dos indicadores somente na EA, e não nos próprios códigos dos indicadores, que são exibidos nas janelas correspondentes dos gráficos, então a EA não receberá nada deles e não dará um erro, porque tudo é apresentado na EA, mas não recebe sinais dos indicadores. Verifique se os nomes dos indicadores estão soletrados da mesma maneira!

Obrigado pela dica, eu verifiquei tudo mais uma vez, não há erros na escrita. Apenas mudei os nomes dos indicadores no texto da primeira mensagem do fórum, a fim de tornar sua tarefa clara, no texto do Conselheiro Especialista os nomes dos índices são escritos exatamente como são nomeados na pasta "indicadores". Por exemplo: "3.0_figuri_2.3_rasshirenie".

Além disso, selecionei outra EA (do tutorial) e introduzi os nomes de indicadores inexistentes na função iCustom. O que aconteceu foi o seguinte - a EA realmente parou de negociar (o que é, aliás, compreensível), mas quando eu inicio o teste, o gráfico estava se movendo da data de início estabelecida para a data final estabelecida, devo lembrar que meu problema é que o gráfico não está se movendo.

Talvez alguém mais tenha enfrentado este problema?

 
barma:

Obrigado pela dica, eu verifiquei tudo mais uma vez, não há erros na escrita. Apenas mudei os nomes dos indicadores no texto da primeira mensagem do fórum, a fim de tornar sua tarefa clara, no texto do Conselheiro Especialista os nomes dos índices são escritos exatamente como são nomeados na pasta "indicadores". Por exemplo: "3.0_figuri_2.3_rasshirenie".

Além disso, selecionei outra EA (do tutorial) e introduzi os nomes de indicadores inexistentes na função iCustom. O que aconteceu foi o seguinte - a EA realmente parou de negociar (o que é, aliás, compreensível), mas quando eu inicio o testador, o gráfico estava se movendo da data de início estabelecida para a data final estabelecida, devo lembrar que o problema é que o gráfico não está se movendo.

Talvez alguém mais tenha tido esse problema.

Verifique o nome do indicador, não na pasta, mas em seu código: "nome curto", porque por ele o Expert Advisor o reconhece, se ainda estiver instalado no gráfico apropriado e no TF!
 
Para que o indicador desenhe algo no testador, ele deve ser instalado no gráfico, a própria EA não desenhará linhas.
 
barma:

Obrigado pela dica, eu verifiquei tudo mais uma vez, não há erros na escrita. Apenas mudei os nomes dos indicadores no texto da primeira mensagem do fórum, a fim de tornar sua tarefa clara, no texto do Conselheiro Especialista os nomes dos índices são escritos exatamente como são nomeados na pasta "indicadores". Por exemplo: "3.0_figuri_2.3_rasshirenie".

Além disso, selecionei outra EA (do tutorial) e introduzi os nomes de indicadores inexistentes na função iCustom. O que aconteceu foi o seguinte - a EA realmente parou de negociar (o que é, aliás, compreensível), mas quando eu inicio o testador, o gráfico estava se movendo da data de início estabelecida para a data final estabelecida, devo lembrar que o problema é que o gráfico não está se movendo.

Talvez alguém mais tenha tido esse problema?

Fim de semana nos escritórios, para que o gráfico não se mova.
Razão: