[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 335

 
borilunad:
Entonces, ¡investiga en tu propia casa! Tienes una función para cada palabra de tu código, y tienes que arreglártelas con variables. Eso es lo que hace que el código sea pesado. Hay que usar las funciones cuando no se puede prescindir de ellas! He comentado todo lo que no necesito en el código de Kim, y todo funciona muy rápido! Recuerden que les pregunté a todos cómo hacer que el programa funcione más rápido bajo muchas condiciones. ¡Ahora las pruebas se ejecutan durante un año en todas las garrapatas en 5 minutos! Revisé todas las condiciones y funciones y deseché todo lo innecesario.

Por supuesto que lo recuerdo. Lo mantendré durante un tiempo. De hecho, necesito cambiar mis hábitos. No es el primer programador que dice que mi código no es fácil de entender. Aparentemente es...
 
borilunad:
¡Así que cava en tu propio lugar! Tienes una función para cada palabra de tu código, y tienes que arreglártelas con variables. Por eso tu código es pesado. Hay que usar las funciones cuando no se puede prescindir de ellas! He comentado todo lo que no necesito en el código de Kim, y todo funciona muy rápido! Recuerden que les pregunté a todos cómo hacer que el programa funcione más rápido bajo muchas condiciones. ¡Ahora las pruebas se ejecutan durante un año en todas las garrapatas en 5 minutos! Revisé todas las condiciones y funciones y deseché todo lo innecesario.

Sólo se puede prescindir de las variables si probamos la estrategia en el probador.

Para el real, cada valor necesario para ejecutar la lógica debe ser calculado en el momento justo, porque los valores de estas variables son muy fáciles de perder, por ejemplo durante un reinicio.

 

Buenos días a todos.

Ya he descubierto cómo escribir los índices, pero tengo problemas con el primer robot. Parece lógico, el compilador no se queja, el diario no tiene errores, pero el Asesor Experto en el probador no funciona - el gráfico se abre, pero no hay movimiento en este gráfico (el gráfico no se mueve).

La idea es la siguiente: El indicador produce un punto (siempre en la apertura y el precio de apertura de la vela) a partir del cual comprar o vender, la tarea del robot al mismo tiempo, después de recibir un punto para comprar o vender, cerrar la orden opuesta, abrir una nueva o modificar una orden antigua en la misma dirección (las paradas y TP son emitidos por otro indicador)

Les agradecería mucho que me indicaran dónde está el error.

El código en sí mismo (se han cambiado los nombres de los índices según su funcionalidad, se ha eliminado la declaración de variables y la sección de gestión de errores):

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

   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);

La esencia del problema es la siguiente: no está claro qué poner entre corchetes en el cuerpo de los operadores #1,2 de hecho se comprueba el cumplimiento de las condiciones comerciales y no hay más acciones.

(Hay cuatro señales de negociación, la número 1 se dispara, pasamos el control a la señal de procesamiento número 2, la número 2 se dispara, la pasamos a las señales de procesamiento número 3 y 4 y realizamos allí las operaciones de negociación).

  else
         return(0);

¿Vale la pena añadirlo al final? Lógicamente, si las señales #3,4 no se activan, entonces necesito que el Asesor Experto comience de nuevo.

 
artmedia70:

Las variables sólo se pueden utilizar al probar la estrategia en el probador.

En el mundo real, cada valor necesario para ejecutar la lógica debe calcularse en el momento adecuado, ya que los valores de estas variables son muy fáciles de perder, por ejemplo, durante un reinicio.

Pero, ¿se pierden las variables escritas en el extern? Nunca ha ocurrido. ¡Pero todas las condiciones están delante de mis ojos y a mano en start(), y las funciones, que están fuera de start(), tienen comprobaciones y acciones finales no modificables! Puede que me equivoque en gran medida, pero hasta ahora me siento cómodo así, ¡y todavía no he recibido ni un solo error ni rakeback en Real! Siempre leo con atención tus posts, Artem, y otros programadores experimentados como alsu, Meat y otros, así como los moderadores invitados. Pero no todo está aún dentro de mis posibilidades, así que no puedo aplicar lo que aún no tengo claro hasta el más mínimo detalle. ¡gracias por todo!
 
barma:

Buenos días a todos.

Ya he descubierto cómo escribir los índices, pero tengo problemas con el primer robot. Parece lógico, el compilador no se queja, el diario no tiene errores, pero el Asesor Experto en el probador no funciona - el gráfico se abre, pero no hay movimiento en este gráfico (el gráfico no se mueve).

La idea es la siguiente: El indicador produce un punto (siempre en la apertura y el precio de apertura de la vela) a partir del cual comprar o vender, la tarea del robot al mismo tiempo, después de recibir un punto para comprar o vender, cerrar la orden opuesta, abrir una nueva o modificar una orden antigua en la misma dirección (las paradas y TP son emitidos por otro indicador)

Les agradecería mucho que me indicaran dónde está el error.

El código en sí mismo (se han cambiado los nombres de los índices según su funcionalidad, se ha eliminado la declaración de variables y la sección de gestión de errores):

Si ha sustituido los nombres de los indicadores sólo en el EA, y no también en los propios códigos de los indicadores, que se muestran en las ventanas correspondientes en los gráficos, entonces el EA no recibirá nada de ellos, y el error no se da, porque todo se presenta en el EA, pero no recibe señales de los indicadores. Comprueba si los nombres de los indicadores se escriben igual.
 
borilunad:
Si ha cambiado los nombres de los indicadores sólo en el EA, y no en los códigos de los indicadores mismos, que se muestran en las ventanas correspondientes en los gráficos, entonces el EA no recibirá nada de ellos y no dará un error, porque todo se presenta en el EA, pero no recibe señales de los indicadores. Comprueba si los nombres de los indicadores se escriben igual.

Gracias por el consejo, he comprobado todo una vez más, no hay errores en la escritura. Sólo he cambiado los nombres de los indicadores en el texto del primer mensaje en el foro, con el fin de hacer su tarea clara, en el texto del Asesor Experto los nombres de los índices se escriben exactamente como se nombran en la carpeta "indicadores". Por ejemplo: "3.0_figuri_2.3_rasshirenie".

Además, he seleccionado otro EA (del tutorial) y he introducido los nombres de indicadores no existentes en la función iCustom. Lo que sucedió fue lo siguiente - el EA realmente dejó de operar (lo cual es, por cierto, comprensible), pero cuando inicio el probador, el gráfico se movía desde la fecha de inicio establecida hasta la fecha de finalización establecida, debo recordar que mi problema es que el gráfico no se mueve.

¿Quizá alguien más se ha enfrentado a este problema?

 
barma:

Gracias por el consejo, he comprobado todo una vez más, no hay errores en la escritura. Sólo he cambiado los nombres de los indicadores en el texto del primer mensaje en el foro, con el fin de hacer su tarea clara, en el texto del Asesor Experto los nombres de los índices se escriben exactamente como se nombran en la carpeta "indicadores". Por ejemplo: "3.0_figuri_2.3_rasshirenie".

Además, he seleccionado otro EA (del tutorial) y he introducido los nombres de indicadores no existentes en la función iCustom. Lo que sucedió fue lo siguiente - el EA realmente dejó de operar (lo cual es, por cierto, comprensible), pero cuando inicio el probador, el gráfico se movía desde la fecha de inicio establecida hasta la fecha de finalización establecida, debo recordar que el problema es que el gráfico no se mueve.

Tal vez alguien más tuvo ese problema.

¡Compruebe el nombre del indicador, no en la carpeta, sino en su código: "nombre corto", porque por él el Asesor Experto lo reconoce, si todavía está instalado en el gráfico apropiado y el TF!
 
Para que el indicador dibuje algo en el probador, debe estar instalado en el gráfico, el propio EA no dibujará líneas.
 
barma:

Gracias por el consejo, he revisado todo una vez más, no hay errores en la escritura. Sólo he cambiado los nombres de los indicadores en el texto del primer mensaje en el foro, con el fin de hacer su tarea clara, en el texto del Asesor Experto los nombres de los índices se escriben exactamente como se nombran en la carpeta "indicadores". Por ejemplo: "3.0_figuri_2.3_rasshirenie".

Además, he seleccionado otro EA (del tutorial) y he introducido los nombres de indicadores no existentes en la función iCustom. Lo que sucedió fue lo siguiente - el EA realmente dejó de operar (lo cual es, por cierto, comprensible), pero cuando inicio el probador, el gráfico se movía desde la fecha de inicio establecida hasta la fecha de finalización establecida, debo recordar que el problema es que el gráfico no se mueve.

¿Tal vez alguien más tuvo ese problema?

Fin de semana en las oficinas, por lo que el gráfico no se mueve.